diff --git a/config/application-devel-pg.properties b/config/application-devel-pg.properties
index 2225061..65c3151 100644
--- a/config/application-devel-pg.properties
+++ b/config/application-devel-pg.properties
@@ -29,5 +29,5 @@
 
 payapi.appid=200001
 
-cron.offlinedtl=0 0/5 * * * ?
-payapi.logintime=0 0/20 * * * ? 
\ No newline at end of file
+cron.offlinedtl= 0 0/5 * * * ?
+payapi.logintime= 0 0/20 * * * ? 
\ No newline at end of file
diff --git a/src/main/java/com/supwisdom/dlpay/api/bean/PosPayHeartBeatResp.java b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayHeartBeatResp.java
index a677346..9b140d1 100644
--- a/src/main/java/com/supwisdom/dlpay/api/bean/PosPayHeartBeatResp.java
+++ b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayHeartBeatResp.java
@@ -3,9 +3,18 @@
 public class PosPayHeartBeatResp extends APIResp {
     private Integer paragroupid;
     private Integer paraverno;
+    private Integer whitelistid;
     private String cardverno;
     private String systime;
 
+    public Integer getWhitelistid() {
+        return whitelistid;
+    }
+
+    public void setWhitelistid(Integer whitelistid) {
+        this.whitelistid = whitelistid;
+    }
+
     public Integer getParagroupid() {
         return paragroupid;
     }
diff --git a/src/main/java/com/supwisdom/dlpay/api/bean/PosPayLoginResp.java b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayLoginResp.java
index 0c28aa5..cc5d2db 100644
--- a/src/main/java/com/supwisdom/dlpay/api/bean/PosPayLoginResp.java
+++ b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayLoginResp.java
@@ -4,12 +4,21 @@
 public class PosPayLoginResp extends APIResp {
     private Integer paragroupid;
     private Integer paraverno;
+    private Integer whitelistid;
     private Integer onlineseqno;
     private Integer offlineseqno;
     private String cardverno;
     private String systime;
     private String shopname;
 
+    public Integer getWhitelistid() {
+        return whitelistid;
+    }
+
+    public void setWhitelistid(Integer whitelistid) {
+        this.whitelistid = whitelistid;
+    }
+
     public String getShopname() {
         return shopname;
     }
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 6abecf8..9e73c0e 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
@@ -26,6 +26,7 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -66,20 +67,19 @@
     private ConsumePropxy consumePropxy;
 
 
-
     @Override
     public PosPayLoginResp doLogin(PosPayLoginReq req) {
         PosPayLoginResp resp = new PosPayLoginResp();
         String sysdt = DateUtil.getNow();
 
         TDevice tDevice = deviceService.getDeviceByDevphyid(req.getDevphyid());
-        if (tDevice == null) {
-            resp.setRetcode(ErrorCode.ERRIF_POS_NOREG);
-            resp.setRetmsg("设备未注册");
+        APIResp apiResp = checkDevice(resp, tDevice);
+        if (!ErrorCode.ERRIF_OK.equals(apiResp.getRetcode())) {
+            resp.setRetcode(apiResp.getRetcode());
+            resp.setRetmsg(apiResp.getRetmsg());
             return resp;
         }
-
-        List<TShopSettlement> shoplist=shopSettlementService.getShopByShopid(tDevice.getShopid());
+        List<TShopSettlement> shoplist = shopSettlementService.getShopByShopid(tDevice.getShopid());
         if (shoplist.size() < 1) {
             resp.setRetcode(ErrorCode.ERRIF_POS_NOSHOP);
             resp.setRetmsg("设备未绑定商户");
@@ -91,19 +91,19 @@
        /* if (groupid == 0) {
             groupid = 1;
         }*/
-        TDevparaGroup group=null;
+        TDevparaGroup group = null;
         TDevparaBind bind = deviceParamService.getDevparaBindByDeviceid(tDevice.getId());
         if (null == bind) {
-            group=deviceParamService.getDefaultDevparaGroup();
-        }else{
-            group=deviceParamService.getDevparaGroupByGroupid(groupid);
+            group = deviceParamService.getDefaultDevparaGroup();
+        } else {
+            group = deviceParamService.getDevparaGroupByGroupid(bind.getGroupid());
         }
 
 
         tDevice.setRunstatus(1);
         tDevice.setLastlogintime(sysdt);
         deviceService.saveDevice(tDevice);
-        if(group.getGlobalflag()==false){
+        if (group.getGlobalflag() == false) {
             if (null == bind) {
                 bind = new TDevparaBind();
                 bind.setDeviceid(tDevice.getId());
@@ -112,6 +112,10 @@
             bind.setLastsaved(sysdt);
             devparaBindDao.save(bind);
         }
+        TWhitelistDevbind whitelistbind = whitelistService.getWhitelistDevbindByDeviceId(tDevice.getId());
+        if (null != whitelistbind) {
+            resp.setWhitelistid(whitelistbind.getWhitelistid());
+        }
         Integer onlineseqno = transDtlService.getMaxSeqnoToday(tDevice.getId(), req.getTermdate());
         resp.setCardverno(req.getCardverno());
         resp.setOnlineseqno(onlineseqno + 1);
@@ -130,57 +134,76 @@
         PosPayInitResp resp = new PosPayInitResp();
 
         TDevice tDevice = deviceService.getDeviceByDevphyid(req.getDevphyid());
-        if (tDevice == null) {
-            resp.setRetcode(ErrorCode.ERRIF_POS_NOREG);
-            resp.setRetmsg("设备不存在");
+        APIResp apiResp = checkDevice(resp, tDevice);
+        if (!ErrorCode.ERRIF_OK.equals(apiResp.getRetcode())) {
+            resp.setRetcode(apiResp.getRetcode());
+            resp.setRetmsg(apiResp.getRetmsg());
             return resp;
         }
-        TCard tCard = cardService.getCardByCardnoAndCardphyid(req.getCardno(), req.getCardphyid());
+        String cardno;
+        String cardphyid;
+
+        if (RestaurantConstant.TRANSMODE_CODE.equals(req.getTranstype())) {
+            DoorQRCodeParam qrparam = new DoorQRCodeParam();
+            qrparam.setQrcode(req.getQrcode());
+            DoorQrcodeResponse qrcoderesp = consumePropxy.qrcodequery(qrparam);
+            if (qrcoderesp.getRetcode() == 0) {
+                cardno = qrcoderesp.getCitycardno();
+                cardphyid = qrcoderesp.getCardphyid();
+            } else {
+                resp.setRetcode(qrcoderesp.getRetcode().toString());
+                resp.setRetmsg(qrcoderesp.getRetmsg());
+                return resp;
+            }
+        } else {
+            cardno = req.getCardno();
+            cardphyid = req.getCardphyid();
+        }
+
+        TCard tCard = cardService.getCardByCardnoAndCardphyid(cardno, cardphyid);
         if (null == tCard) {
             resp.setRetcode(ErrorCode.ERRIF_CARD_NOTEXIST);
             resp.setRetmsg("卡号[" + req.getCardno() + "]不存在");
             return resp;
         }
-        if (!RestaurantConstant.STATUS_CARD_NORMAL.equals(tCard.getStatus())){
+        if (!RestaurantConstant.STATUS_CARD_NORMAL.equals(tCard.getStatus())) {
             resp.setRetcode(ErrorCode.ERRIF_CARD_DISABLED);
             resp.setRetmsg("卡号[" + req.getCardno() + "]已注销");
             return resp;
         }
-        if(!RestaurantConstant.STATUS_CARD_NORMAL.equals(tCard.getTransstatus())){
+        if (!RestaurantConstant.STATUS_CARD_NORMAL.equals(tCard.getTransstatus())) {
             resp.setRetmsg("卡号[" + req.getCardno() + "]状态异常;");
             resp.setRetcode(ErrorCode.ERRIF_CARD_DISABLED);
             return resp;
         }
-        TCustomer customer=customerService.getCustomerByCustid(tCard.getCustid());
-        if(null==customer){
+        TCustomer customer = customerService.getCustomerByCustid(tCard.getCustid());
+        if (null == customer) {
             resp.setRetcode(ErrorCode.ERRIF_POSDTL_NOTEXIST);
             resp.setRetmsg("卡对应客户不存在");
             return resp;
         }
-        Double managefee=0.0;
+        Double managefee = 0.0;
 
-        TTransDtl odtl=transDtlService.getPosTransdtl(tDevice.getId(),req.getTermseqno(),req.getTermdate());
+        TTransDtl odtl = transDtlService.getPosTransdtl(tDevice.getId(), req.getTermseqno(), req.getTermdate());
 
-        if(null!=odtl){
+        if (null != odtl) {
             resp.setRetcode(ErrorCode.ERRIF_POS_SEQNO_REPEAT);
             resp.setRetmsg("该pos当日流水重复");
             return resp;
         }
-
         TTransDtl tTransdtl = new TTransDtl();
-        tTransdtl.setAccdate(systemUtilService.getAccdate());
+
+
         tTransdtl.setTermid(tDevice.getId());
         tTransdtl.setBillno(systemUtilService.getRefno());
         tTransdtl.setShopid(tDevice.getShopid());
-        tTransdtl.setAcctime(systemUtilService.getSysdatetime().getHosttime());
         tTransdtl.setAmount(0d);
         tTransdtl.setCusttype(customer.getCusttype());
         tTransdtl.setTransdate(req.getTermdate());
 
-
         tTransdtl.setManagefee(managefee);
         tTransdtl.setTranstime(req.getTermtime());
-        tTransdtl.setCardno(req.getCardno());
+        tTransdtl.setCardno(tCard.getCardno());
         tTransdtl.setTransmode(req.getTranstype());
 
         tTransdtl.setTranstype(RestaurantConstant.TRANSTYPE_TRANSDTL_ONLINE);
@@ -229,16 +252,17 @@
         return resp;
     }
 
-    private Double getDiscountAmount(String termdate, String custid,  Double amount, DiscountBean bean) {
-        Integer limit=transDtlService.getDiscountLimitToday(termdate,custid,bean.getRuleid());
-        if(bean.getLimitcnt()>=limit){
+    private Double getDiscountAmount(String termdate, String custid, Double amount, DiscountBean bean) {
+        Integer limit = transDtlService.getDiscountLimitToday(termdate, custid, bean.getRuleid());
+        if (bean.getLimitcnt() > limit) {
 
-            if(RestaurantConstant.RULETYPE_REDUCTION.equals(bean.getRuletype())){
-                amount=amount-Double.parseDouble(bean.getAmount());
-            }else if (RestaurantConstant.RULETYPE_DISCOUNT.equals(bean.getRuletype())){
-                amount=amount*(Double.parseDouble(bean.getAmount())/10);
-            }else if (RestaurantConstant.RULETYPE_QUOTA.equals(bean.getRuletype())){
-                amount=Double.parseDouble(bean.getAmount());
+            if (RestaurantConstant.RULETYPE_REDUCTION.equals(bean.getRuletype())) {
+                amount = amount - bean.getAmount();
+            } else if (RestaurantConstant.RULETYPE_DISCOUNT.equals(bean.getRuletype())) {
+                amount = amount * (bean.getAmount() / 10);
+            } else if (RestaurantConstant.RULETYPE_QUOTA.equals(bean.getRuletype())) {
+                BigDecimal amt = BigDecimal.valueOf(bean.getAmount());
+                amount = amt.doubleValue();
             }
         }
         return amount;
@@ -256,9 +280,10 @@
         }
 
         TDevice tDevice = deviceService.getDeviceByDevphyid(req.getDevphyid());
-        if (tDevice == null) {
-            resp.setRetcode(ErrorCode.ERRIF_POS_NOREG);
-            resp.setRetmsg("设备不存在");
+        APIResp apiResp = checkDevice(resp, tDevice);
+        if (!ErrorCode.ERRIF_OK.equals(apiResp.getRetcode())) {
+            resp.setRetcode(apiResp.getRetcode());
+            resp.setRetmsg(apiResp.getRetmsg());
             return resp;
         }
 
@@ -268,20 +293,21 @@
             resp.setRetmsg("客户" + tTransdtl.getCustid() + "不存在");
             return resp;
         }
-        Double amount=req.getAmount() / 100.0;
+        Double amount = req.getAmount() / 100.0;
 
-        DiscountBean bean=deviceDiscountRuleService.getCustomerDiscount(tDevice.getId(),req.getTermtime(), cus.getCustid());
-        if(null!=bean){
+        DiscountBean bean = deviceDiscountRuleService.getCustomerDiscount(tDevice.getId(), req.getTermtime(), cus.getCustid());
+        if (null != bean) {
             tTransdtl.setRuleid(bean.getRuleid());
             amount = getDiscountAmount(req.getTermdate(), cus.getCustid(), amount, bean);
         }
         tTransdtl.setAmount(amount);
         tTransdtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_WAIT);
-        TTransDtl dtl=transDtlService.saveTransdtl(tTransdtl);
+        TTransDtl dtl = transDtlService.saveTransdtl(tTransdtl);
 
-        if(RestaurantConstant.TRANSMODE_CODE.equals(dtl.getTransmode())){
-            QrcodePayParam param=new QrcodePayParam();
-            param.setAmount(MoneyUtil.YuanToFen(tTransdtl.getAmount()));
+
+   /*     if(RestaurantConstant.TRANSMODE_CODE.equals(dtl.getTransmode())){
+            DoorQRCodeParam qrparam=new DoorQRCodeParam();
+            qrparam.setAmount(MoneyUtil.YuanToFen(tTransdtl.getAmount()));
             param.setBillno(tTransdtl.getBillno());
             param.setShopaccno(tTransdtl.getShopid());
             param.setTransdate(tTransdtl.getTransdate());
@@ -299,54 +325,55 @@
                 resp.setRetmsg(qrcoderesp.getRetmsg());
             }
 
-        }else{
-            CitizenCardPayinitParam param=new CitizenCardPayinitParam();
-            param.setBillno(dtl.getBillno());
-            param.setShopaccno(dtl.getShopid());
-            param.setTransdate(dtl.getTransdate());
-            param.setTranstime(dtl.getTranstime());
-            param.setCardNo(dtl.getCardno());
-            param.setAmount(MoneyUtil.YuanToFen(dtl.getAmount()));
-            param.setDtltype("canteen");
-            CitizenPayResponse response=citizenCardPayProxy.citizencardPayinit(param);
-            if(response.getRetcode() == 0){
-                tTransdtl.setRefno(response.getRefno());
-                CitizenCardPayfinishParam confirmParam=new CitizenCardPayfinishParam();
-                confirmParam.setRefno(response.getRefno());
-                CitizenPayResponse confirmResp = citizenCardPayProxy.citizencardPayFinish(confirmParam);
-                if(confirmResp.getRetcode() == 0){
-                    tTransdtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_SUCCESS);
-                    resp.setRetcode(ErrorCode.ERRIF_OK);
-                }else if (confirmResp.getRetcode()==55555){
-                    tTransdtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_WAIT);
-                    resp.setRetcode(ErrorCode.ERRIF_OK);
-                }else{
-                    tTransdtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_FAIL);
-                    tTransdtl.setAttr1(confirmResp.getRetmsg()+","+confirmResp.getException());
-                    resp.setRetcode(confirmResp.getRetcode().toString());
-                    resp.setRetmsg(confirmResp.getRetmsg());
-                }
-            }else{
+        }else{*/
+        CitizenCardPayinitParam param = new CitizenCardPayinitParam();
+        param.setBillno(dtl.getBillno());
+        param.setShopaccno(dtl.getShopid());
+        param.setTransdate(dtl.getTransdate());
+        param.setTranstime(dtl.getTranstime());
+        param.setCardNo(dtl.getCardno());
+        param.setAmount(MoneyUtil.YuanToFen(dtl.getAmount()));
+        param.setDtltype("canteen");
+        CitizenPayResponse response = citizenCardPayProxy.citizencardPayinit(param);
+        if (response.getRetcode() == 0) {
+            tTransdtl.setRefno(response.getRefno());
+            CitizenCardPayfinishParam confirmParam = new CitizenCardPayfinishParam();
+            confirmParam.setRefno(response.getRefno());
+            CitizenPayResponse confirmResp = citizenCardPayProxy.citizencardPayFinish(confirmParam);
+            if (confirmResp.getRetcode() == 0) {
+                tTransdtl.setAccdate(systemUtilService.getAccdate());
+                tTransdtl.setAcctime(systemUtilService.getSysdatetime().getHosttime());
+                tTransdtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_SUCCESS);
+                resp.setRetcode(ErrorCode.ERRIF_OK);
+            } else if (confirmResp.getRetcode() == 55555) {
+                tTransdtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_WAIT);
+                resp.setRetcode(ErrorCode.ERRIF_OK);
+            } else {
                 tTransdtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_FAIL);
-                tTransdtl.setAttr1(response.getRetmsg()+","+response.getException());
-                resp.setRetcode(response.getRetcode().toString());
-                resp.setRetmsg(response.getRetmsg());
+                tTransdtl.setAttr1(confirmResp.getRetmsg() + "," + confirmResp.getException());
+                resp.setRetcode(confirmResp.getRetcode().toString());
+                resp.setRetmsg(confirmResp.getRetmsg());
             }
+        } else {
+            tTransdtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_FAIL);
+            tTransdtl.setAttr1(response.getRetmsg() + "," + response.getException());
+            resp.setRetcode(response.getRetcode().toString());
+            resp.setRetmsg(response.getRetmsg());
         }
-
+        // }
 
 
         resp.setBillno(req.getBillno());
-        Double retAmount=tTransdtl.getAmount()*100;
+        Double retAmount = tTransdtl.getAmount() * 100;
         resp.setAmount(retAmount.intValue());
         resp.setExtraamt(0);
         resp.setUserid(cus.getCustid());
         resp.setUsername(cus.getCustname());
         resp.setBalance(0);
         transDtlService.saveTransdtl(tTransdtl);
-        if(RestaurantConstant.STATUS_TRANSDTL_WAIT.equals(tTransdtl.getStatus())){
+        if (RestaurantConstant.STATUS_TRANSDTL_WAIT.equals(tTransdtl.getStatus())) {
             resp.setRequire_query(true);
-        }else{
+        } else {
             resp.setRequire_query(false);
         }
         return resp;
@@ -363,20 +390,20 @@
             return resp;
         }
 
-        QueryDtlResultParam param=new QueryDtlResultParam();
+        QueryDtlResultParam param = new QueryDtlResultParam();
         param.setRefno(tTransdtl.getRefno());
         param.setBillno(tTransdtl.getBillno());
         param.setShopaccno(tTransdtl.getShopid());
-        QueryTransDtlResponse queryresp=transactionProxy.queryDtlResult(param);
-        if(RestaurantConstant.STATUS_TRANSDTL_WAIT.equals(queryresp.getStatus())){
+        QueryTransDtlResponse queryresp = transactionProxy.queryDtlResult(param);
+        if (RestaurantConstant.STATUS_TRANSDTL_WAIT.equals(queryresp.getStatus())) {
             resp.setRequire_query(true);
-        }else{
+        } else {
             resp.setRequire_query(false);
         }
         resp.setBillno(tTransdtl.getBillno());
-        Double retAmount=tTransdtl.getAmount()*100;
+        Double retAmount = tTransdtl.getAmount() * 100;
         resp.setAmount(retAmount.intValue());
-        Double retExtamt=tTransdtl.getManagefee()*100;
+        Double retExtamt = tTransdtl.getManagefee() * 100;
         resp.setExtraamt(retExtamt.intValue());
         resp.setUserid(tTransdtl.getCustid());
         resp.setUsername(tTransdtl.getCustname());
@@ -388,7 +415,7 @@
     @Override
     public PosPayReverseResp doPayCancel(PosPayReverseReq req) {
         PosPayReverseResp resp = new PosPayReverseResp();
-        System.out.println("termsqlno:"+req.getTermseqno());
+        System.out.println("termsqlno:" + req.getTermseqno());
         TTransDtl tTransDtl = transDtlService.getTransDtlByBillno(req.getReversalbillno());
         if (null == tTransDtl) {
             resp.setRetcode(ErrorCode.ERRIF_OK);
@@ -410,12 +437,12 @@
         }
         try {
             tTransDtl.setTermsqlno(req.getTermseqno());
-            TTransDtl revdtl=transDtlService.doRevertTransdtl(tTransDtl);
-            if(!RestaurantConstant.STATUS_TRANSDTL_SUCCESS.equals(revdtl.getStatus())){
+            TTransDtl revdtl = transDtlService.doRevertTransdtl(tTransDtl);
+            if (!RestaurantConstant.STATUS_TRANSDTL_SUCCESS.equals(revdtl.getStatus())) {
                 resp.setTermseqno(req.getTermseqno());
-                resp.setRetmsg("冲正失败，"+revdtl.getAttr1());
+                resp.setRetmsg("冲正失败，" + revdtl.getAttr1());
                 resp.setRetcode(ErrorCode.ERRIF_OK);
-            }else{
+            } else {
                 resp.setTermseqno(req.getTermseqno());
                 resp.setRetmsg("冲正成功");
                 resp.setRetcode(ErrorCode.ERRIF_OK);
@@ -461,23 +488,28 @@
     public PosPayWhitelistResp doGetWhitelist(PosPayWhitelistReq req) {
         PosPayWhitelistResp resp = new PosPayWhitelistResp();
         TDevice device = deviceService.getDeviceByDevphyid(req.getDevphyid());
-        if (checkDevice(resp, device)) return resp;
+        APIResp apiResp = checkDevice(resp, device);
+        if (!ErrorCode.ERRIF_OK.equals(apiResp.getRetcode())) {
+            resp.setRetcode(apiResp.getRetcode());
+            resp.setRetmsg(apiResp.getRetmsg());
+            return resp;
+        }
         device.setCardverno(req.getCardverno());
         deviceService.saveDevice(device);
         ArrayList<CardverBean> cardverFlags = new ArrayList<CardverBean>();
         String maxCardverno = cardService.getMaxCarcver();
         Integer count = req.getMaxcount();
-        List<TCardver> whitelistCards ;
-        TWhitelistDevbind bind=whitelistService.getWhitelistDevbindByDeviceId(device.getId());
-        TWhitelist whitelist=null;
-        if(null!=bind){
-            whitelist=whitelistService.getWhitelistById(bind.getWhitelistid());
+        List<TCardver> whitelistCards;
+        TWhitelistDevbind bind = whitelistService.getWhitelistDevbindByDeviceId(device.getId());
+        TWhitelist whitelist = null;
+        if (null != bind) {
+            whitelist = whitelistService.getWhitelistById(bind.getWhitelistid());
 
         }
-        if(null!=whitelist&&RestaurantConstant.STATUS_DISCOUNTRULE_NORMAL.equals(whitelist.getStatus())){
-            whitelistCards=whitelistService.getDevBindCardver(device.getId());
-        } else{
-            whitelistCards= cardService.getCardlistByTCardVer(req.getCardverno());
+        if (null != whitelist && RestaurantConstant.STATUS_DISCOUNTRULE_NORMAL.equals(whitelist.getStatus())) {
+            whitelistCards = whitelistService.getDevBindCardver(device.getId(), req.getCardverno());
+        } else {
+            whitelistCards = cardService.getCardlistByTCardVer(req.getCardverno());
         }
 
         if (null == whitelistCards || whitelistCards.size() < 1) {
@@ -511,30 +543,36 @@
         return resp;
     }
 
-    private boolean checkDevice(APIResp resp, TDevice device) {
+    private APIResp checkDevice(APIResp resp, TDevice device) {
         if (null == device) {
             resp.setRetcode(ErrorCode.E_DB_QRY);
             resp.setRetmsg("设备物理ID不存在");
-            return true;
+            return resp;
         }
         if (device.getState() != 1) {
             resp.setRetcode(ErrorCode.ERRIF_OTHER);
             resp.setRetmsg("设备状态错误");
-            return true;
+            return resp;
         }
-        if(!RestaurantConstant.STATUS_CHECKSTATUS_NORMAL.equals(device.getCheckstatus())){
+        if (!RestaurantConstant.STATUS_CHECKSTATUS_NORMAL.equals(device.getCheckstatus())) {
             resp.setRetcode(ErrorCode.ERRIF_OTHER);
             resp.setRetmsg("设备审核未通过");
-            return true;
+            return resp;
         }
-        return false;
+        resp.setRetcode(ErrorCode.ERRIF_OK);
+        return resp;
     }
 
     @Override
     public PosPayHeartBeatResp posHeartBeat(PosPayHeartBeatReq req) {
         PosPayHeartBeatResp resp = new PosPayHeartBeatResp();
         TDevice device = deviceService.getDeviceByDevphyid(req.getDevphyid());
-        if (checkDevice(resp, device)) return resp;
+        APIResp apiResp = checkDevice(resp, device);
+        if (!ErrorCode.ERRIF_OK.equals(apiResp.getRetcode())) {
+            resp.setRetcode(apiResp.getRetcode());
+            resp.setRetmsg(apiResp.getRetmsg());
+            return resp;
+        }
         String datetime = DateUtil.getNow("yyyyMMddHHmmss");
 
         device.setCardverno(req.getCardverno());
@@ -549,6 +587,11 @@
             return resp;
         }
 
+        TWhitelistDevbind bind = whitelistService.getWhitelistDevbindByDeviceId(device.getId());
+        if (null != bind) {
+            resp.setWhitelistid(bind.getWhitelistid());
+        }
+
         resp.setRetcode(ErrorCode.ERRIF_OK);
         resp.setRetmsg("心跳成功");
         resp.setSystime(datetime);
@@ -561,12 +604,17 @@
 
     @Override
     public PosPayQuerysalesResp posQuerySales(PosPaySysparaReq req) {
-        PosPayQuerysalesResp resp=new PosPayQuerysalesResp();
+        PosPayQuerysalesResp resp = new PosPayQuerysalesResp();
         TDevice device = deviceService.getDeviceByDevphyid(req.getDevphyid());
-        if (checkDevice(resp, device)) return resp;
+        APIResp apiResp = checkDevice(resp, device);
+        if (!ErrorCode.ERRIF_OK.equals(apiResp.getRetcode())) {
+            resp.setRetcode(apiResp.getRetcode());
+            resp.setRetmsg(apiResp.getRetmsg());
+            return resp;
+        }
 
-        SalesAmtBean salesAmtBean=transDtlService.getSalesToday(req.getTermdate(),device.getId());
-        ManageFeeAmtBean feeAmtBean=transDtlService.getManageFeeToday(req.getTermdate(),device.getId());
+        SalesAmtBean salesAmtBean = transDtlService.getSalesToday(req.getTermdate(), device.getId());
+        ManageFeeAmtBean feeAmtBean = transDtlService.getManageFeeToday(req.getTermdate(), device.getId());
 
 
         resp.setRetcode(ErrorCode.ERRIF_OK);
@@ -581,21 +629,26 @@
 
     @Override
     public PosPayAccqueryResp AccountQuery(PosPayAccqueryReq req) {
-        PosPayAccqueryResp resp=new PosPayAccqueryResp();
+        PosPayAccqueryResp resp = new PosPayAccqueryResp();
 
         TDevice device = deviceService.getDeviceByDevphyid(req.getDevphyid());
-        if (checkDevice(resp, device)) return resp;
+        APIResp apiResp = checkDevice(resp, device);
+        if (!ErrorCode.ERRIF_OK.equals(apiResp.getRetcode())) {
+            resp.setRetcode(apiResp.getRetcode());
+            resp.setRetmsg(apiResp.getRetmsg());
+            return resp;
+        }
 
-        TCard card=cardService.getCardByCardnoAndCardphyid(req.getCardno(),req.getCardphyid());
+        TCard card = cardService.getCardByCardnoAndCardphyid(req.getCardno(), req.getCardphyid());
 
-        if(null==card){
+        if (null == card) {
             resp.setRetcode(ErrorCode.ERRIF_CARD_NOTEXIST);
             resp.setRetmsg("卡不存在");
             return resp;
         }
 
-        TCustomer customer=customerService.getCustomerByCustid(card.getCustid());
-        if(null==customer){
+        TCustomer customer = customerService.getCustomerByCustid(card.getCustid());
+        if (null == customer) {
             resp.setRetcode(ErrorCode.ERRIF_CARD_PWD);
             resp.setRetmsg("未查询到卡对应客户");
             return resp;
@@ -616,8 +669,8 @@
 
     @Override
     public PosPayOfflineDtlResp saveOfflineDtl(PosPayOfflineDtlReq req) {
-        PosPayOfflineDtlResp resp=new PosPayOfflineDtlResp();
-        TOfflineTransDtl transDtl=new TOfflineTransDtl();
+        PosPayOfflineDtlResp resp = new PosPayOfflineDtlResp();
+        TOfflineTransDtl transDtl = new TOfflineTransDtl();
         transDtl.setTransdate(req.getTransdate());
         transDtl.setTranstime(req.getTranstime());
 
@@ -627,29 +680,57 @@
 
         List<TMealtype> mealtypes = mealTypeDao.findAllByOrderByEndtime();
         transDtl.setTermsqlno(req.getTermseqno());
-        String err="";
+        String err = "";
         TDevice device = deviceService.getDeviceByDevphyid(req.getDevphyid());
         if (null == device) {
-            err+="设备物理ID不存在;";
+            err += "设备物理ID不存在;";
+        }
+        if (1 != device.getState()) {
+            err += "设备状态错误;";
+        }
+        if (!RestaurantConstant.STATUS_CHECKSTATUS_NORMAL.equals(device.getCheckstatus())) {
+            err += "设备审核未通过;";
+        }
+        if (!"".equals(err)) {
             transDtl.setAttr1(err);
             offlineTransDtlService.saveOfflineTransdtl(transDtl);
             resp.setRetmsg("保存成功");
             resp.setRetcode(ErrorCode.ERRIF_OK);
             return resp;
         }
-        Double amount=req.getAmount()/100.0;
-        TCard tCard = cardService.getCardByCardnoAndCardphyid(req.getCardno(), req.getCardphyid());
+        Double amount = req.getAmount() / 100.0;
+
+        String cardno;
+        String cardphyid;
+
+        if (RestaurantConstant.TRANSMODE_CODE.equals(req.getTranstype())) {
+            DoorQRCodeParam qrparam = new DoorQRCodeParam();
+            qrparam.setQrcode(req.getQrcode());
+            DoorQrcodeResponse qrcoderesp = consumePropxy.qrcodequery(qrparam);
+            if (qrcoderesp.getRetcode() == 0) {
+                cardno = qrcoderesp.getCitycardno();
+                cardphyid = qrcoderesp.getCardphyid();
+            } else {
+                cardno="";
+                cardphyid="";
+            }
+        } else {
+            cardno = req.getCardno();
+            cardphyid = req.getCardphyid();
+        }
+
+        TCard tCard = cardService.getCardByCardnoAndCardphyid(cardno, cardphyid);
         if (null == tCard) {
-            err+="卡号[" + req.getCardno() + "]不存在;";
-        }else{
-            TCustomer customer=customerService.getCustomerByCustid(tCard.getCustid());
-            if(null==customer){
-                err+="卡对应人员不存在;";
+            err += "卡号[" + req.getCardno() + "]不存在;";
+        } else {
+            TCustomer customer = customerService.getCustomerByCustid(tCard.getCustid());
+            if (null == customer) {
+                err += "卡对应人员不存在;";
             } else {
                 transDtl.setCustid(customer.getCustid());
                 transDtl.setCustname(customer.getCustname());
-                DiscountBean bean=deviceDiscountRuleService.getCustomerDiscount(device.getId(),req.getTranstime(), customer.getCustid());
-                if(null!=bean){
+                DiscountBean bean = deviceDiscountRuleService.getCustomerDiscount(device.getId(), req.getTranstime(), customer.getCustid());
+                if (null != bean) {
                     transDtl.setRuleid(bean.getRuleid());
                     amount = getDiscountAmount(req.getTransdate(), customer.getCustid(), amount, bean);
                 }
@@ -660,8 +741,8 @@
 
 
         if (device.getState() != 1) {
-            err+="设备状态错误;";
-        }else{
+            err += "设备状态错误;";
+        } else {
             transDtl.setTermid(device.getId());
             transDtl.setShopid(device.getShopid());
         }
@@ -677,10 +758,9 @@
         }*/
 
 
-
-        if("true".equals(req.getReversalflag())){
+        if ("true".equals(req.getReversalflag())) {
             transDtl.setTranstype(RestaurantConstant.TRANSTYPE_TRANSDTL_REVERT);
-        }else{
+        } else {
             transDtl.setTranstype(RestaurantConstant.TRANSTYPE_TRANSDTL_OFFLINE);
         }
 
@@ -693,28 +773,24 @@
             }
         } catch (Exception e) {
             e.printStackTrace();
-            err+="设置分餐失败;";
+            err += "设置分餐失败;";
         }
 
-        if("true".equals(req.getReversalflag())){
+        if ("true".equals(req.getReversalflag())) {
             TOfflineTransDtl tTransDtl =
-                    offlineTransDtlService.getOfflineTransDtlByTermsqlnoAndTermid(req.getReversaltermseqno(),device.getId(),req.getTransdate());
+                    offlineTransDtlService.getOfflineTransDtlByTermsqlnoAndTermid(req.getReversaltermseqno(), device.getId(), req.getTransdate());
             if (null == tTransDtl) {
-                err+=("终端参考号" + req.getReversaltermseqno() + "不存在;");
-            }else{
+                err += ("终端参考号" + req.getReversaltermseqno() + "不存在;");
+            } else {
                 if (!RestaurantConstant.STATUS_TRANSDTL_SUCCESS.toUpperCase().equals(tTransDtl.getStatus().toUpperCase())) {
-                    err+=("交易状态未成功;");
+                    err += ("交易状态未成功;");
                 }
                 if (tTransDtl.getRevflag() == 1) {
-                    err+=("流水" + req.getReversaltermseqno() + "已冲正");
+                    err += ("流水" + req.getReversaltermseqno() + "已冲正");
                 }
 
                 try {
-                    if(!"".equals(err)){
-                        transDtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_FAIL);
-                    }else{
-                        transDtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_INIT);
-                    }
+                    transDtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_INIT);
                     transDtl.setAttr1(err);
                     offlineTransDtlService.revertOfflineTransdtl(tTransDtl);
                     resp.setTermseqno(tTransDtl.getTermsqlno());
@@ -727,13 +803,9 @@
                 }
             }
         }
-
-        if(!"".equals(err)){
-            transDtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_FAIL);
-        }else{
-            transDtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_INIT);
-        }
+        transDtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_INIT);
         transDtl.setAttr1(err);
+        transDtl.setTransmode(req.getTranstype());
         offlineTransDtlService.saveOfflineTransdtl(transDtl);
 
         resp.setRetcode(ErrorCode.ERRIF_OK);
@@ -744,12 +816,17 @@
 
     @Override
     public PosPayGolbalParamResp getBusinessParam(PosPayGolbalParamReq req) {
-        PosPayGolbalParamResp resp=new PosPayGolbalParamResp();
+        PosPayGolbalParamResp resp = new PosPayGolbalParamResp();
         TDevice device = deviceService.getDeviceByDevphyid(req.getDevphyid());
-        if (checkDevice(resp, device)) return resp;
-        TBusinesspara url=businessparaDao.findByParakey("upgrade_url");
-        TBusinesspara version=businessparaDao.findByParakey("upgrade_version");
-        if(null==url||null==version){
+        APIResp apiResp = checkDevice(resp, device);
+        if (!ErrorCode.ERRIF_OK.equals(apiResp.getRetcode())) {
+            resp.setRetcode(apiResp.getRetcode());
+            resp.setRetmsg(apiResp.getRetmsg());
+            return resp;
+        }
+        TBusinesspara url = businessparaDao.findByParakey("upgrade_url");
+        TBusinesspara version = businessparaDao.findByParakey("upgrade_version");
+        if (null == url || null == version) {
             resp.setRetcode(ErrorCode.E_EMPTY_PARAM);
             resp.setRetmsg("请求参数未配置");
             return resp;
diff --git a/src/main/java/com/supwisdom/dlpay/api/task/PosPayTask.java b/src/main/java/com/supwisdom/dlpay/api/task/PosPayTask.java
index 37aaef4..62c301f 100644
--- a/src/main/java/com/supwisdom/dlpay/api/task/PosPayTask.java
+++ b/src/main/java/com/supwisdom/dlpay/api/task/PosPayTask.java
@@ -1,10 +1,10 @@
 package com.supwisdom.dlpay.api.task;
 
-import com.supwisdom.dlpay.api.bean.CitizenCardPayfinishParam;
-import com.supwisdom.dlpay.api.bean.CitizenCardPayinitParam;
-import com.supwisdom.dlpay.api.bean.CitizenPayResponse;
+import com.supwisdom.dlpay.api.bean.*;
+import com.supwisdom.dlpay.framework.service.SystemUtilService;
 import com.supwisdom.dlpay.framework.util.DateUtil;
 import com.supwisdom.dlpay.paysdk.proxy.CitizenCardPayProxy;
+import com.supwisdom.dlpay.paysdk.proxy.TransactionProxy;
 import com.supwisdom.dlpay.restaurant.dao.TransDtlDao;
 import com.supwisdom.dlpay.restaurant.domain.TOfflineTransDtl;
 import com.supwisdom.dlpay.restaurant.domain.TTransDtl;
@@ -36,8 +36,12 @@
     private OfflineTransDtlService offlineTransDtlService;
     @Autowired
     private CitizenCardPayProxy citizenCardPayProxy;
+    @Autowired
+    private SystemUtilService systemUtilService;
+    @Autowired
+    private TransactionProxy transactionProxy;
 
-    @Scheduled(cron = "${cron.offlinedtl}")
+    @Scheduled(cron = "0 0/1 * * * ?")
     private void submitOfflineDtlTask() {
         String date = DateUtil.getNow("yyyyMMdd");
         List<TOfflineTransDtl> dtls = offlineTransDtlService.getUncheckOfflineTransdtl(date, RestaurantConstant.TRANSTYPE_TRANSDTL_OFFLINE);
@@ -47,8 +51,6 @@
 
                 TTransDtl tTransDtl = gettTransDtl(dtl);
 
-                tTransDtl.setTransmode(RestaurantConstant.TRANSTYPE_TRANSDTL_OFFLINE);
-
                 CitizenCardPayinitParam param = new CitizenCardPayinitParam();
                 param.setBillno(dtl.getBillno());
                 param.setShopaccno(dtl.getShopid());
@@ -58,9 +60,11 @@
                 param.setDtltype("canteen");
                 Double amt = dtl.getAmount() * 100;
                 param.setAmount(amt.intValue());
+                logger.info(dtl.getBillno() + "开始消费逻辑");
+
                 CitizenPayResponse response = citizenCardPayProxy.citizencardPayinit(param);
                 if (response.getRetcode() != 0) {
-                    saveTransdtls(dtl, tTransDtl, response);
+                    saveFailTransdtls(dtl, tTransDtl, response);
                     logger.info(dtl.getBillno() + "初始化失败," + response.getRetcode() + "," + response.getRetmsg() + "," + response.getException());
                     continue;
                 }
@@ -68,12 +72,15 @@
                 finishparam.setRefno(response.getRefno());
                 CitizenPayResponse finishresp = citizenCardPayProxy.citizencardPayFinish(finishparam);
                 if (finishresp.getRetcode() != 0) {
-                    saveTransdtls(dtl, tTransDtl, finishresp);
-                    logger.info(dtl.getBillno() + "消费缺认失败," + finishresp.getRetcode() + "," + finishresp.getRetmsg() + "," + finishresp.getException());
+                    saveFailTransdtls(dtl, tTransDtl, finishresp);
+                    logger.info(dtl.getBillno() + "消费确认失败," + finishresp.getRetcode() + "," + finishresp.getRetmsg() + "," + finishresp.getException());
                     continue;
                 }
                 tTransDtl.setAccdate(date);
-                tTransDtl.setAcctime(DateUtil.getNow("HHmmss"));
+                tTransDtl.setAcctime(systemUtilService.getSysdatetime().getHosttime());
+                tTransDtl.setCoreStatus(RestaurantConstant.STATUS_TRANSDTL_SUCCESS);
+                tTransDtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_SUCCESS);
+                tTransDtl.setRefno(response.getRefno());
                 dtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_SUCCESS);
                 offlineTransDtlService.saveOfflineTransdtl(dtl);
                 transDtlService.saveTransdtl(tTransDtl);
@@ -92,13 +99,13 @@
 
     }
 
-    @NotNull
     private TTransDtl gettTransDtl(TOfflineTransDtl dtl) {
         TTransDtl tTransDtl = new TTransDtl();
         tTransDtl.setManagefee(dtl.getManagefee());
         tTransDtl.setAmount(dtl.getAmount());
         tTransDtl.setCardno(dtl.getCardno());
         tTransDtl.setStatus(dtl.getStatus());
+        tTransDtl.setCustid(dtl.getCustid());
         tTransDtl.setBillno(dtl.getBillno());
         tTransDtl.setTermsqlno(dtl.getTermsqlno());
         tTransDtl.setMealtype(dtl.getMealtype());
@@ -106,6 +113,8 @@
         tTransDtl.setShopid(dtl.getShopid());
         tTransDtl.setTransdate(dtl.getTransdate());
         tTransDtl.setTranstime(dtl.getTranstime());
+        tTransDtl.setTranstype(RestaurantConstant.TRANSTYPE_TRANSDTL_OFFLINE);
+
         tTransDtl.setCustname(dtl.getCustname());
         tTransDtl.setTermid(dtl.getTermid());
         tTransDtl.setRuleid(dtl.getRuleid());
@@ -113,14 +122,55 @@
         return tTransDtl;
     }
 
-
-    private void saveTransdtls(TOfflineTransDtl dtl, TTransDtl tTransDtl, CitizenPayResponse finishresp) {
-        dtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_FAIL);
-        dtl.setAttr1(finishresp.getRetmsg() + "," + finishresp.getException());
-        tTransDtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_FAIL);
-        tTransDtl.setAttr1(finishresp.getRetmsg() + "," + finishresp.getException());
+    private void saveFailTransdtls(TOfflineTransDtl dtl, TTransDtl 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.setAttr1(attr);
+        tTransDtl.setStatus(status);
+        tTransDtl.setAttr1(attr);
         offlineTransDtlService.saveOfflineTransdtl(dtl);
         transDtlService.saveTransdtl(tTransDtl);
     }
 
+
+    @Scheduled(cron = "0 0/10 * * * ?")
+    private void checkWipDtls() {
+        String date = DateUtil.getNow("yyyyMMdd");
+        List<TTransDtl> dtls = transDtlService.getSubmittingTransdtl(date);
+        logger.info("正在核对" + dtls.size() + "笔未上传流水");
+        if (dtls.size() > 0) {
+            for (TTransDtl dtl : dtls) {
+                QueryDtlResultParam param = new QueryDtlResultParam();
+                param.setShopaccno(dtl.getShopid());
+                param.setBillno(dtl.getBillno());
+                param.setRefno(dtl.getRefno());
+                QueryTransDtlResponse resp = transactionProxy.queryDtlResult(param);
+                logger.info(dtl.getBillno()+":status==="+resp.getStatus());
+
+                if(RestaurantConstant.STATUS_TRANSDTL_WAIT.equals(resp.getStatus())){
+                    logger.info(dtl.getBillno()+":"+resp.getRetcode()+":"+resp.getRetmsg());
+                }else if (RestaurantConstant.STATUS_TRANSDTL_SUCCESS.equals(resp.getStatus())){
+                    dtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_SUCCESS);
+                    transDtlService.saveTransdtl(dtl);
+                }else{
+                    dtl.setAttr1(resp.getRetmsg());
+                    dtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_FAIL);
+                    transDtlService.saveTransdtl(dtl);
+
+                }
+
+            }
+        }
+
+    }
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/filter/CrosXssFilter.java b/src/main/java/com/supwisdom/dlpay/framework/filter/CrosXssFilter.java
index d124781..b8349ee 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/filter/CrosXssFilter.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/filter/CrosXssFilter.java
@@ -42,11 +42,11 @@
 
     //sql,xss过滤
     HttpServletRequest httpServletRequest = (HttpServletRequest) request;
-    logger.info("CrosXssFilter.......orignal url:{},ParameterMap:{}",httpServletRequest.getRequestURI(), new Gson().toJson(httpServletRequest.getParameterMap()));
+    logger.error("CrosXssFilter.......orignal url:{},ParameterMap:{}",httpServletRequest.getRequestURI(), new Gson().toJson(httpServletRequest.getParameterMap()));
     XssHttpServletRequestWrapper xssHttpServletRequestWrapper = new XssHttpServletRequestWrapper(
         httpServletRequest);
     chain.doFilter(xssHttpServletRequestWrapper, response);
-    logger.info("CrosXssFilter..........doFilter url:{},ParameterMap:{}",xssHttpServletRequestWrapper.getRequestURI(), new Gson().toJson(xssHttpServletRequestWrapper.getParameterMap()));
+    logger.error("CrosXssFilter..........doFilter url:{},ParameterMap:{}",xssHttpServletRequestWrapper.getRequestURI(), new Gson().toJson(xssHttpServletRequestWrapper.getParameterMap()));
   }
 
   @Override
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/bean/DiscountBean.java b/src/main/java/com/supwisdom/dlpay/restaurant/bean/DiscountBean.java
index 369acb4..2da979b 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/bean/DiscountBean.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/bean/DiscountBean.java
@@ -1,18 +1,17 @@
 package com.supwisdom.dlpay.restaurant.bean;
 
-import com.supwisdom.dlpay.system.bean.PageBean;
 
 public class DiscountBean{
     private String ruletype;
     private Integer limitcnt;
-    private String amount;
+    private Double amount;
     private Integer ruleid;
 
     public DiscountBean(){
 
     }
 
-    public DiscountBean(String ruletype, Integer limitcnt, String amount, Integer ruleid) {
+    public DiscountBean(String ruletype, Integer limitcnt, Double amount, Integer ruleid) {
         this.ruletype = ruletype;
         this.limitcnt = limitcnt;
         this.amount = amount;
@@ -43,11 +42,11 @@
         this.limitcnt = limitcnt;
     }
 
-    public String getAmount() {
+    public Double getAmount() {
         return amount;
     }
 
-    public void setAmount(String amount) {
+    public void setAmount(Double amount) {
         this.amount = amount;
     }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceController.java b/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceController.java
index 007d190..032fedf 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceController.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceController.java
@@ -74,7 +74,7 @@
     public JsonResult add(@RequestBody TDevice device) {
         if (device != null) {
 
-            device.setCheckstatus(RestaurantConstant.STATUS_CHECKSTATUS_NORMAL);
+            device.setCheckstatus(RestaurantConstant.STATUS_CHECKSTATUS_UNCHECK);
             return deviceService.saveDevice(device);
         } else {
             return JsonResult.error("添加失败");
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceDiscountRuleController.java b/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceDiscountRuleController.java
index 7003cb4..fca1b27 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceDiscountRuleController.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceDiscountRuleController.java
@@ -178,7 +178,7 @@
         try {
             String[] title = {"市民卡号", "姓名"}; //表头
             String[][] infos = {{"19045632", "张三"}}; // 示例内容
-            ExportExcel.queryexcel("导入名单模板", title, infos, request, response);
+            ExportExcel.queryexcel("餐补导入名单模板", title, infos, request, response);
         } catch (Exception e) {
             e.printStackTrace();
         }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/controller/WhitelistController.java b/src/main/java/com/supwisdom/dlpay/restaurant/controller/WhitelistController.java
index 7325df8..4b618cb 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/controller/WhitelistController.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/controller/WhitelistController.java
@@ -355,4 +355,16 @@
         }
     }
 
+
+    @GetMapping("/whitelist/downloadexcel")
+    @ResponseBody
+    public void downloadWhitelistExcel(HttpServletRequest request, HttpServletResponse response) {
+        try {
+            String[] title = {"市民卡号", "姓名"}; //表头
+            String[][] infos = {{"19045632", "张三"}}; // 示例内容
+            ExportExcel.queryexcel("白名单导入模板", title, infos, request, response);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/dao/TransDtlDao.java b/src/main/java/com/supwisdom/dlpay/restaurant/dao/TransDtlDao.java
index cfb0ade..ee4f01f 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/dao/TransDtlDao.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/dao/TransDtlDao.java
@@ -40,7 +40,7 @@
     @Query(value = "select max(termsqlno) from tb_transdtl where termid=?1 and accdate=?2 ", nativeQuery=true)
     Integer getMaxSqlnoToday(Integer deviceid,String accdate);
 
-    List<TTransDtl> findAllByStatus(String status);
+    List<TTransDtl> findAllByStatusAndTransdate(String status,String date);
 
     TTransDtl getByTransdateAndTermidAndTermsqlno(String transdate,Integer termid,Integer termsqlno);
 
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/dao/WhitelistDevbindDao.java b/src/main/java/com/supwisdom/dlpay/restaurant/dao/WhitelistDevbindDao.java
index e695e5f..2324728 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/dao/WhitelistDevbindDao.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/dao/WhitelistDevbindDao.java
@@ -6,6 +6,8 @@
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 @Repository
 public interface WhitelistDevbindDao extends JpaRepository<TWhitelistDevbind, String> {
 
@@ -21,5 +23,5 @@
   TWhitelistDevbind getWhitelistDevbindById(String id);
 
   @Query("from TWhitelistDevbind where deviceid=?1")
-  TWhitelistDevbind findByDeviceid(Integer deviceid);
+  List<TWhitelistDevbind> findByDeviceid(Integer deviceid);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TOfflineTransDtl.java b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TOfflineTransDtl.java
index b577d52..6b4408a 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TOfflineTransDtl.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TOfflineTransDtl.java
@@ -30,7 +30,8 @@
     private String mealtype;
     private Integer termsqlno;
     private Integer ruleid;
-
+    private String transmode;
+    private String qrcode;
 
 
     @Id
@@ -162,7 +163,7 @@
     }
 
 
-    @Column(name = "attr1",  length = 200)
+    @Column(name = "attr1",  length = 1000)
     public String getAttr1() {
         return attr1;
     }
@@ -228,4 +229,14 @@
     public void setRuleid(Integer ruleid) {
         this.ruleid = ruleid;
     }
+
+    @Column(name = "transmode",   precision = 10)
+    public String getTransmode() {
+        return transmode;
+    }
+
+    public void setTransmode(String transmode) {
+        this.transmode = transmode;
+    }
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TTransDtl.java b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TTransDtl.java
index b44b02e..b14dc93 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TTransDtl.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TTransDtl.java
@@ -170,7 +170,7 @@
   }
 
 
-  @Column(name = "attr1", length = 200)
+  @Column(name = "attr1", length = 1000)
   public String getAttr1() {
     return attr1;
   }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/TransDtlService.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/TransDtlService.java
index e8f6fde..cb9be96 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/TransDtlService.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/TransDtlService.java
@@ -49,7 +49,7 @@
 
 
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
-    List<TTransDtl> getSubmittingTransdtl();
+    List<TTransDtl> getSubmittingTransdtl(String date);
 
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
     Integer getDiscountLimitToday(String termdate,String custid,Integer ruleid);
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/WhitelistService.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/WhitelistService.java
index 55aff30..c8cd0a0 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/WhitelistService.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/WhitelistService.java
@@ -64,6 +64,6 @@
     TWhitelist getWhitelistById(Integer whitelistid);
 
     @Transactional(rollbackFor = Exception.class,readOnly = true)
-    List<TCardver>  getDevBindCardver(Integer deviceid) ;
+    List<TCardver>  getDevBindCardver(Integer deviceid,String cardverno) ;
 
 }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/CustomerServiceImpl.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/CustomerServiceImpl.java
index c85ca25..8687c15 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/CustomerServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/CustomerServiceImpl.java
@@ -46,7 +46,7 @@
 
     @Override
     public PageResult<CustomerShowBean> getCustomerPage(CustomerSearchBean param) {
-        StringBuffer querySql = new StringBuffer("select t.cardno,t.custid,c.custname, " +
+        StringBuffer querySql = new StringBuffer("select t.cardno,c.custid,c.custname, " +
                 "t.bankcardno,t.cardphyid,c.phone,c.custtype,c.checkstatus from tb_customer c " +
                 "left join Tb_card t on t.custid=c.custid where 1=1 ");
         StringBuffer countSql = new StringBuffer("select count(*) as cnt from tb_customer c " +
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceDiscountRuleServiceImpl.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceDiscountRuleServiceImpl.java
index ae15d55..96f7b99 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceDiscountRuleServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceDiscountRuleServiceImpl.java
@@ -158,7 +158,7 @@
 
     private boolean checkRuleTimeError(String starttime, String endtime, String cardno, String custid) {
         Query query = entityManager.createNativeQuery("select count(a.id) from tb_discount_detail a, tb_discount_rule b where a.ruleid=b.ruleid and (b.status='uncheck' or b.status='normal') " +
-                "and a.cardno=:cardno and ((b.starttime<:starttime and b.endtime>:starttime) or (b.starttime<:endtime and b.endtime>:endtime)) ");
+                "and a.cardno=:cardno and ((:starttime between b.starttime and b.endtime) or (:endtime between b.starttime and b.endtime) or (b.starttime>:starttime and b.endtime<:endtime)) ");
         query.setParameter("cardno", cardno);
         query.setParameter("starttime", starttime);
         query.setParameter("endtime", endtime);
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/TransDtlServiceImpl.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/TransDtlServiceImpl.java
index b86ea5c..d19ee55 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/TransDtlServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/TransDtlServiceImpl.java
@@ -54,7 +54,7 @@
     @Override
     public PageResult<TTransDtl> getTransDtlByParam(TransDtlSearchBean param) {
         Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize()
-                , Sort.by("billno"));
+                , Sort.by("billno").descending());
 
         Specification<TTransDtl> spec = gettTransDtlSpecification(param);
 
@@ -225,7 +225,7 @@
             transDtlDao.save(revDtl);
             return revDtl;
         }
-        revDtl.setAcctime(DateUtil.getNow("HHmmss"));
+        revDtl.setAcctime(systemUtilService.getSysdatetime().getHosttime());
         revDtl.setAccdate(date);
         revDtl.setRefno(reverseResp.getRefno());
         transDtlDao.save(revDtl);
@@ -287,8 +287,8 @@
     }
 
     @Override
-    public List<TTransDtl> getSubmittingTransdtl() {
-        return transDtlDao.findAllByStatus(RestaurantConstant.STATUS_TRANSDTL_WAIT);
+    public List<TTransDtl> getSubmittingTransdtl(String date) {
+        return transDtlDao.findAllByStatusAndTransdate(RestaurantConstant.STATUS_TRANSDTL_WAIT,date);
     }
 
     @Override
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/WhitelistServiceImpl.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/WhitelistServiceImpl.java
index 465f1c8..963891a 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/WhitelistServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/WhitelistServiceImpl.java
@@ -312,8 +312,9 @@
 
     @Override
     public TWhitelistDevbind getWhitelistDevbindByDeviceId(Integer id) {
-        if (null != id) {
-            return WhitelistDevbindDao.findByDeviceid(id);
+        List<TWhitelistDevbind> lst= WhitelistDevbindDao.findByDeviceid(id);
+        if(lst.size()>0){
+            return lst.get(0);
         }
         return null;
     }
@@ -378,7 +379,7 @@
             } else if (1 != device.getState()) {
                 throw new WebCheckException("终端编号为[" + id + "]的设备状态异常");
             }
-            TWhitelistDevbind obind = WhitelistDevbindDao.findByDeviceid(id);
+            TWhitelistDevbind obind =getWhitelistDevbindByDeviceId(id);
             if (null != obind) {
                 throw new WebCheckException("终端编号为[" + id + "]的设备已有绑定关系");
             }
@@ -412,13 +413,14 @@
     }
 
     @Override
-    public List<TCardver> getDevBindCardver(Integer deviceid) {
+    public List<TCardver> getDevBindCardver(Integer deviceid,String cardverno) {
         StringBuffer sql = new StringBuffer("SELECT t.cardno,t.cardphyid,t.optype FROM tb_whitelist_detail w " +
                 "left join tb_cardver t on t.cardno=w.cardno and t.cardphyid=w.cardphyid " +
                 "left join tb_whitelist_devbind d on d.whitelistid=w.whitelistid " +
-                "where d.deviceid=:id");
+                "where d.deviceid=:id and t.cardverno>:cardverno");
         Query query = entityManager.createNativeQuery(sql.toString());
         query.setParameter("id", deviceid);
+        query.setParameter("cardverno", cardverno);
         query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(TCardver.class));
         List<TCardver> list = query.getResultList();
         return list;
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/task/RestaurantTask.java b/src/main/java/com/supwisdom/dlpay/restaurant/task/RestaurantTask.java
index deeeac2..3c9e0a2 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/task/RestaurantTask.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/task/RestaurantTask.java
@@ -46,7 +46,7 @@
         searchBean.setCheckstatus(RestaurantConstant.STATUS_CHECKSTATUS_UNCHECK);
 
         List<CustomerShowBean> dtls=customerService.getCustomerPage(searchBean).getData();
-        logger.info("正在同步"+dtls.size()+"名人员");
+        logger.info("正同步"+dtls.size()+"名人员");
         if(dtls.size()>0){
             for(CustomerShowBean dtl:dtls){
                 QueryUserParam param=new QueryUserParam();
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/util/RestaurantConstant.java b/src/main/java/com/supwisdom/dlpay/restaurant/util/RestaurantConstant.java
index 786f0a8..534fa61 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/util/RestaurantConstant.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/util/RestaurantConstant.java
@@ -1,51 +1,51 @@
 package com.supwisdom.dlpay.restaurant.util;
 
 public class RestaurantConstant {
-  public static final String STATUS_DISCOUNTRULE_UNCHECK = "uncheck"; //待审核
-  public static final String STATUS_DISCOUNTRULE_NORMAL = "normal";  //有效
-  public static final String STATUS_DISCOUNTRULE_CLOSED = "closed";   //无效
-  public static final String STATUS_DISCOUNTRULE_REJECT = "reject";   //驳回
+    public static final String STATUS_DISCOUNTRULE_UNCHECK = "uncheck"; //待审核
+    public static final String STATUS_DISCOUNTRULE_NORMAL = "normal";  //有效
+    public static final String STATUS_DISCOUNTRULE_CLOSED = "closed";   //无效
+    public static final String STATUS_DISCOUNTRULE_REJECT = "reject";   //驳回
 
-  public static final String STATUS_CHECKSTATUS_UNCHECK = "uncheck"; //待审核
-  public static final String STATUS_CHECKSTATUS_NORMAL = "normal";  //有效
-  public static final String STATUS_CHECKSTATUS_FAIL = "fail";  //无效
-  public static final String STATUS_CHECKSTATUS_REJECT = "reject";   //驳回
+    public static final String STATUS_CHECKSTATUS_UNCHECK = "uncheck"; //待审核
+    public static final String STATUS_CHECKSTATUS_NORMAL = "normal";  //有效
+    public static final String STATUS_CHECKSTATUS_FAIL = "fail";  //无效
+    public static final String STATUS_CHECKSTATUS_REJECT = "reject";   //驳回
 
-  public static final String TRANSMODE_CARD = "card";  //卡消费
-  public static final String TRANSMODE_CODE = "code";  //二维码消费
+    public static final String TRANSMODE_CARD = "card";  //卡消费
+    public static final String TRANSMODE_CODE = "code";  //二维码消费
 
 
-  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 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_ONLINE = "online";   //联机
+    public static final String TRANSTYPE_TRANSDTL_OFFLINE = "offline";   //脱机
+    public static final String TRANSTYPE_TRANSDTL_REVERT = "revert";   //冲正
 
-  public static final String TRANSTYPE_TRANSDTL_ONLINE = "online";   //联机
-  public static final String TRANSTYPE_TRANSDTL_OFFLINE = "offline";   //脱机
-  public static final String TRANSTYPE_TRANSDTL_REVERT = "revert";   //冲正
+    public static final String MEALTYPE_BREAKFAST = "breakfast";
+    public static final String MEALTYPE_LUNCH = "lunch";
+    public static final String MEALTYPE_DINNER = "dinner";
 
-  public static final String MEALTYPE_BREAKFAST="breakfast";
-  public static final String MEALTYPE_LUNCH="lunch";
-  public static final String MEALTYPE_DINNER="dinner";
+    public static final String STATUS_CARD_NORMAL = "normal";   //正常
+    public static final String STATUS_CARD_LOGOUT = "logout";   //注销
+    public static final String STATUS_CARD_LOST = "lost";   //挂失
+    public static final String STATUS_CARD_FROZEN = "frozen";   //冻结
+    public static final String STATUS_CARD_LOCK = "lock";   //锁卡
+    public static final String STATUS_CARD_EXPIRE = "expire";   //过期
 
-  public static final String STATUS_CARD_NORMAL = "normal";   //正常
-  public static final String STATUS_CARD_LOGOUT= "logout";   //注销
-  public static final String STATUS_CARD_LOST= "lost";   //挂失
-  public static final String STATUS_CARD_FROZEN = "frozen";   //冻结
-  public static final String STATUS_CARD_LOCK= "lock";   //锁卡
-  public static final String STATUS_CARD_EXPIRE= "expire";   //过期
-
-  public static final String OPTYPE_CARD_OPEN= "open";   //开卡
-  public static final String OPTYPE_CARD_DELETE= "delete";   //过期
+    public static final String OPTYPE_CARD_OPEN = "open";   //开卡
+    public static final String OPTYPE_CARD_DELETE = "delete";   //过期
 
 
-  public static final String RULETYPE_QUOTA = "quota"; //定额
-  public static final String RULETYPE_REDUCTION = "reduction"; //减免
-  public static final String RULETYPE_DISCOUNT = "discount"; //折扣
+    public static final String RULETYPE_QUOTA = "quota"; //定额
+    public static final String RULETYPE_REDUCTION = "reduction"; //减免
+    public static final String RULETYPE_DISCOUNT = "discount"; //折扣
 
 
-  public static final int POS_TIME_ERROR_DIFFMINS = 10; //设备时钟误差
+    public static final int POS_TIME_ERROR_DIFFMINS = 10; //设备时钟误差
+    public static final int TRANSDTL_STATUS_WIT=55555;
 
 }
diff --git a/src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt
index 24567ce..4eb8794 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt
@@ -93,7 +93,7 @@
                 it.loginTimestamp = now
                 it.roles = api.roles
                 it.tenantId = tetantId
-                it.token = HmacUtil.HMACSHA256( api.secret,token)
+                it.token = HmacUtil.HMACSHA256( token,api.secret)
             }.also {
                 apiClientRepository.save(it)
             }
diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql
index 3a1691f..c819258 100644
--- a/src/main/resources/data.sql
+++ b/src/main/resources/data.sql
@@ -28,6 +28,7 @@
 INSERT INTO "tb_devpara" (paraname,groupid,maxval,minval,paradesc,paraval,valtype) VALUES ('limit_switch', 1, NULL, NULL, '卡限开关 (0-关闭，1-开启)', '1', 'B');
 INSERT INTO "tb_devpara" (paraname,groupid,maxval,minval,paradesc,paraval,valtype) VALUES ('max_cardbal', 1, '99999999', '1', '最大卡余额 ([1-99999999] 单位:分)', '99999', 'N');
 INSERT INTO "tb_devpara" (paraname,groupid,maxval,minval,paradesc,paraval,valtype) VALUES ('max_offline_days', 1, '90', '0', '脱机使用最大天数 ([1-90] 单位:天)', '7', 'N');
+INSERT INTO "tb_devpara" (paraname,groupid,maxval,minval,paradesc,paraval,valtype) VALUES ('max_day_offline_amt', 1, '99999999', '0', '脱机使用额度 ([1-99999999] 单位:分)', '10000', 'N');
 INSERT INTO "tb_devpara" (paraname,groupid,maxval,minval,paradesc,paraval,valtype) VALUES ('max_pay_cnt', 1, '999999', '1', '卡最大使用次数 ([1-999999])', '65535', 'N');
 INSERT INTO "tb_devpara" (paraname,groupid,maxval,minval,paradesc,paraval,valtype) VALUES ('min_cardbal', 1, '99999', '0', '最小卡余额 ([0-99999] 单位:分)', '1', 'N');
 INSERT INTO "tb_devpara" (paraname,groupid,maxval,minval,paradesc,paraval,valtype) VALUES ('offline_flag', 1, NULL, NULL, '脱机消费时限开关 (0-关闭， 1-开启)', '1', 'B');
@@ -82,7 +83,7 @@
 INSERT INTO "tb_dictionary"(dictval,dicttype,dictcaption,dicttypename) VALUES ('online', 'transtypeList', '联机', '交易类型');
 INSERT INTO "tb_dictionary"(dictval,dicttype,dictcaption,dicttypename) VALUES ('offline', 'transtypeList', '脱机', '交易类型');
 INSERT INTO "tb_dictionary"(dictval,dicttype,dictcaption,dicttypename) VALUES ('revert', 'transtypeList', '冲正', '交易类型');
-INSERT INTO "tb_dictionary"(dictval,dicttype,dictcaption,dicttypename) VALUES ('normal', 'transtatusList', '成功', '流水状态');
+INSERT INTO "tb_dictionary"(dictval,dicttype,dictcaption,dicttypename) VALUES ('success', 'transtatusList', '成功', '流水状态');
 INSERT INTO "tb_dictionary"(dictval,dicttype,dictcaption,dicttypename) VALUES ('fail', 'transtatusList', '失败', '流水状态');
 INSERT INTO "tb_dictionary"(dictval,dicttype,dictcaption,dicttypename) VALUES ('wip', 'transtatusList', '等待', '流水状态');
 INSERT INTO "tb_dictionary"(dictval,dicttype,dictcaption,dicttypename) VALUES ('init', 'transtatusList', '初始化', '流水状态');
diff --git a/src/main/resources/templates/restaurant/devicecheck/index.html b/src/main/resources/templates/restaurant/devicecheck/index.html
index 76ba2b0..6fb39e4 100644
--- a/src/main/resources/templates/restaurant/devicecheck/index.html
+++ b/src/main/resources/templates/restaurant/devicecheck/index.html
@@ -56,7 +56,6 @@
                     {field: 'devphyid', sort: true, width: 200, title: '设备物理id'},
                     {field: 'shopid', sort: true, width: 200, title: '商户id'},
                     {field: 'factoryid', sort: true, width: 200, title: '设备厂商'},
-                    {field: 'state', title: '状态', sort: true, width: 100, templet: '#device-dev-tpl-state'},
                     {
                         field: 'checkstatus',
                         title: '审核状态',
diff --git a/src/main/resources/templates/restaurant/discountrule/rulecheck.html b/src/main/resources/templates/restaurant/discountrule/rulecheck.html
index 8895539..75bcab1 100644
--- a/src/main/resources/templates/restaurant/discountrule/rulecheck.html
+++ b/src/main/resources/templates/restaurant/discountrule/rulecheck.html
@@ -63,6 +63,8 @@
                                     return '定额';
                                 } else if ('reduction' == d.ruletype) {
                                     return '减免';
+                                } else if('discount' == d.ruletype){
+                                    return '折扣';
                                 } else {
                                     return d.ruletype;
                                 }
diff --git a/src/main/resources/templates/restaurant/transdtl/index.html b/src/main/resources/templates/restaurant/transdtl/index.html
index 9fb62b3..2b3ca6f 100644
--- a/src/main/resources/templates/restaurant/transdtl/index.html
+++ b/src/main/resources/templates/restaurant/transdtl/index.html
@@ -136,35 +136,9 @@
                     {field: 'billno', title: '交易号', fixed: 'left',width:200, sort: true},
                     {field: 'amount', title: '交易金额',width:100, sort: true,
                         templet: function (item) {
-                            return numberFormat(item.amount,2);
+                            return parseFloat(item.amount).toFixed(2);
                         }},
                     {
-                        field: 'accdate',
-                        title: '交易日期',
-                        sort: true,
-                        width:120,
-                        templet: function (item) {
-                            var date = item.accdate;
-                            if (date != null) {
-                                return date.substr(0, 4) + '-' + date.substr(4, 2) + '-' + date.substr(6, 2);
-                            }
-                            return '';
-                        }
-                    },
-                    {
-                        field: 'acctime',
-                        title: '交易时间',
-                        sort: true,
-                        width:100,
-                        templet: function (item) {
-                            var time = item.transtime;
-                            if (time != null) {
-                                return time.substr(0, 2) + ':' + time.substr(2, 2) + ':' + time.substr(4, 2);
-                            }
-                            return '';
-                        }
-                    },
-                    {
                         field: 'transdate',
                         title: '交易日期',
                         sort: true,
@@ -190,6 +164,32 @@
                             return '';
                         }
                     },
+                    {
+                        field: 'accdate',
+                        title: '记账日期',
+                        sort: true,
+                        width:120,
+                        templet: function (item) {
+                            var date = item.accdate;
+                            if (date != null) {
+                                return date.substr(0, 4) + '-' + date.substr(4, 2) + '-' + date.substr(6, 2);
+                            }
+                            return '';
+                        }
+                    },
+                    {
+                        field: 'acctime',
+                        title: '记账时间',
+                        sort: true,
+                        width:100,
+                        templet: function (item) {
+                            var time = item.transtime;
+                            if (time != null) {
+                                return time.substr(0, 2) + ':' + time.substr(2, 2) + ':' + time.substr(4, 2);
+                            }
+                            return '';
+                        }
+                    },
                     {field: 'termid',width:100, title: '终端号', sort: true},
                     {
                         field: 'shopid',
diff --git a/src/main/resources/templates/restaurant/whitelist/whitelistform.html b/src/main/resources/templates/restaurant/whitelist/whitelistform.html
index 23e4133..aaba071 100644
--- a/src/main/resources/templates/restaurant/whitelist/whitelistform.html
+++ b/src/main/resources/templates/restaurant/whitelist/whitelistform.html
@@ -17,7 +17,7 @@
             </button>
         </div>
         <div class="layui-input-inline" style="padding-top: 15px;">
-            <a th:href="@{/discountrule/downloadexcel}" style="color: blue;text-decoration: none;cursor: pointer;">下载名单模板</a>
+            <a th:href="@{/whitelist/downloadexcel}" style="color: blue;text-decoration: none;cursor: pointer;">下载名单模板</a>
         </div>
     </div>
 
diff --git a/src/test/kotlin/com/supwisdom/dlpay/controller/PosPayServiceTest.java b/src/test/kotlin/com/supwisdom/dlpay/controller/PosPayServiceTest.java
index b6e3c5f..ed1913e 100644
--- a/src/test/kotlin/com/supwisdom/dlpay/controller/PosPayServiceTest.java
+++ b/src/test/kotlin/com/supwisdom/dlpay/controller/PosPayServiceTest.java
@@ -3,10 +3,7 @@
 
 import com.supwisdom.dlpay.api.bean.*;
 import com.supwisdom.dlpay.paysdk.ApiLoginHelper;
-import com.supwisdom.dlpay.paysdk.proxy.ApiLoginProxy;
-import com.supwisdom.dlpay.paysdk.proxy.CitizenCardPayProxy;
-import com.supwisdom.dlpay.paysdk.proxy.ShopProxy;
-import com.supwisdom.dlpay.paysdk.proxy.UserProxy;
+import com.supwisdom.dlpay.paysdk.proxy.*;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
@@ -42,6 +39,9 @@
     private ApiLoginProxy apiLoginProxy;
 
     @Autowired
+    private ConsumePropxy consumePropxy;
+
+    @Autowired
     private UserProxy userProxy;
 
     @Autowired
@@ -101,4 +101,16 @@
 
 
     }
+
+
+    @org.junit.Test
+    public void getQrcode() {
+        ApiLoginHelper helper = new ApiLoginHelper(apiLoginProxy);
+        helper.login(appid, secret);
+        DoorQRCodeParam qrparam = new DoorQRCodeParam();
+        qrparam.setQrcode("9BZ0ORIOTBLDGPX9C60ORQ");
+        DoorQrcodeResponse qrcoderesp = consumePropxy.qrcodequery(qrparam);
+        System.out.println(qrcoderesp.getCitycardno()+":"+qrcoderesp.getCardphyid());
+    }
+
 }
