diff --git a/config/application-devel-pg.properties b/config/application-devel-pg.properties
index 22ed8fd..6a1a4cd 100644
--- a/config/application-devel-pg.properties
+++ b/config/application-devel-pg.properties
@@ -4,7 +4,7 @@
 spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false
 spring.datasource.continue-on-error=true
 #spring.datasource.initialization-mode=always
-#spring.jpa.show-sql=true
+spring.jpa.show-sql=true
 #logging.level.org.hibernate.SQL=DEBUG
 # Postgresql settings
 spring.datasource.platform=postgresql
diff --git a/src/main/java/com/supwisdom/dlpay/api/bean/PosPayInitReq.java b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayInitReq.java
index 1f9e728..1069009 100644
--- a/src/main/java/com/supwisdom/dlpay/api/bean/PosPayInitReq.java
+++ b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayInitReq.java
@@ -11,6 +11,7 @@
   private String termtime;
   @SignField
   private String qrcode;
+  private Integer amount;
   @SignField
   private String cardno;
   @SignField
@@ -108,7 +109,15 @@
   }
 
   public void setSign_method(String sign_method) {
+
     this.sign_method = sign_method;
   }
 
+  public Integer getAmount() {
+    return amount;
+  }
+
+  public void setAmount(Integer amount) {
+    this.amount = amount;
+  }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/api/service/PayApiService.java b/src/main/java/com/supwisdom/dlpay/api/service/PayApiService.java
deleted file mode 100644
index 9f032ad..0000000
--- a/src/main/java/com/supwisdom/dlpay/api/service/PayApiService.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.supwisdom.dlpay.api.service;
-
-import com.supwisdom.dlpay.api.bean.CitizenCardPayfinishParam;
-import com.supwisdom.dlpay.api.bean.CitizenCardPayinitParam;
-import com.supwisdom.dlpay.api.bean.CitizenPayResponse;
-
-public interface PayApiService {
-    CitizenPayResponse citizencardPayinit(CitizenCardPayinitParam param);
-
-    CitizenPayResponse citizencardPayFinish( CitizenCardPayfinishParam param);
-
-}
diff --git a/src/main/java/com/supwisdom/dlpay/api/service/impl/PayApiServiceImpl.java b/src/main/java/com/supwisdom/dlpay/api/service/impl/PayApiServiceImpl.java
deleted file mode 100644
index f3c454a..0000000
--- a/src/main/java/com/supwisdom/dlpay/api/service/impl/PayApiServiceImpl.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package com.supwisdom.dlpay.api.service.impl;
-
-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.service.PayApiService;
-import com.supwisdom.dlpay.framework.dao.ApiClientDao;
-import com.supwisdom.dlpay.framework.domain.TApiClient;
-import com.supwisdom.dlpay.framework.util.StringUtil;
-import com.supwisdom.dlpay.paysdk.ApiLoginHelper;
-import com.supwisdom.dlpay.paysdk.proxy.ApiLoginProxy;
-import com.supwisdom.dlpay.paysdk.proxy.CitizenCardPayProxy;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.cloud.openfeign.EnableFeignClients;
-import org.springframework.context.annotation.ComponentScan;
-import org.springframework.stereotype.Service;
-
-/*
-@EnableFeignClients(basePackages = "com.supwisdom.dlpay.paysdk")
-@ComponentScan(basePackages = {"com.supwisdom.dlpay.paysdk"})*/
-@Service
-public class PayApiServiceImpl implements PayApiService {
-
-    @Value("${payapi.url}")
-    private String payapiurl;
-
-    @Value("${payapi.appid}")
-    private String appid;
-
-    @Autowired
-    private ApiClientDao apiClientDao;
-
-    @Autowired
-    private ApiLoginProxy apiLoginProxy;
-
-    @Autowired
-    private CitizenCardPayProxy citizenCardPayProxy;
-
-    @Override
-    public CitizenPayResponse citizencardPayinit(CitizenCardPayinitParam param) {
-        CitizenPayResponse resp = citizenCardPayProxy.citizencardPayinit(param);
-        return resp;
-    }
-
-    @Override
-    public CitizenPayResponse citizencardPayFinish(CitizenCardPayfinishParam param) {
-        CitizenPayResponse resp =citizenCardPayProxy.citizencardPayFinish(param);
-        return resp;
-    }
-}
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 d733c84..35480c1 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
@@ -1,7 +1,6 @@
 package com.supwisdom.dlpay.api.service.impl;
 
 import com.supwisdom.dlpay.api.bean.*;
-import com.supwisdom.dlpay.api.service.PayApiService;
 import com.supwisdom.dlpay.api.service.PosPayService;
 import com.supwisdom.dlpay.framework.dao.BusinessparaDao;
 import com.supwisdom.dlpay.framework.domain.TBusinesspara;
@@ -12,6 +11,7 @@
 import com.supwisdom.dlpay.framework.util.MoneyUtil;
 import com.supwisdom.dlpay.framework.util.StringUtil;
 import com.supwisdom.dlpay.paysdk.proxy.CitizenCardPayProxy;
+import com.supwisdom.dlpay.paysdk.proxy.ConsumePropxy;
 import com.supwisdom.dlpay.paysdk.proxy.TransactionProxy;
 import com.supwisdom.dlpay.restaurant.bean.DiscountBean;
 import com.supwisdom.dlpay.restaurant.bean.ManageFeeAmtBean;
@@ -57,8 +57,6 @@
     @Autowired
     private BusinessparaDao businessparaDao;
     @Autowired
-    private PayApiService payApiService;
-    @Autowired
     private DiscountRuleDao discountRuleDao;
     @Autowired
     private DeviceDiscountRuleService deviceDiscountRuleService;
@@ -66,6 +64,8 @@
     private CitizenCardPayProxy citizenCardPayProxy;
     @Autowired
     private TransactionProxy transactionProxy;
+    @Autowired
+    private ConsumePropxy consumePropxy;
 
 
     @Override
@@ -142,12 +142,12 @@
             resp.setRetmsg("卡号[" + req.getCardno() + "]不存在");
             return resp;
         }
-        if (!tCard.getStatus().equals(RestaurantConstant.STATUS_CARD_NORMAL)){
+        if (!RestaurantConstant.STATUS_CARD_NORMAL.equals(tCard.getStatus())){
             resp.setRetcode(ErrorCode.ERRIF_CARD_DISABLED);
             resp.setRetmsg("卡号[" + req.getCardno() + "]已注销");
             return resp;
         }
-        if(!tCard.getTransstatus().equals(RestaurantConstant.STATUS_CARD_NORMAL)){
+        if(!RestaurantConstant.STATUS_CARD_NORMAL.equals(tCard.getTransstatus())){
             resp.setRetmsg("卡号[" + req.getCardno() + "]状态异常;");
             resp.setRetcode(ErrorCode.ERRIF_CARD_DISABLED);
             return resp;
@@ -178,13 +178,24 @@
 
         tTransdtl.setCusttype(customer.getCusttype());
         tTransdtl.setTransdate(req.getTermdate());
+
+        Double amount=req.getAmount() / 100.0;
+
+        DiscountBean bean=deviceDiscountRuleService.getCustomerDiscount(tDevice.getId(),req.getTermtime(), customer.getCustid());
+        if(null!=bean){
+            tTransdtl.setRuleid(bean.getRuleid());
+            amount = getDiscountAmount(req.getTermdate(), customer.getCustid(), amount, bean);
+        }
+        tTransdtl.setAmount(amount);
+        tTransdtl.setManagefee(managefee);
         tTransdtl.setTranstime(req.getTermtime());
         tTransdtl.setCardno(req.getCardno());
         tTransdtl.setTransmode(req.getTranstype());
+
         tTransdtl.setTranstype(RestaurantConstant.TRANSTYPE_TRANSDTL_ONLINE);
         tTransdtl.setTermsqlno(req.getTermseqno());
-        tTransdtl.setAmount(0D);
         tTransdtl.setManagefee(0.0);
+
         tTransdtl.setRevflag(0);
 
         List<TMealtype> mealtypes = mealTypeDao.findAllByOrderByEndtime();
@@ -216,7 +227,7 @@
         transDtlService.saveTransdtl(tTransdtl);
 
         resp.setBillno(tTransdtl.getBillno());
-        resp.setRetcode(ErrorCode.ERRIF_OK);
+
         resp.setAnonymous(false);
         resp.setNeedpwdconfirm(false);
         resp.setSourcetype("pos");
@@ -227,6 +238,21 @@
         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){
+
+            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());
+            }
+        }
+        return amount;
+    }
+
     @Override
     public PosPayConfirmResp doPayConfirm(PosPayConfirmReq req) {
         PosPayConfirmResp resp = new PosPayConfirmResp();
@@ -252,61 +278,66 @@
             return resp;
         }
 
-        Double extamount = 0.0;
-        Double amount=req.getAmount() / 100.0;
-
-        DiscountBean bean=deviceDiscountRuleService.getCustomerDiscount(tDevice.getId(),req.getTermtime(), cus.getCustid());
-        if(null!=bean){
-            Integer limit=transDtlService.getDiscountLimitToday(req.getTermdate(),cus.getCustid(),bean.getRuleid());
-            if(bean.getLimitcnt()>=limit){
-                tTransdtl.setRuleid(bean.getRuleid());
-                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());
-                }
-            }
-        }
-
-        tTransdtl.setAmount(amount);
-        tTransdtl.setManagefee(extamount); //managefeetype :mealer discount
         tTransdtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_WAIT);
         TTransDtl dtl=transDtlService.saveTransdtl(tTransdtl);
 
-        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);
+        if(RestaurantConstant.TRANSMODE_CODE.equals(dtl.getTransmode())){
+            QrcodePayParam param=new QrcodePayParam();
+            param.setAmount(MoneyUtil.YuanToFen(tTransdtl.getAmount()));
+            param.setBillno(tTransdtl.getBillno());
+            param.setShopaccno(tTransdtl.getShopid());
+            param.setTransdate(tTransdtl.getTransdate());
+            param.setTranstime(tTransdtl.getTranstime());
+            param.setDtltype("canteen");
+            param.setAnonymous(true);
+            QrcodePayResponse qrcoderesp=consumePropxy.qrcodePayInit(param);
+            if(qrcoderesp.getRetcode() == 0){
+                tTransdtl.setRefno(qrcoderesp.getRefno());
                 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());
+                tTransdtl.setAttr1(qrcoderesp.getRetmsg()+","+qrcoderesp.getException());
+                resp.setRetcode(qrcoderesp.getRetcode().toString());
+                resp.setRetmsg(qrcoderesp.getRetmsg());
             }
+
         }else{
-            tTransdtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_FAIL);
-            tTransdtl.setAttr1(response.getRetmsg()+","+response.getException());
-            resp.setRetcode(response.getRetcode().toString());
-            resp.setRetmsg(response.getRetmsg());
+            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{
+                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;
         resp.setAmount(retAmount.intValue());
@@ -365,8 +396,7 @@
             resp.setRetmsg("交易参考号" + req.getReversalbillno() + "不存在");
             return resp;
         }
-        if (!tTransDtl.getStatus().toUpperCase().equals(
-                RestaurantConstant.STATUS_TRANSDTL_SUCCESS.toUpperCase())) {
+        if (!RestaurantConstant.STATUS_TRANSDTL_SUCCESS.toUpperCase().equals(tTransDtl.getStatus().toUpperCase())) {
            /* tTransDtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_FAIL);
             tTransDtl.setAttr1("交易状态未成功");*/
             resp.setRetcode(ErrorCode.ERRIF_POSDTL_NOTEXIST);
@@ -593,29 +623,26 @@
     public PosPayOfflineDtlResp saveOfflineDtl(PosPayOfflineDtlReq req) {
         PosPayOfflineDtlResp resp=new PosPayOfflineDtlResp();
         TOfflineTransDtl transDtl=new TOfflineTransDtl();
-        transDtl.setAccdate(req.getTransdate());
-        transDtl.setAcctime(req.getTranstime());
         transDtl.setTransdate(req.getTransdate());
         transDtl.setTranstime(req.getTranstime());
-        transDtl.setAmount(req.getAmount()/100.0);
+
         transDtl.setBillno(systemUtilService.getRefno());
         transDtl.setCardno(req.getCardno());
         transDtl.setRevflag(0);
+
         List<TMealtype> mealtypes = mealTypeDao.findAllByOrderByEndtime();
         transDtl.setTermsqlno(req.getTermseqno());
         String err="";
         TDevice device = deviceService.getDeviceByDevphyid(req.getDevphyid());
         if (null == device) {
             err+="设备物理ID不存在;";
-
+            transDtl.setAttr1(err);
+            offlineTransDtlService.saveTransdtl(transDtl);
+            resp.setRetmsg("保存成功");
+            resp.setRetcode(ErrorCode.ERRIF_OK);
+            return resp;
         }
-        if (device.getState() != 1) {
-            err+="设备状态错误;";
-        }else{
-            transDtl.setTermid(device.getId());
-            transDtl.setShopid(device.getShopid());
-        }
-
+        Double amount=req.getAmount()/100.0;
         TCard tCard = cardService.getCardByCardnoAndCardphyid(req.getCardno(), req.getCardphyid());
         if (null == tCard) {
             err+="卡号[" + req.getCardno() + "]不存在;";
@@ -626,9 +653,26 @@
             } else {
                 transDtl.setCustid(customer.getCustid());
                 transDtl.setCustname(customer.getCustname());
+                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);
+                }
             }
         }
 
+        transDtl.setAmount(amount);
+
+
+        if (device.getState() != 1) {
+            err+="设备状态错误;";
+        }else{
+            transDtl.setTermid(device.getId());
+            transDtl.setShopid(device.getShopid());
+        }
+
+
+
       /*  TCustomer customer=customerService.getCustomerByCustid(tCard.getCustid());
         if(null==customer){
             err+="卡对应人员不存在;";
@@ -663,8 +707,7 @@
             if (null == tTransDtl) {
                 err+=("终端参考号" + req.getReversaltermseqno() + "不存在;");
             }else{
-                if (!tTransDtl.getStatus().toUpperCase().equals(
-                        RestaurantConstant.STATUS_TRANSDTL_SUCCESS.toUpperCase())) {
+                if (!RestaurantConstant.STATUS_TRANSDTL_SUCCESS.toUpperCase().equals(tTransDtl.getStatus().toUpperCase())) {
                     err+=("交易状态未成功;");
                 }
                 if (tTransDtl.getRevflag() == 1) {
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 40ce54c..3cb42e0 100644
--- a/src/main/java/com/supwisdom/dlpay/api/task/PosPayTask.java
+++ b/src/main/java/com/supwisdom/dlpay/api/task/PosPayTask.java
@@ -3,8 +3,6 @@
 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.service.PayApiService;
-import com.supwisdom.dlpay.api.service.PosPayService;
 import com.supwisdom.dlpay.framework.util.DateUtil;
 import com.supwisdom.dlpay.paysdk.proxy.CitizenCardPayProxy;
 import com.supwisdom.dlpay.restaurant.dao.TransDtlDao;
@@ -38,13 +36,34 @@
     @Autowired
     private CitizenCardPayProxy citizenCardPayProxy;
 
- /*   @Scheduled(cron = "${cron.offlinedtl}")
+    @Scheduled(cron = "${cron.offlinedtl}")
     private void submitOfflineDtlTask(){
         String date=DateUtil.getNow("yyyyMMdd");
         List<TOfflineTransDtl> dtls=offlineTransDtlService.getUncheckOfflineTransdtl(date);
         logger.info("正在上传"+dtls.size()+"笔流水");
         if(dtls.size()>0){
             for(TOfflineTransDtl dtl:dtls){
+
+                TTransDtl tTransDtl=new TTransDtl();
+                tTransDtl.setManagefee(dtl.getManagefee());
+                tTransDtl.setTransmode("offline");
+                tTransDtl.setAmount(dtl.getAmount());
+                tTransDtl.setCardno(dtl.getCardno());
+                tTransDtl.setStatus(dtl.getStatus());
+                tTransDtl.setBillno(dtl.getBillno());
+                tTransDtl.setTermsqlno(dtl.getTermsqlno());
+                tTransDtl.setMealtype(dtl.getMealtype());
+                tTransDtl.setCusttype(dtl.getCusttype());
+                tTransDtl.setShopid(dtl.getShopid());
+                tTransDtl.setTransdate(dtl.getTransdate());
+                tTransDtl.setTranstime(dtl.getTranstime());
+                tTransDtl.setCustname(dtl.getCustname());
+                tTransDtl.setTermid(dtl.getTermid());
+                tTransDtl.setRuleid(dtl.getRuleid());
+                tTransDtl.setManagefee(dtl.getManagefee());
+
+
+
                 CitizenCardPayinitParam param=new CitizenCardPayinitParam();
                 param.setBillno(dtl.getBillno());
                 param.setShopaccno(dtl.getShopid());
@@ -78,6 +97,6 @@
 
         }
 
-    }*/
+    }
 
 }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/bean/CustomerSearchBean.java b/src/main/java/com/supwisdom/dlpay/restaurant/bean/CustomerSearchBean.java
index fbc88d8..06986ef 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/bean/CustomerSearchBean.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/bean/CustomerSearchBean.java
@@ -4,6 +4,7 @@
 
 public class CustomerSearchBean extends PageBean {
     private String custname;
+    private String checkstatus;
 
     public String getCustname() {
         return custname;
@@ -12,4 +13,12 @@
     public void setCustname(String custname) {
         this.custname = custname;
     }
+
+    public String getCheckstatus() {
+        return checkstatus;
+    }
+
+    public void setCheckstatus(String checkstatus) {
+        this.checkstatus = checkstatus;
+    }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/controller/CustomerController.java b/src/main/java/com/supwisdom/dlpay/restaurant/controller/CustomerController.java
index 38435b8..b1be118 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/controller/CustomerController.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/controller/CustomerController.java
@@ -64,7 +64,7 @@
             searchBean.setPageNo(pageNo);
             searchBean.setCustname(searchKey);
             searchBean.setPageSize(pageSize);
-            PageResult<CustomerShowBean> bean= customerService.getCustomerByCustname(searchBean);
+            PageResult<CustomerShowBean> bean= customerService.getCustomerPage(searchBean);
 
             return bean;
         } catch (Exception e) {
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCustomer.java b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCustomer.java
index e6070a4..5a107d4 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCustomer.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCustomer.java
@@ -20,6 +20,7 @@
     private String batchno;
     private String lastsaved;
     private String status;
+    private String checkstatus;
 
     @Id
     @GenericGenerator(name = "idGenerator", strategy = "uuid")
@@ -118,4 +119,14 @@
     public void setStatus(String status) {
         this.status = status;
     }
+
+
+    @Column(name = "checkstatus", length = 10)
+    public String getCheckstatus() {
+        return checkstatus;
+    }
+
+    public void setCheckstatus(String checkstatus) {
+        this.checkstatus = checkstatus;
+    }
 }
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 a0f6a33..b577d52 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TOfflineTransDtl.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TOfflineTransDtl.java
@@ -29,6 +29,7 @@
     private Double managefee;
     private String mealtype;
     private Integer termsqlno;
+    private Integer ruleid;
 
 
 
@@ -217,4 +218,14 @@
     public void setManagefee(Double managefee) {
         this.managefee = managefee;
     }
+
+
+    @Column(name = "ruleid",   precision = 9)
+    public Integer getRuleid() {
+        return ruleid;
+    }
+
+    public void setRuleid(Integer ruleid) {
+        this.ruleid = ruleid;
+    }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/CardService.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/CardService.java
index 742f0b4..466ad11 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/CardService.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/CardService.java
@@ -27,6 +27,8 @@
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     TCard getCardByCardnoAndCardphyid(String cardno,String Cardphyid);
 
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    TCard getCardByCardno(String cardno);
 
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     String getMaxCarcver();
@@ -36,4 +38,6 @@
     List<TCardver> getCardlistByTCardVer(String cardverno);
 
 
+
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/CustomerService.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/CustomerService.java
index d22b33a..a1197e1 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/CustomerService.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/CustomerService.java
@@ -18,7 +18,7 @@
 
 public interface CustomerService {
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
-    PageResult<CustomerShowBean> getCustomerByCustname(CustomerSearchBean param);
+    PageResult<CustomerShowBean> getCustomerPage(CustomerSearchBean param);
 
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
     TCustomer getCustomerByCustid(String custid);
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/CardServiceImpl.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/CardServiceImpl.java
index 903a26f..5e64630 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/CardServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/CardServiceImpl.java
@@ -48,6 +48,17 @@
     }
 
     @Override
+    public TCard getCardByCardno(String cardno) {
+        Optional<TCard> card=cardDao.findById(cardno);
+        if(card.isPresent()){
+            return card.get();
+
+        }
+        return null;
+    }
+
+
+    @Override
     public String getMaxCarcver() {
         return cardverDao.getMaxCardverno();
     }
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 540dc9f..b5cd08d 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
@@ -49,16 +49,20 @@
     private EntityManager entityManager;
 
     @Override
-    public PageResult<CustomerShowBean> getCustomerByCustname(CustomerSearchBean param) {
+    public PageResult<CustomerShowBean> getCustomerPage(CustomerSearchBean param) {
         StringBuffer querySql = new StringBuffer("select t.cardno,t.custid,c.custname, " +
                 "t.bankcardno,t.cardphyid,c.phone,c.custtype from Tb_card t " +
-                "left join tb_customer c on t.custid=c.custid where t.status='normal'");
+                "left join tb_customer c on t.custid=c.custid where 1=1 ");
         StringBuffer countSql = new StringBuffer("select count(*) as cnt from Tb_card t " +
-                "left join tb_customer c on t.custid=c.custid where t.status='normal'");
+                "left join tb_customer c on t.custid=c.custid where 1=1 ");
         if (!StringUtil.isEmpty(param.getCustname())) {
             querySql.append(" and  c.custname like :str ");
             countSql.append(" and  c.custname like :str ");
         }
+        if (!StringUtil.isEmpty(param.getCheckstatus())) {
+            querySql.append(" and  c.checkstatus = :checkstatus ");
+            countSql.append(" and  c.checkstatus = :checkstatus ");
+        }
         querySql.append(" order by t.cardno ");
         Query query = entityManager.createNativeQuery(querySql.toString());
         Query countQuery = entityManager.createNativeQuery(countSql.toString());
@@ -66,6 +70,10 @@
             query.setParameter("str", "%" + param.getCustname().trim() + "%");
             countQuery.setParameter("str", "%" + param.getCustname().trim() + "%");
         }
+        if (!StringUtil.isEmpty(param.getCheckstatus())) {
+            query.setParameter("checkstatus",  param.getCheckstatus().trim() );
+            countQuery.setParameter("checkstatus", param.getCheckstatus().trim());
+        }
         query.setFirstResult((param.getPageNo() - 1) * param.getPageSize());
         query.setMaxResults(param.getPageSize()); //分页显示
         query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(CustomerShowBean.class));
@@ -105,11 +113,11 @@
         cus.setIdno(customer.getIdno());
         cus.setIdtype(customer.getIdtype());
         cus.setStatus(RestaurantConstant.STATUS_CARD_NORMAL);
+        cus.setCheckstatus(RestaurantConstant.STATUS_CHECKSTATUS_UNCHECK);
         cus = customerDao.save(cus);
         if (null != cus) {
             String cardverno = systemUtilService.getCardverno();
             String date = DateUtil.getNow("yyyyMMdd");
-
             card.setCardno(customer.getCardno());
             card.setOpendate(date);
             card.setCustid(cus.getCustid());
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 714b0e9..935a6b0 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
@@ -75,19 +75,19 @@
                         list.add(cb.like(root.get("custname").as(String.class), "%" + param.getCustname() + "%"));
                     }
                     if (!StringUtil.isEmpty(param.getStartdate())) {
-                        list.add(cb.greaterThanOrEqualTo(root.get("accdate").as(String.class), param.getStartdate()));
+                        list.add(cb.greaterThanOrEqualTo(root.get("transdate").as(String.class), param.getStartdate()));
                     }
                     if (!StringUtil.isEmpty(param.getEnddate())) {
-                        list.add(cb.lessThanOrEqualTo(root.get("accdate").as(String.class), param.getEnddate()));
+                        list.add(cb.lessThanOrEqualTo(root.get("transdate").as(String.class), param.getEnddate()));
                     }
                     if (!StringUtil.isEmpty(param.getAccdate())) {
                         list.add(cb.equal(root.get("accdate").as(String.class), param.getAccdate()));
                     }
-                    if (null!=param.getShopid()) {
-                        list.add(cb.equal(root.get("shopid").as(String.class), param.getShopid().toString()));
+                    if (!StringUtil.isEmpty(param.getShopid())) {
+                        list.add(cb.equal(root.get("shopid").as(String.class), param.getShopid()));
                     }
-                    if (null!=param.getStatus()) {
-                        list.add(cb.equal(root.get("status").as(String.class), param.getStatus().toString()));
+                    if (!StringUtil.isEmpty(param.getStatus())) {
+                        list.add(cb.equal(root.get("status").as(String.class), param.getStatus()));
                     }
                     if (null!=param.getTermid()) {
                         list.add(cb.like(root.get("termid").as(String.class), param.getTermid().toString()));
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/task/RestaurantTask.java b/src/main/java/com/supwisdom/dlpay/restaurant/task/RestaurantTask.java
new file mode 100644
index 0000000..bd5dae2
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/task/RestaurantTask.java
@@ -0,0 +1,79 @@
+package com.supwisdom.dlpay.restaurant.task;
+
+import com.supwisdom.dlpay.api.bean.*;
+import com.supwisdom.dlpay.framework.util.DateUtil;
+import com.supwisdom.dlpay.paysdk.proxy.CitizenCardPayProxy;
+import com.supwisdom.dlpay.paysdk.proxy.UserProxy;
+import com.supwisdom.dlpay.restaurant.bean.CustomerSearchBean;
+import com.supwisdom.dlpay.restaurant.bean.CustomerShowBean;
+import com.supwisdom.dlpay.restaurant.dao.CustomerDao;
+import com.supwisdom.dlpay.restaurant.domain.TCard;
+import com.supwisdom.dlpay.restaurant.domain.TCustomer;
+import com.supwisdom.dlpay.restaurant.domain.TOfflineTransDtl;
+import com.supwisdom.dlpay.restaurant.service.CardService;
+import com.supwisdom.dlpay.restaurant.service.CustomerService;
+import com.supwisdom.dlpay.restaurant.service.OfflineTransDtlService;
+import com.supwisdom.dlpay.restaurant.service.TransDtlService;
+import com.supwisdom.dlpay.restaurant.util.RestaurantConstant;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component
+@Configuration
+@EnableScheduling
+public class RestaurantTask {
+    private static final Logger logger = LoggerFactory.getLogger(RestaurantTask.class);
+
+    @Autowired
+    private CardService cardService;
+    @Autowired
+    private CustomerService customerService;
+    @Autowired
+    private CustomerDao customerDao;
+    @Autowired
+    private UserProxy userProxy;
+
+    @Scheduled(cron = "0 0/5 * * * ? ")
+    private void CustomerCheckTask(){
+        CustomerSearchBean searchBean=new CustomerSearchBean();
+        searchBean.setCheckstatus(RestaurantConstant.STATUS_CHECKSTATUS_UNCHECK);
+
+        List<CustomerShowBean> dtls=customerService.getCustomerPage(searchBean).getData();
+        logger.info("正在同步"+dtls.size()+"名人员");
+        if(dtls.size()>0){
+            for(CustomerShowBean dtl:dtls){
+                QueryUserParam param=new QueryUserParam();
+                param.setCitizencardno(dtl.getCardno());
+                UserInforResponse resp=userProxy.querybycardno(param);
+                TCustomer customer=customerService.getCustomerByCustid(dtl.getCustid());
+
+                if(resp.getRetcode()==0){
+                    TCard card=cardService.getCardByCardno(dtl.getCardno());
+                    if(null!=card){
+                        card.setStatus(resp.getCardstatus());
+                        card.setTransstatus(resp.getTransstatus());
+                        cardService.saveCard(card);
+                    }
+                    customer.setCheckstatus(RestaurantConstant.STATUS_CHECKSTATUS_NORMAL);
+                    customer.setStatus(RestaurantConstant.STATUS_CARD_NORMAL);
+                }else{
+                    customer.setCheckstatus(RestaurantConstant.STATUS_CHECKSTATUS_FAIL);
+                    customer.setStatus(RestaurantConstant.STATUS_CARD_NORMAL);
+                }
+                customerDao.save(customer);
+
+
+            }
+
+        }
+
+    }
+
+}
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 c93865e..beb84bc 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/util/RestaurantConstant.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/util/RestaurantConstant.java
@@ -6,6 +6,14 @@
   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 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";   //已入账
diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql
index 1c184dd..94e2492 100644
--- a/src/main/resources/data.sql
+++ b/src/main/resources/data.sql
@@ -84,7 +84,8 @@
 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 ('fail', 'transtatusList', '失败', '流水状态');
-INSERT INTO "tb_dictionary"(dictval,dicttype,dictcaption,dicttypename) VALUES ('wit', 'transtatusList', '等待', '流水状态');
+INSERT INTO "tb_dictionary"(dictval,dicttype,dictcaption,dicttypename) VALUES ('wip', 'transtatusList', '等待', '流水状态');
+INSERT INTO "tb_dictionary"(dictval,dicttype,dictcaption,dicttypename) VALUES ('init', 'transtatusList', '初始化', '流水状态');
 
 
 INSERT INTO "tb_function"(id,createtime,isleaf,lastsaved,menuicon,menuurl,name,ordernum,parentid) VALUES (3, NULL, 0, NULL, 'layui-icon-set', '#', '系统中心', 2, -1);
@@ -413,7 +414,7 @@
 INSERT INTO "tb_role_function" (id,functionid,permissions,roleid) VALUES ('297e0a7e6bd65d7c016bd67401e10087', 29, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
 INSERT INTO "tb_role_function" (id,functionid,permissions,roleid) VALUES ('297e0a7e6bd65d7c016bd67401e2008b', 30, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
 
-INSERT INTO "tb_shopsettlement" (shopsettlementno,operno,shopid,shopname) VALUES ('1', '1234', 3000001, '测试商户');
+INSERT INTO "tb_shopsettlement" (shopsettlementno,operno,shopid,shopname) VALUES ('1', '1234', '2000000012', '测试商户');
 INSERT INTO "tb_subject" (subjno,balflag,displayflag,endflag,fsubjno,opendate,subjlevel,subjname,subjtype) VALUES ('1001', 1, 'y', 1, NULL, 20190604, 1, '库存现金', 1);
 INSERT INTO "tb_subject" (subjno,balflag,displayflag,endflag,fsubjno,opendate,subjlevel,subjname,subjtype) VALUES ('1002', 1, 'y', 1, NULL, 20190604, 1, '银行存款', 1);
 INSERT INTO "tb_subject" (subjno,balflag,displayflag,endflag,fsubjno,opendate,subjlevel,subjname,subjtype) VALUES ('1121', 1, 'y', 0, NULL, 20190604, 1, '应收票据', 1);
diff --git a/src/main/resources/templates/restaurant/transdtl/index.html b/src/main/resources/templates/restaurant/transdtl/index.html
index c60bc72..eada656 100644
--- a/src/main/resources/templates/restaurant/transdtl/index.html
+++ b/src/main/resources/templates/restaurant/transdtl/index.html
@@ -63,8 +63,10 @@
                         <div class="layui-input-inline">
                             <select name="status" id="transdtl-status">
                                 <option value="" selected>全部</option>
-                                <option value="1">已入账</option>
-                                <option value="0">未入账</option>
+                                <option value="normal">成功</option>
+                                <option value="fail">失败</option>
+                                <option value="init">初始化</option>
+                                <option value="wip">等待</option>
                             </select>
                         </div>
                     </div>
@@ -163,7 +165,7 @@
                     },
                     {
                         field: 'transdate',
-                        title: '记账日期',
+                        title: '交易日期',
                         sort: true,
                         width:120,
                         templet: function (item) {
@@ -176,7 +178,7 @@
                     },
                     {
                         field: 'transtime',
-                        title: '记账时间',
+                        title: '交易时间',
                         sort: true,
                         width:100,
                         templet: function (item) {
