diff --git a/config/application-devel-pg.properties b/config/application-devel-pg.properties
index 77d4185..4d6e081 100644
--- a/config/application-devel-pg.properties
+++ b/config/application-devel-pg.properties
@@ -3,7 +3,7 @@
 spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
 spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false
 spring.datasource.continue-on-error=true
-spring.datasource.initialization-mode=always
+#spring.datasource.initialization-mode=always
 #spring.jpa.show-sql=true
 #logging.level.org.hibernate.SQL=DEBUG
 # Postgresql settings
diff --git a/src/main/java/com/supwisdom/dlpay/api/bean/APIRequest.java b/src/main/java/com/supwisdom/dlpay/api/bean/APIRequest.java
new file mode 100644
index 0000000..19fb912
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/api/bean/APIRequest.java
@@ -0,0 +1,202 @@
+package com.supwisdom.dlpay.api.bean;
+
+import com.supwisdom.dlpay.framework.util.DateUtil;
+import com.supwisdom.dlpay.framework.util.HmacUtil;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import org.apache.commons.lang.WordUtils;
+
+import java.beans.Introspector;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.*;
+
+public class APIRequest {
+  private String sign;
+  private String sign_method;
+  private String app_id;
+
+  public String getTimestamp() {
+    return timestamp;
+  }
+
+  public void setTimestamp(String timestamp) {
+    this.timestamp = timestamp;
+  }
+
+  private String timestamp;
+  private String term_id;
+
+
+  private boolean getSignData(StringBuilder sb) {
+    Class clazz = this.getClass();
+    ArrayList<Field> signFields = new ArrayList<Field>();
+    Map<Field, Method> getters = new HashMap();
+    if (clazz.isAnnotationPresent(SignBean.class)) {
+      getSignFieldsWithSignBean(signFields, getters);
+    } else {
+      getSignFieldsWithSignField(signFields, getters);
+    }
+
+    if (signFields.size() == 0) {
+      return false;
+    }
+    Collections.sort(signFields, new Comparator<Field>() {
+      @Override
+      public int compare(Field o1, Field o2) {
+        return o1.getName().compareTo(o2.getName());
+      }
+    });
+    for (Field field : signFields) {
+
+      try {
+        Method meth = getters.get(field);
+        Object value = null;
+        try {
+          value = meth.invoke(this);
+        } catch (InvocationTargetException e) {
+          e.printStackTrace();
+        }
+        if (value == null) {
+          continue;
+        }
+
+        sb.append(value.toString());
+      } catch (IllegalAccessException e) {
+        e.printStackTrace();
+        return false;
+      }
+    }
+    return true;
+  }
+
+  private void getSignFieldsWithSignField(ArrayList<Field> signFields, Map<Field, Method> getters) {
+    Class clazz = this.getClass();
+    Method[] allGetter = clazz.getMethods();
+
+    for (Method meth : allGetter) {
+      if ((meth.getModifiers() | Modifier.PUBLIC) == Modifier.PUBLIC
+          && (meth.getName().startsWith("get") || meth.getName().startsWith("is"))) {
+        String fieldName = Introspector.decapitalize(meth.getName().substring(meth.getName().startsWith("get") ? 3 : 2));
+        Field field;
+        try {
+          field = clazz.getDeclaredField(fieldName);
+        } catch (NoSuchFieldException e) {
+          try {
+            field = clazz.getSuperclass().getDeclaredField(fieldName);
+          } catch (NoSuchFieldException e1) {
+            e1.printStackTrace();
+            continue;
+          }
+        }
+        if (field.isAnnotationPresent(SignField.class)) {
+          signFields.add(field);
+          getters.put(field, meth);
+        } else if (field.getName().equals("timestamp")) {
+          signFields.add(field);
+          getters.put(field, meth);
+        }
+      }
+    }
+  }
+
+  private void getSignFieldsWithSignBean(ArrayList<Field> signFields, Map<Field, Method> getters) {
+    Class clazz = this.getClass();
+    SignBean signBean = (SignBean) clazz.getAnnotation(SignBean.class);
+    if(signBean == null) {
+      return;
+    }
+    for(String fieldName : signBean.value()){
+      Field field;
+      try {
+        field = clazz.getDeclaredField(fieldName);
+      } catch (NoSuchFieldException e) {
+        try {
+          field = clazz.getSuperclass().getDeclaredField(fieldName);
+        } catch (NoSuchFieldException e1) {
+          continue;
+        }
+      }
+
+      String methodName = "get" + WordUtils.capitalize(fieldName);
+      Method meth;
+      try {
+        meth = clazz.getMethod(methodName);
+      } catch (NoSuchMethodException e) {
+        methodName = "is" + WordUtils.capitalize(fieldName);
+        try {
+          meth = clazz.getMethod(methodName);
+        } catch (NoSuchMethodException e1) {
+          continue;
+        }
+      }
+      signFields.add(field);
+      getters.put(field, meth);
+    }
+  }
+
+  private String calcSignMac(StringBuilder sb, String key) {
+    return HmacUtil.HMACSHA256(sb.toString(), key);
+  }
+
+  public boolean checkSign(String key, String sessionKey) {
+    StringBuilder sb = new StringBuilder();
+    if (!getSignData(sb)) {
+      return false;
+    }
+    if (StringUtil.isEmpty(getSign())) {
+      return false;
+    }
+    if(sessionKey != null){
+      sb.append(sessionKey);
+    }
+    System.out.println("signData=["+sb.toString()+"]");
+    String mac = calcSignMac(sb, key);
+    return getSign().equalsIgnoreCase(mac);
+  }
+
+  public String calcSign(String key, String timestamp) {
+    if (timestamp == null) {
+      this.setTimestamp(DateUtil.getNow());
+    }
+    StringBuilder sb = new StringBuilder();
+    if (!getSignData(sb)) {
+      return null;
+    }
+    return calcSignMac(sb, key);
+  }
+
+
+  public String getSign() {
+    return sign;
+  }
+
+  public void setSign(String sign) {
+    this.sign = sign;
+  }
+
+  public String getSign_method() {
+    return sign_method;
+  }
+
+  public void setSign_method(String sign_method) {
+    this.sign_method = sign_method;
+  }
+
+  public String getApp_id() {
+    return app_id;
+  }
+
+  public void setApp_id(String app_id) {
+    this.app_id = app_id;
+  }
+
+  public String getTerm_id() {
+    return term_id;
+  }
+
+  public void setTerm_id(String termid) {
+    this.term_id = termid;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/api/bean/APIResponse.java b/src/main/java/com/supwisdom/dlpay/api/bean/APIResponse.java
new file mode 100644
index 0000000..222530e
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/api/bean/APIResponse.java
@@ -0,0 +1,22 @@
+package com.supwisdom.dlpay.api.bean;
+
+public class APIResponse {
+  private String retcode;
+  private String retmsg;
+
+  public String getRetcode() {
+    return retcode;
+  }
+
+  public void setRetcode(String retcode) {
+    this.retcode = retcode;
+  }
+
+  public String getRetmsg() {
+    return retmsg;
+  }
+
+  public void setRetmsg(String retmsg) {
+    this.retmsg = retmsg;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/api/bean/CardverBean.java b/src/main/java/com/supwisdom/dlpay/api/bean/CardverBean.java
new file mode 100644
index 0000000..2cfb3a2
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/api/bean/CardverBean.java
@@ -0,0 +1,32 @@
+package com.supwisdom.dlpay.api.bean;
+
+public class CardverBean {
+    private String status;
+    private String cardno;
+    private String cardphyid;
+
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getCardno() {
+        return cardno;
+    }
+
+    public void setCardno(String cardno) {
+        this.cardno = cardno;
+    }
+
+    public String getCardphyid() {
+        return cardphyid;
+    }
+
+    public void setCardphyid(String cardphyid) {
+        this.cardphyid = cardphyid;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/api/bean/DevparaBean.java b/src/main/java/com/supwisdom/dlpay/api/bean/DevparaBean.java
new file mode 100644
index 0000000..e03d9a3
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/api/bean/DevparaBean.java
@@ -0,0 +1,22 @@
+package com.supwisdom.dlpay.api.bean;
+
+public class DevparaBean {
+    private String paraname;
+    private String paraval;
+
+    public String getParaname() {
+        return paraname;
+    }
+
+    public void setParaname(String paraname) {
+        this.paraname = paraname;
+    }
+
+    public String getParaval() {
+        return paraval;
+    }
+
+    public void setParaval(String paraval) {
+        this.paraval = paraval;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/api/bean/PosPayAccqueryReq.java b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayAccqueryReq.java
new file mode 100644
index 0000000..e1f1a71
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayAccqueryReq.java
@@ -0,0 +1,60 @@
+package com.supwisdom.dlpay.api.bean;
+
+
+public class PosPayAccqueryReq extends APIRequest {
+    private String devphyid;
+    private String qrcode;
+    private String cardno;
+    private String cardphyid;
+    private String transtype;
+    private String expiredate;
+
+
+    public String getDevphyid() {
+        return devphyid;
+    }
+
+    public void setDevphyid(String devphyid) {
+        this.devphyid = devphyid;
+    }
+
+    public String getQrcode() {
+        return qrcode;
+    }
+
+    public void setQrcode(String qrcode) {
+        this.qrcode = qrcode;
+    }
+
+    public String getCardno() {
+        return cardno;
+    }
+
+    public void setCardno(String cardno) {
+        this.cardno = cardno;
+    }
+
+    public String getCardphyid() {
+        return cardphyid;
+    }
+
+    public void setCardphyid(String cardphyid) {
+        this.cardphyid = cardphyid;
+    }
+
+    public String getTranstype() {
+        return transtype;
+    }
+
+    public void setTranstype(String transtype) {
+        this.transtype = transtype;
+    }
+
+    public String getExpiredate() {
+        return expiredate;
+    }
+
+    public void setExpiredate(String expiredate) {
+        this.expiredate = expiredate;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/api/bean/PosPayAccqueryResp.java b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayAccqueryResp.java
new file mode 100644
index 0000000..36b7a7d
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayAccqueryResp.java
@@ -0,0 +1,60 @@
+package com.supwisdom.dlpay.api.bean;
+
+public class PosPayAccqueryResp extends APIResponse {
+    private String expiredate;
+    private String status;
+    private String username;
+    private String userid;
+    private String cardverno;
+    private String systime;
+
+    public String getSystime() {
+        return systime;
+    }
+
+    public void setSystime(String systime) {
+        this.systime = systime;
+    }
+
+    public String getExpiredate() {
+        return expiredate;
+    }
+
+    public void setExpiredate(String expiredate) {
+        this.expiredate = expiredate;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getUserid() {
+        return userid;
+    }
+
+    public void setUserid(String userid) {
+        this.userid = userid;
+    }
+
+    public String getCardverno() {
+        return cardverno;
+    }
+
+    public void setCardverno(String cardverno) {
+        this.cardverno = cardverno;
+    }
+}
+
+
diff --git a/src/main/java/com/supwisdom/dlpay/api/bean/PosPayConfirmReq.java b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayConfirmReq.java
new file mode 100644
index 0000000..e6efaf6
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayConfirmReq.java
@@ -0,0 +1,62 @@
+package com.supwisdom.dlpay.api.bean;
+
+
+public class PosPayConfirmReq extends APIRequest {
+  private String devphyid;
+  private String termdate;
+  private String termtime;
+  private String billno;
+  private String cardpwd;
+  private Integer amount;
+
+
+  public String getDevphyid() {
+    return devphyid;
+  }
+
+  public void setDevphyid(String devphyid) {
+    this.devphyid = devphyid;
+  }
+
+  public String getTermdate() {
+    return termdate;
+  }
+
+  public void setTermdate(String termdate) {
+    this.termdate = termdate;
+  }
+
+  public String getTermtime() {
+    return termtime;
+  }
+
+  public void setTermtime(String termtime) {
+    this.termtime = termtime;
+  }
+
+  public String getBillno() {
+    return billno;
+  }
+
+  public void setBillno(String billno) {
+    this.billno = billno;
+  }
+
+  public String getCardpwd() {
+    return cardpwd;
+  }
+
+  public void setCardpwd(String cardpwd) {
+    this.cardpwd = cardpwd;
+  }
+
+
+
+  public Integer getAmount() {
+    return amount;
+  }
+
+  public void setAmount(Integer amount) {
+    this.amount = amount;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/api/bean/PosPayConfirmResp.java b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayConfirmResp.java
new file mode 100644
index 0000000..a7a8fc9
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayConfirmResp.java
@@ -0,0 +1,67 @@
+package com.supwisdom.dlpay.api.bean;
+
+public class PosPayConfirmResp extends APIResponse {
+  private String billno;
+  private boolean require_query;
+  private Double amount;
+  private Double extraamt;
+  private String userid;
+  private String username;
+  private Integer balance;
+
+  public Integer getBalance() {
+    return balance;
+  }
+
+  public void setBalance(Integer balance) {
+    this.balance = balance;
+  }
+
+  public String getBillno() {
+    return billno;
+  }
+
+  public void setBillno(String billno) {
+    this.billno = billno;
+  }
+
+  public boolean isRequire_query() {
+    return require_query;
+  }
+
+  public void setRequire_query(boolean require_query) {
+    this.require_query = require_query;
+  }
+
+  public Double getAmount() {
+    return amount;
+  }
+
+  public void setAmount(Double amount) {
+    this.amount = amount;
+  }
+
+  public Double getExtraamt() {
+    return extraamt;
+  }
+
+  public void setExtraamt(Double extraamt) {
+    this.extraamt = extraamt;
+  }
+
+  public String getUserid() {
+    return userid;
+  }
+
+  public void setUserid(String userid) {
+    this.userid = userid;
+  }
+
+  public String getUsername() {
+    return username;
+  }
+
+  public void setUsername(String username) {
+    this.username = username;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/api/bean/PosPayHeartBeatReq.java b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayHeartBeatReq.java
new file mode 100644
index 0000000..6f3cf24
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayHeartBeatReq.java
@@ -0,0 +1,62 @@
+package com.supwisdom.dlpay.api.bean;
+
+
+public class PosPayHeartBeatReq extends APIRequest {
+  private String devphyid;
+  private String termdate;
+  private String termtime;
+  private Integer paragroupid;
+  private String cardverno;
+
+
+  public String getDevphyid() {
+    return devphyid;
+  }
+
+  public void setDevphyid(String devphyid) {
+    this.devphyid = devphyid;
+  }
+
+  public String getTermdate() {
+    return termdate;
+  }
+
+  public void setTermdate(String termdate) {
+    this.termdate = termdate;
+  }
+
+  public String getTermtime() {
+    return termtime;
+  }
+
+  public void setTermtime(String termtime) {
+    this.termtime = termtime;
+  }
+
+  public Integer getParagroupid() {
+    return paragroupid;
+  }
+
+  public void setParagroupid(Integer paragroupid) {
+    this.paragroupid = paragroupid;
+  }
+
+  public String getCardverno() {
+    return cardverno;
+  }
+
+  public void setCardverno(String cardverno) {
+    this.cardverno = cardverno;
+  }
+
+  @Override
+  public String toString() {
+    return "PosPayHeartBeatReq{" +
+            "devphyid='" + devphyid + '\'' +
+            ", termdate='" + termdate + '\'' +
+            ", termtime='" + termtime + '\'' +
+            ", paragroupid=" + paragroupid +
+            ", cardverno='" + cardverno + '\'' +
+            '}';
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/api/bean/PosPayHeartBeatResp.java b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayHeartBeatResp.java
new file mode 100644
index 0000000..c0066b3
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayHeartBeatResp.java
@@ -0,0 +1,40 @@
+package com.supwisdom.dlpay.api.bean;
+
+public class PosPayHeartBeatResp extends APIResponse {
+    private Integer paragroupid;
+    private Integer paraverno;
+    private String cardverno;
+    private String systime;
+
+    public Integer getParagroupid() {
+        return paragroupid;
+    }
+
+    public void setParagroupid(Integer paragroupid) {
+        this.paragroupid = paragroupid;
+    }
+
+    public Integer getParaverno() {
+        return paraverno;
+    }
+
+    public void setParaverno(Integer paraverno) {
+        this.paraverno = paraverno;
+    }
+
+    public String getCardverno() {
+        return cardverno;
+    }
+
+    public void setCardverno(String cardverno) {
+        this.cardverno = cardverno;
+    }
+
+    public String getSystime() {
+        return systime;
+    }
+
+    public void setSystime(String systime) {
+        this.systime = systime;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/api/bean/PosPayInitReq.java b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayInitReq.java
new file mode 100644
index 0000000..1f9e728
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayInitReq.java
@@ -0,0 +1,114 @@
+package com.supwisdom.dlpay.api.bean;
+
+public class PosPayInitReq  {
+  @SignField
+  private String devphyid;
+  @SignField
+  private Integer termseqno;
+  @SignField
+  private String termdate;
+  @SignField
+  private String termtime;
+  @SignField
+  private String qrcode;
+  @SignField
+  private String cardno;
+  @SignField
+  private String timestamp;
+  @SignField
+  private String cardphyid;
+  @SignField
+  private String transtype;
+  @SignField
+  private String sign;
+  private String sign_method;
+
+  public String getDevphyid() {
+    return devphyid;
+  }
+
+  public void setDevphyid(String devphyid) {
+    this.devphyid = devphyid;
+  }
+
+  public Integer getTermseqno() {
+    return termseqno;
+  }
+
+  public void setTermseqno(Integer termseqno) {
+    this.termseqno = termseqno;
+  }
+
+  public String getTermdate() {
+    return termdate;
+  }
+
+  public void setTermdate(String termdate) {
+    this.termdate = termdate;
+  }
+
+  public String getTermtime() {
+    return termtime;
+  }
+
+  public void setTermtime(String termtime) {
+    this.termtime = termtime;
+  }
+
+  public String getQrcode() {
+    return qrcode;
+  }
+
+  public void setQrcode(String qrcode) {
+    this.qrcode = qrcode;
+  }
+
+  public String getCardno() {
+    return cardno;
+  }
+
+  public void setCardno(String cardno) {
+    this.cardno = cardno;
+  }
+
+  public String getTimestamp() {
+    return timestamp;
+  }
+
+  public void setTimestamp(String timestamp) {
+    this.timestamp = timestamp;
+  }
+
+  public String getCardphyid() {
+    return cardphyid;
+  }
+
+  public void setCardphyid(String cardphyid) {
+    this.cardphyid = cardphyid;
+  }
+
+  public String getTranstype() {
+    return transtype;
+  }
+
+  public void setTranstype(String transtype) {
+    this.transtype = transtype;
+  }
+
+  public String getSign() {
+    return sign;
+  }
+
+  public void setSign(String sign) {
+    this.sign = sign;
+  }
+
+  public String getSign_method() {
+    return sign_method;
+  }
+
+  public void setSign_method(String sign_method) {
+    this.sign_method = sign_method;
+  }
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/api/bean/PosPayInitResp.java b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayInitResp.java
new file mode 100644
index 0000000..4253741
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayInitResp.java
@@ -0,0 +1,59 @@
+package com.supwisdom.dlpay.api.bean;
+
+public class PosPayInitResp extends APIResponse {
+  private String billno;
+  private String username;
+  private String userid;
+  private boolean anonymous;
+  private String sourcetype;
+  private boolean needpwdconfirm;
+
+
+  public String getBillno() {
+    return billno;
+  }
+
+  public void setBillno(String billno) {
+    this.billno = billno;
+  }
+
+  public String getUsername() {
+    return username;
+  }
+
+  public void setUsername(String username) {
+    this.username = username;
+  }
+
+  public String getUserid() {
+    return userid;
+  }
+
+  public void setUserid(String userid) {
+    this.userid = userid;
+  }
+
+  public boolean isAnonymous() {
+    return anonymous;
+  }
+
+  public void setAnonymous(boolean anonymous) {
+    this.anonymous = anonymous;
+  }
+
+  public String getSourcetype() {
+    return sourcetype;
+  }
+
+  public void setSourcetype(String sourcetype) {
+    this.sourcetype = sourcetype;
+  }
+
+  public boolean isNeedpwdconfirm() {
+    return needpwdconfirm;
+  }
+
+  public void setNeedpwdconfirm(boolean needpwdconfirm) {
+    this.needpwdconfirm = needpwdconfirm;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/api/bean/PosPayLoginReq.java b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayLoginReq.java
new file mode 100644
index 0000000..96572db
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayLoginReq.java
@@ -0,0 +1,50 @@
+package com.supwisdom.dlpay.api.bean;
+
+public class PosPayLoginReq extends APIRequest{
+
+    private String devphyid;
+    private String termdate;
+    private String termtime;
+    private Integer paragroupid;
+    private String cardverno;
+
+  public String getDevphyid() {
+    return devphyid;
+  }
+
+  public void setDevphyid(String devphyid) {
+    this.devphyid = devphyid;
+  }
+
+  public String getTermdate() {
+    return termdate;
+  }
+
+  public void setTermdate(String termdate) {
+    this.termdate = termdate;
+  }
+
+  public String getTermtime() {
+    return termtime;
+  }
+
+  public void setTermtime(String termtime) {
+    this.termtime = termtime;
+  }
+
+  public Integer getParagroupid() {
+    return paragroupid;
+  }
+
+  public void setParagroupid(Integer paragroupid) {
+    this.paragroupid = paragroupid;
+  }
+
+  public String getCardverno() {
+    return cardverno;
+  }
+
+  public void setCardverno(String cardverno) {
+    this.cardverno = cardverno;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/api/bean/PosPayLoginResp.java b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayLoginResp.java
new file mode 100644
index 0000000..d3ad990
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayLoginResp.java
@@ -0,0 +1,68 @@
+package com.supwisdom.dlpay.api.bean;
+
+
+public class PosPayLoginResp extends APIResponse {
+    private Integer paragroupid;
+    private Integer paraverno;
+    private Integer onlineseqno;
+    private Integer offlineseqno;
+    private String cardverno;
+    private String systime;
+    private String shopname;
+
+    public String getShopname() {
+        return shopname;
+    }
+
+    public void setShopname(String shopname) {
+        this.shopname = shopname;
+    }
+
+    public Integer getParagroupid() {
+        return paragroupid;
+    }
+
+    public void setParagroupid(Integer paragroupid) {
+        this.paragroupid = paragroupid;
+    }
+
+    public Integer getParaverno() {
+        return paraverno;
+    }
+
+    public void setParaverno(Integer paraverno) {
+        this.paraverno = paraverno;
+    }
+
+    public Integer getOnlineseqno() {
+        return onlineseqno;
+    }
+
+    public void setOnlineseqno(Integer onlineseqno) {
+        this.onlineseqno = onlineseqno;
+    }
+
+    public Integer getOfflineseqno() {
+        return offlineseqno;
+    }
+
+    public void setOfflineseqno(Integer offlineseqno) {
+        this.offlineseqno = offlineseqno;
+    }
+
+    public String getCardverno() {
+        return cardverno;
+    }
+
+    public void setCardverno(String cardverno) {
+        this.cardverno = cardverno;
+    }
+
+    public String getSystime() {
+        return systime;
+    }
+
+    public void setSystime(String systime) {
+        this.systime = systime;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/api/bean/PosPayOfflineDtlReq.java b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayOfflineDtlReq.java
new file mode 100644
index 0000000..093f77c
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayOfflineDtlReq.java
@@ -0,0 +1,148 @@
+package com.supwisdom.dlpay.api.bean;
+
+public class PosPayOfflineDtlReq extends APIRequest{
+  private String devphyid;
+  private Integer termseqno;
+  private String transdate;
+  private String transtime;
+  private String qrcode;
+  private String cardno;
+  private String cardphyid;
+  private String transtype;
+  private Integer amount;
+  private Integer extraamt;
+  private String managefeetype;
+  private String reversalflag;
+  private Integer reversaltermseqno;
+  private String reversaltransdate;
+  private String reversaltranstime;
+  private String status;
+
+  public String getDevphyid() {
+    return devphyid;
+  }
+
+  public void setDevphyid(String devphyid) {
+    this.devphyid = devphyid;
+  }
+
+  public Integer getTermseqno() {
+    return termseqno;
+  }
+
+  public void setTermseqno(Integer termseqno) {
+    this.termseqno = termseqno;
+  }
+
+  public String getTransdate() {
+    return transdate;
+  }
+
+  public void setTransdate(String transdate) {
+    this.transdate = transdate;
+  }
+
+  public String getTranstime() {
+    return transtime;
+  }
+
+  public void setTranstime(String transtime) {
+    this.transtime = transtime;
+  }
+
+  public String getQrcode() {
+    return qrcode;
+  }
+
+  public void setQrcode(String qrcode) {
+    this.qrcode = qrcode;
+  }
+
+  public String getCardno() {
+    return cardno;
+  }
+
+  public void setCardno(String cardno) {
+    this.cardno = cardno;
+  }
+
+  public String getCardphyid() {
+    return cardphyid;
+  }
+
+  public void setCardphyid(String cardphyid) {
+    this.cardphyid = cardphyid;
+  }
+
+  public String getTranstype() {
+    return transtype;
+  }
+
+  public void setTranstype(String transtype) {
+    this.transtype = transtype;
+  }
+
+  public Integer getAmount() {
+    return amount;
+  }
+
+  public void setAmount(Integer amount) {
+    this.amount = amount;
+  }
+
+  public Integer getExtraamt() {
+    return extraamt;
+  }
+
+  public void setExtraamt(Integer extraamt) {
+    this.extraamt = extraamt;
+  }
+
+  public String getManagefeetype() {
+    return managefeetype;
+  }
+
+  public void setManagefeetype(String managefeetype) {
+    this.managefeetype = managefeetype;
+  }
+
+  public String getReversalflag() {
+    return reversalflag;
+  }
+
+  public void setReversalflag(String reversalflag) {
+    this.reversalflag = reversalflag;
+  }
+
+  public Integer getReversaltermseqno() {
+    return reversaltermseqno;
+  }
+
+  public void setReversaltermseqno(Integer reversaltermseqno) {
+    this.reversaltermseqno = reversaltermseqno;
+  }
+
+  public String getReversaltransdate() {
+    return reversaltransdate;
+  }
+
+  public void setReversaltransdate(String reversaltransdate) {
+    this.reversaltransdate = reversaltransdate;
+  }
+
+  public String getReversaltranstime() {
+    return reversaltranstime;
+  }
+
+  public void setReversaltranstime(String reversaltranstime) {
+    this.reversaltranstime = reversaltranstime;
+  }
+
+  public String getStatus() {
+    return status;
+  }
+
+  public void setStatus(String status) {
+    this.status = status;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/api/bean/PosPayOfflineDtlResp.java b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayOfflineDtlResp.java
new file mode 100644
index 0000000..84df6f8
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayOfflineDtlResp.java
@@ -0,0 +1,15 @@
+package com.supwisdom.dlpay.api.bean;
+
+
+
+public class PosPayOfflineDtlResp extends APIResponse {
+  private Integer termseqno;
+
+  public Integer getTermseqno() {
+    return termseqno;
+  }
+
+  public void setTermseqno(Integer termseqno) {
+    this.termseqno = termseqno;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/api/bean/PosPayQuerysalesResp.java b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayQuerysalesResp.java
new file mode 100644
index 0000000..e8329ae
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayQuerysalesResp.java
@@ -0,0 +1,52 @@
+package com.supwisdom.dlpay.api.bean;
+
+
+import java.math.BigInteger;
+
+public class PosPayQuerysalesResp extends APIResponse {
+  private String salesdate;
+  private Double salesamt;
+  private BigInteger salescnt;
+  private Double managefeeamt;
+  private BigInteger managefeecnt;
+
+  public String getSalesdate() {
+    return salesdate;
+  }
+
+  public void setSalesdate(String salesdate) {
+    this.salesdate = salesdate;
+  }
+
+  public Double getSalesamt() {
+    return salesamt;
+  }
+
+  public void setSalesamt(Double salesamt) {
+    this.salesamt = salesamt;
+  }
+
+  public BigInteger getSalescnt() {
+    return salescnt;
+  }
+
+  public void setSalescnt(BigInteger salescnt) {
+    this.salescnt = salescnt;
+  }
+
+  public Double getManagefeeamt() {
+    return managefeeamt;
+  }
+
+  public void setManagefeeamt(Double managefeeamt) {
+    this.managefeeamt = managefeeamt;
+  }
+
+  public BigInteger getManagefeecnt() {
+    return managefeecnt;
+  }
+
+  public void setManagefeecnt(BigInteger managefeecnt) {
+    this.managefeecnt = managefeecnt;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/api/bean/PosPayReverseReq.java b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayReverseReq.java
new file mode 100644
index 0000000..ccd874a
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayReverseReq.java
@@ -0,0 +1,71 @@
+package com.supwisdom.dlpay.api.bean;
+
+
+public class PosPayReverseReq extends APIRequest {
+  private String devphyid;
+  private String termdate;
+  private String termtime;
+  private String reversalbillno;
+  private String reversalflag;
+  private String timestamp;
+  private Integer termseqno;
+
+
+  public String getDevphyid() {
+    return devphyid;
+  }
+
+  public void setDevphyid(String devphyid) {
+    this.devphyid = devphyid;
+  }
+
+  public String getTermdate() {
+    return termdate;
+  }
+
+  public void setTermdate(String termdate) {
+    this.termdate = termdate;
+  }
+
+  public String getTermtime() {
+    return termtime;
+  }
+
+  public void setTermtime(String termtime) {
+    this.termtime = termtime;
+  }
+
+  public String getReversalbillno() {
+    return reversalbillno;
+  }
+
+  public void setReversalbillno(String reversalbillno) {
+    this.reversalbillno = reversalbillno;
+  }
+
+  public String getReversalflag() {
+    return reversalflag;
+  }
+
+  public void setReversalflag(String reversalflag) {
+    this.reversalflag = reversalflag;
+  }
+
+  @Override
+  public String getTimestamp() {
+    return timestamp;
+  }
+
+  @Override
+  public void setTimestamp(String timestamp) {
+    this.timestamp = timestamp;
+  }
+
+  public Integer getTermseqno() {
+    return termseqno;
+  }
+
+  public void setTermseqno(Integer termseqno) {
+    this.termseqno = termseqno;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/api/bean/PosPayReverseResp.java b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayReverseResp.java
new file mode 100644
index 0000000..8a79317
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayReverseResp.java
@@ -0,0 +1,13 @@
+package com.supwisdom.dlpay.api.bean;
+
+public class PosPayReverseResp extends APIResponse {
+  private Integer termseqno;
+
+  public Integer getTermseqno() {
+    return termseqno;
+  }
+
+  public void setTermseqno(Integer termseqno) {
+    this.termseqno = termseqno;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/api/bean/PosPaySysparaReq.java b/src/main/java/com/supwisdom/dlpay/api/bean/PosPaySysparaReq.java
new file mode 100644
index 0000000..02cbf4a
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/api/bean/PosPaySysparaReq.java
@@ -0,0 +1,42 @@
+package com.supwisdom.dlpay.api.bean;
+
+
+public class PosPaySysparaReq extends APIRequest {
+  private String devphyid;
+  private String termdate;
+  private String termtime;
+  private Integer paragroupid;
+
+  public String getDevphyid() {
+    return devphyid;
+  }
+
+  public void setDevphyid(String devphyid) {
+    this.devphyid = devphyid;
+  }
+
+  public String getTermdate() {
+    return termdate;
+  }
+
+  public void setTermdate(String termdate) {
+    this.termdate = termdate;
+  }
+
+  public String getTermtime() {
+    return termtime;
+  }
+
+  public void setTermtime(String termtime) {
+    this.termtime = termtime;
+  }
+
+
+  public Integer getParagroupid() {
+    return paragroupid;
+  }
+
+  public void setParagroupid(Integer paragroupid) {
+    this.paragroupid = paragroupid;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/api/bean/PosPaySysparaResp.java b/src/main/java/com/supwisdom/dlpay/api/bean/PosPaySysparaResp.java
new file mode 100644
index 0000000..6814077
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/api/bean/PosPaySysparaResp.java
@@ -0,0 +1,36 @@
+package com.supwisdom.dlpay.api.bean;
+
+import com.supwisdom.dlpay.restaurant.domain.TDevpara;
+
+import java.util.ArrayList;
+import java.util.Map;
+
+public class PosPaySysparaResp extends APIResponse {
+  private Integer paragroupid;
+  private Integer paraverno;
+  private ArrayList<DevparaBean> syspara;
+
+  public Integer getParagroupid() {
+    return paragroupid;
+  }
+
+  public void setParagroupid(Integer paragroupid) {
+    this.paragroupid = paragroupid;
+  }
+
+  public Integer getParaverno() {
+    return paraverno;
+  }
+
+  public void setParaverno(Integer paraverno) {
+    this.paraverno = paraverno;
+  }
+
+  public ArrayList<DevparaBean> getSyspara() {
+    return syspara;
+  }
+
+  public void setSyspara(ArrayList<DevparaBean> syspara) {
+    this.syspara = syspara;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/api/bean/PosPayWhitelistReq.java b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayWhitelistReq.java
new file mode 100644
index 0000000..ec4ce59
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayWhitelistReq.java
@@ -0,0 +1,32 @@
+package com.supwisdom.dlpay.api.bean;
+
+
+public class PosPayWhitelistReq extends APIRequest {
+  private String cardverno;
+  private String devphyid;
+  private Integer maxcount;
+
+  public String getCardverno() {
+    return cardverno;
+  }
+
+  public void setCardverno(String cardverno) {
+    this.cardverno = cardverno;
+  }
+
+  public String getDevphyid() {
+    return devphyid;
+  }
+
+  public void setDevphyid(String devphyid) {
+    this.devphyid = devphyid;
+  }
+
+  public Integer getMaxcount() {
+    return maxcount;
+  }
+
+  public void setMaxcount(Integer maxcount) {
+    this.maxcount = maxcount;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/api/bean/PosPayWhitelistResp.java b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayWhitelistResp.java
new file mode 100644
index 0000000..bb0a69d
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/api/bean/PosPayWhitelistResp.java
@@ -0,0 +1,34 @@
+package com.supwisdom.dlpay.api.bean;
+
+import java.util.ArrayList;
+
+public class PosPayWhitelistResp extends APIResponse {
+  private String cardverno;
+  private Integer count;
+  private ArrayList<CardverBean> whitelist;
+
+
+  public String getCardverno() {
+    return cardverno;
+  }
+
+  public void setCardverno(String cardverno) {
+    this.cardverno = cardverno;
+  }
+
+  public Integer getCount() {
+    return count;
+  }
+
+  public void setCount(Integer count) {
+    this.count = count;
+  }
+
+  public ArrayList<CardverBean> getWhitelist() {
+    return whitelist;
+  }
+
+  public void setWhitelist(ArrayList<CardverBean> whitelist) {
+    this.whitelist = whitelist;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/api/bean/SignBean.java b/src/main/java/com/supwisdom/dlpay/api/bean/SignBean.java
new file mode 100644
index 0000000..208c27a
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/api/bean/SignBean.java
@@ -0,0 +1,15 @@
+package com.supwisdom.dlpay.api.bean;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Created by tangcheng on 16/8/11.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+public @interface SignBean {
+  String[] value();
+}
diff --git a/src/main/java/com/supwisdom/dlpay/api/bean/SignField.java b/src/main/java/com/supwisdom/dlpay/api/bean/SignField.java
new file mode 100644
index 0000000..ee94cb8
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/api/bean/SignField.java
@@ -0,0 +1,16 @@
+package com.supwisdom.dlpay.api.bean;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Created by tangcheng on 16/8/5.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.FIELD)
+public @interface SignField {
+  int order = 0;
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/api/controller/PosPayController.java b/src/main/java/com/supwisdom/dlpay/api/controller/PosPayController.java
new file mode 100644
index 0000000..19d8a51
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/api/controller/PosPayController.java
@@ -0,0 +1,106 @@
+package com.supwisdom.dlpay.api.controller;
+
+import com.supwisdom.dlpay.api.bean.*;
+import com.supwisdom.dlpay.api.service.PosPayService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+@Controller
+@RequestMapping("/api/pos")
+public class PosPayController {
+
+    @Autowired
+    private PosPayService posPayService;
+
+    //设备签到
+  @RequestMapping(value = "/login", method = RequestMethod.POST)
+  @ResponseBody
+  public PosPayLoginResp cardreaderlogin(@ModelAttribute PosPayLoginReq req) {
+      PosPayLoginResp resp = posPayService.doLogin(req);
+    return resp;
+  }
+
+    //支付初始化
+    @RequestMapping(value = "/payinit", method = RequestMethod.POST)
+    @ResponseBody
+    public PosPayInitResp payInit(@ModelAttribute PosPayInitReq req) {
+        PosPayInitResp resp = posPayService.doPayInit(req);
+        return resp;
+    }
+
+    //支付
+    @RequestMapping(value = "/payconfirm", method = RequestMethod.POST)
+    @ResponseBody
+    public PosPayConfirmResp payment(@ModelAttribute PosPayConfirmReq req) {
+        PosPayConfirmResp resp = posPayService.doPayConfirm(req);
+        return resp;
+    }
+
+    //订单查询
+    @RequestMapping(value = "/payquery", method = RequestMethod.POST)
+    @ResponseBody
+    public PosPayConfirmResp payquery(@ModelAttribute PosPayConfirmReq req) {
+        PosPayConfirmResp resp = posPayService.doPayQuery(req);
+        return resp;
+    }
+
+    //冲正
+    @RequestMapping(value = "/paycancel", method = RequestMethod.POST)
+    @ResponseBody
+    public PosPayReverseResp paycancel(@ModelAttribute PosPayReverseReq req) {
+        PosPayReverseResp resp = posPayService.doPayCancel(req);
+        return resp;
+    }
+
+    //白名单
+    @RequestMapping(value = "/whitelist", method = RequestMethod.POST)
+    @ResponseBody
+    public PosPayWhitelistResp whitelist(@ModelAttribute PosPayWhitelistReq req) {
+        PosPayWhitelistResp resp = posPayService.doGetWhitelist(req);
+        return resp;
+    }
+
+    //系统参数
+    @RequestMapping(value = "/systempara", method = RequestMethod.POST)
+    @ResponseBody
+    public PosPaySysparaResp systempara(@ModelAttribute PosPaySysparaReq req) {
+        PosPaySysparaResp resp = posPayService.doGetDevpara(req);
+        return resp;
+    }
+
+    //心跳
+    @RequestMapping(value = "/heartbeat", method = RequestMethod.POST)
+    @ResponseBody
+    public PosPayHeartBeatResp heartbeat(@ModelAttribute PosPayHeartBeatReq req) {
+        PosPayHeartBeatResp resp = posPayService.posHeartBeat(req);
+        return resp;
+    }
+
+    //营业额查询
+    @RequestMapping(value = "/querysales", method = RequestMethod.POST)
+    @ResponseBody
+    public PosPayQuerysalesResp querysales(@ModelAttribute PosPaySysparaReq req) {
+        PosPayQuerysalesResp resp = posPayService.posQuerySales(req);
+        return resp;
+    }
+
+    @RequestMapping(value = "/accquery", method = RequestMethod.POST)
+    @ResponseBody
+    public PosPayAccqueryResp querysales(@ModelAttribute PosPayAccqueryReq req) {
+        PosPayAccqueryResp resp = posPayService.AccountQuery(req);
+        return resp;
+    }
+
+    @RequestMapping(value = "/offlinetransdtl", method = RequestMethod.POST)
+    @ResponseBody
+    public PosPayOfflineDtlResp querysales(@ModelAttribute PosPayOfflineDtlReq req) {
+        PosPayOfflineDtlResp resp = posPayService.saveOfflineDtl(req);
+        return resp;
+    }
+
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/api/service/PosPayService.java b/src/main/java/com/supwisdom/dlpay/api/service/PosPayService.java
new file mode 100644
index 0000000..ea60192
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/api/service/PosPayService.java
@@ -0,0 +1,32 @@
+package com.supwisdom.dlpay.api.service;
+
+
+import com.supwisdom.dlpay.api.bean.*;
+
+/**
+ */
+public interface PosPayService {
+    PosPayLoginResp doLogin(PosPayLoginReq req);
+
+    PosPayInitResp doPayInit(PosPayInitReq req);
+
+    PosPayConfirmResp doPayConfirm(PosPayConfirmReq req);
+
+    PosPayConfirmResp doPayQuery(PosPayConfirmReq req);
+
+    PosPayReverseResp doPayCancel(PosPayReverseReq req);
+
+    PosPaySysparaResp doGetDevpara(PosPaySysparaReq req);
+
+    PosPayWhitelistResp doGetWhitelist(PosPayWhitelistReq req);
+
+    PosPayHeartBeatResp posHeartBeat(PosPayHeartBeatReq req);
+
+    PosPayQuerysalesResp posQuerySales(PosPaySysparaReq req);
+
+    PosPayAccqueryResp AccountQuery(PosPayAccqueryReq req);
+
+    PosPayOfflineDtlResp saveOfflineDtl(PosPayOfflineDtlReq req);
+
+    //void checkOfflineDtl();
+}
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
new file mode 100644
index 0000000..f5a235f
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/api/service/impl/PosPayServiceImpl.java
@@ -0,0 +1,684 @@
+package com.supwisdom.dlpay.api.service.impl;
+
+import com.supwisdom.dlpay.api.bean.*;
+import com.supwisdom.dlpay.api.service.PosPayService;
+import com.supwisdom.dlpay.framework.domain.TShopSettlement;
+import com.supwisdom.dlpay.framework.util.DateUtil;
+import com.supwisdom.dlpay.api.util.ErrorCode;
+import com.supwisdom.dlpay.framework.service.SystemUtilService;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.restaurant.bean.ManageFeeAmtBean;
+import com.supwisdom.dlpay.restaurant.bean.SalesAmtBean;
+import com.supwisdom.dlpay.restaurant.dao.DevparaBindDao;
+import com.supwisdom.dlpay.restaurant.dao.MealTypeDao;
+import com.supwisdom.dlpay.restaurant.domain.*;
+import com.supwisdom.dlpay.restaurant.service.*;
+import com.supwisdom.dlpay.restaurant.util.RestaurantConstant;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+@Service
+public class PosPayServiceImpl implements PosPayService {
+    @Autowired
+    private DeviceService deviceService;
+    @Autowired
+    private CardService cardService;
+    @Autowired
+    private SystemUtilService systemUtilService;
+    @Autowired
+    private CustomerService customerService;
+    @Autowired
+    private TransDtlService transDtlService;
+    @Autowired
+    private OfflineTransDtlService offlineTransDtlService;
+    @Autowired
+    private MealTypeDao mealTypeDao;
+    @Autowired
+    private DevparaBindDao devparaBindDao;
+    @Autowired
+    private CustTypeService custTypeService;
+    @Autowired
+    private DeviceParamService deviceParamService;
+    @Autowired
+    private ShopSettlementService shopSettlementService;
+
+
+
+    @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("设备未注册");
+            return resp;
+        }
+        /*if (!req.getTermno().equals("FFFFFFFFFFFF")) {
+            TPsamcard tPsamcard = psamOrKeyCardService.getPsamcardbyTermno(req.getTermno());
+            if (tPsamcard == null) {
+                resp.setRetcode(ErrorCode.ERRIF_POS_NOREG);
+                resp.setRetmsg("设备未注册");
+                return resp;
+            }
+            if (tPsamcard.getStatus().intValue() != 0) {
+                resp.setRetcode(ErrorCode.ERRIF_POS_DISABLE);
+                resp.setRetmsg("终端PSAM卡状态错误");
+                return resp;
+            }
+            if (tPsamcard.getDeviceid() > 0) {
+                if (tPsamcard.getDeviceid().intValue() != tDevice.getDeviceid()) {
+                    resp.setRetcode(ErrorCode.ERRIF_POS_TERMID);
+                    resp.setRetmsg("终端PSAM卡错误");
+                    return resp;
+                }
+            } else {
+                tPsamcard.setDeviceid(tDevice.getDeviceid());
+                tPsamcard.setDevjointime(sysdt.getHostdatetime());
+                tPsamcard.setLastsaved(sysdt.getHostdatetime());
+                psamOrKeyCardService.updatePsamcard(tPsamcard);
+            }
+        }*/
+        List<TShopSettlement> shoplist=shopSettlementService.getShopByShopid(tDevice.getShopid());
+        if (shoplist.size() < 1) {
+            resp.setRetcode(ErrorCode.ERRIF_POS_NOSHOP);
+            resp.setRetmsg("设备未绑定商户");
+            return resp;
+        }
+
+        Integer groupid = req.getParagroupid();
+        if (groupid == 0) {
+            groupid = 1;
+        }
+        TDevparaGroup group = deviceParamService.getDevparaGroupByGroupid(groupid);
+        if (null == group) {
+            resp.setRetcode(ErrorCode.ERRIF_POS_NOFUNC);
+            resp.setRetmsg("未找到" + req.getDevphyid() + "参数组");
+            return resp;
+        }
+
+        tDevice.setRunstatus(1);
+        tDevice.setLastlogintime(sysdt);
+        deviceService.saveDevice(tDevice);
+
+        TDevparaBind bind = deviceParamService.getDevparaBindByDeviceid(tDevice.getId());
+        if (null == bind) {
+            bind = new TDevparaBind();
+            bind.setDeviceid(tDevice.getId());
+        }
+        bind.setGroupid(group.getGroupid());
+        bind.setLastsaved(sysdt);
+        devparaBindDao.save(bind);
+        Integer onlineseqno = transDtlService.getMaxSeqnoToday(tDevice.getId(), req.getTermdate());
+
+        resp.setCardverno(req.getCardverno());
+        resp.setOnlineseqno(onlineseqno + 1);
+        resp.setOfflineseqno(1);
+        resp.setShopname(shoplist.get(0).getShopname());
+        resp.setParagroupid(group.getGroupid());
+        resp.setSystime(sysdt);
+        resp.setParaverno(group.getVerno().intValue());
+        resp.setRetcode(ErrorCode.ERRIF_OK);
+        return resp;
+    }
+
+
+    @Override
+    public PosPayInitResp doPayInit(PosPayInitReq req) {
+        PosPayInitResp resp = new PosPayInitResp();
+    /*if (!clientSessionService.checkRequestSign(req)) {
+      resp.setRetcode(ErrorCode.ERRIF_SIGN_ERROR);
+      resp.setRetmsg("签名验证失败");
+      return resp;
+    }
+    TTerm tTerm = systemUtilService.getTermBytermid(Integer.valueOf(req.getTerm_id()));
+    if (null == tTerm) {
+      resp.setRetcode(ErrorCode.ERRIF_POS_NOTLOGIN);
+      resp.setRetmsg("终端未签到");
+      return resp;
+    }
+    if (tTerm.getChecknum().intValue() != req.getChecknum()) {
+      resp.setRetcode(ErrorCode.ERRIF_CHECKNUM_ERROR);
+      resp.setRetmsg("验证码错误");
+      return resp;
+    }*/
+        TDevice tDevice = deviceService.getDeviceByDevphyid(req.getDevphyid());
+        if (tDevice == null) {
+            resp.setRetcode(ErrorCode.ERRIF_POS_NOREG);
+            resp.setRetmsg("设备不存在");
+            return resp;
+        }
+        // 检查卡状态
+        TCard tCard = cardService.getCardByCardnoAndCardphyid(req.getCardno(), req.getCardphyid());
+        if (null == tCard) {
+            resp.setRetcode(ErrorCode.ERRIF_CARD_NOTEXIST);
+            resp.setRetmsg("卡号[" + req.getCardno() + "]不存在");
+            return resp;
+        }
+
+        TCustomer customer=customerService.getCustomerByCustid(tCard.getCustid());
+        if(null==tCard){
+            resp.setRetcode(ErrorCode.ERRIF_POSDTL_NOTEXIST);
+            resp.setRetmsg("卡对应客户不存在");
+            return resp;
+        }
+
+
+   /* if (!cardService.canDeposit(tCard)) {
+      resp.setRetcode(ErrorCode.ERRIF_CARD_STATUSEXCEPT);
+      resp.setRetmsg(cardService.getReason());
+      return resp;
+    }
+    if (req.getCardbefbal() < req.getAmount()) {
+      resp.setRetcode(ErrorCode.ERRIF_CARDBAL_SHORTAGE);
+      resp.setRetmsg("卡余额不足");
+      return resp;
+    }
+    //判断账户余额
+    YKTAccount yktAccount = customerService.getYKTAccountByAccno(tCard.getAccno());
+    if (null == yktAccount) {
+      resp.setRetcode(ErrorCode.ERRIF_CARDACC_EXCEPT);
+      resp.setRetmsg(cardService.getReason());
+      return resp;
+    }
+    if (yktAccount.getBalance() < 0) {
+      resp.setRetcode(ErrorCode.ERRIF_CARDACC_SHORTAGE);
+      resp.setRetmsg("账户余额不足");
+      return resp;
+    }
+    //检查商户
+    TShop tShop = shopAccService.getTShopById(req.getShopid());
+    if (tShop == null) {
+      resp.setRetcode(ErrorCode.ERRIF_SHOP_NOTEXIST);
+      resp.setRetmsg("设备绑定的商户不存在");
+      return resp;
+    }
+    if (StringUtil.checkEmpty(tShop.getAccno())) {
+      resp.setRetcode(ErrorCode.ERRIF_SHOP_ACC_EXCEPT);
+      resp.setRetmsg("商户账号不存在");
+      return resp;
+    }*/
+
+        TTransDtl tTransdtl = new TTransDtl();
+        tTransdtl.setAccdate(req.getTermdate());
+        tTransdtl.setTermid(tDevice.getId());
+        tTransdtl.setBillno(systemUtilService.getRefno());
+        tTransdtl.setShopid(tDevice.getShopid());
+        tTransdtl.setAcctime(req.getTermtime());
+        tTransdtl.setTransdate(DateUtil.getNow("yyyyMMdd"));
+        tTransdtl.setTranstime(DateUtil.getNow("HHmmss"));
+        tTransdtl.setCardno(req.getCardno());
+        tTransdtl.setTransmode(req.getTranstype());
+        tTransdtl.setTranstype(RestaurantConstant.TRANSTYPE_TRANSDTL_ONLINE);
+        tTransdtl.setTermsqlno(req.getTermseqno());
+        tTransdtl.setManagefee(0.0);
+        tTransdtl.setRevflag(0);
+        List<TMealtype> mealtypes = mealTypeDao.findAllByOrderByEndtime();
+        try {
+            for (TMealtype m : mealtypes) {
+                if (DateUtil.compareTime(m.getEndtime(), req.getTermtime())) {
+                    tTransdtl.setMealtype(m.getMealtype());
+                    break;
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            resp.setRetcode(ErrorCode.ERRIF_OTHER);
+            resp.setRetmsg(e.getMessage());
+            return resp;
+        }
+
+        tTransdtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_INIT);
+        if (!StringUtil.isEmpty(tCard.getCustid())) {
+            TCustomer tCustomer = customerService.getCustomerByCustid(tCard.getCustid());
+            if (tCustomer != null) {
+                tTransdtl.setCustid(tCustomer.getCustid());
+                tTransdtl.setCustname(tCustomer.getCustname());
+            }
+        } else {
+            tTransdtl.setCustname("");
+        }
+
+        transDtlService.saveTransdtl(tTransdtl);
+        resp.setBillno(tTransdtl.getBillno());
+        resp.setRetcode(ErrorCode.ERRIF_OK);
+        resp.setAnonymous(false);
+        resp.setNeedpwdconfirm(false);
+        resp.setSourcetype("pos");
+        resp.setUserid(tTransdtl.getCustid());
+        resp.setUsername(customer.getCustname());
+        return resp;
+    }
+
+    @Override
+    public PosPayConfirmResp doPayConfirm(PosPayConfirmReq req) {
+        PosPayConfirmResp resp = new PosPayConfirmResp();
+   /* if (!clientSessionService.checkRequestSign(req)) {
+      resp.setRetcode(ErrorCode.ERRIF_SIGN_ERROR);
+      resp.setRetmsg("签名验证失败");
+      return resp;
+    }*/
+        TTransDtl tTransdtl = transDtlService.getTransDtlByBillno(req.getBillno());
+        if (null == tTransdtl) {
+            resp.setRetcode(ErrorCode.ERRIF_POSDTL_NOTEXIST);
+            resp.setRetmsg("交易参考号" + req.getBillno() + "不存在");
+            return resp;
+        }
+        TCustomer cus = customerService.getCustomerByCustid(tTransdtl.getCustid());
+        if (null == cus) {
+            resp.setRetcode(ErrorCode.ERRIF_POSDTL_NOTEXIST);
+            resp.setRetmsg("客户" + tTransdtl.getCustid() + "不存在");
+            return resp;
+        }
+        Integer extamount = 0;
+        if (cus.getCusttype() == 1) {
+            extamount += 100;
+        }
+
+        tTransdtl.setAmount(req.getAmount() / 100.0);
+        tTransdtl.setManagefee(extamount / 100.0);
+        tTransdtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_WAIT);
+        transDtlService.saveTransdtl(tTransdtl);
+
+
+        resp.setBillno(req.getBillno());
+        resp.setAmount(tTransdtl.getAmount()*100);
+        resp.setExtraamt(extamount*100.0);
+        resp.setUserid(cus.getCustid());
+        resp.setUsername(cus.getCustname());
+        if(RestaurantConstant.STATUS_TRANSDTL_WAIT.equals(tTransdtl.getStatus())){
+            resp.setRequire_query(true);
+        }else{
+            resp.setRequire_query(false);
+        }
+        resp.setBalance(0);
+        resp.setRetcode(ErrorCode.ERRIF_OK);
+        return resp;
+    }
+
+    @Override
+    public PosPayConfirmResp doPayQuery(PosPayConfirmReq req) {
+        PosPayConfirmResp resp = new PosPayConfirmResp();
+
+        TTransDtl tTransdtl = transDtlService.getTransDtlByBillno(req.getBillno());
+        if (null == tTransdtl) {
+            resp.setRetcode(ErrorCode.ERRIF_POSDTL_NOTEXIST);
+            resp.setRetmsg("交易参考号" + req.getBillno() + "不存在");
+            return resp;
+        }
+        TCustomer cus = customerService.getCustomerByCustid(tTransdtl.getCustid());
+        if (null == cus) {
+            resp.setRetcode(ErrorCode.ERRIF_POSDTL_NOTEXIST);
+            resp.setRetmsg("客户" + tTransdtl.getCustid() + "不存在");
+            return resp;
+        }
+
+        resp.setBillno(tTransdtl.getBillno());
+        resp.setAmount(tTransdtl.getAmount()*100);
+        resp.setExtraamt(tTransdtl.getManagefee()*100);
+        resp.setUserid(cus.getCustid());
+        resp.setUsername(cus.getCustname());
+        resp.setRequire_query(true);
+        resp.setBalance(0);
+        resp.setRetcode(ErrorCode.ERRIF_OK);
+        return resp;
+    }
+
+    @Override
+    public PosPayReverseResp doPayCancel(PosPayReverseReq req) {
+        PosPayReverseResp resp = new PosPayReverseResp();
+        TTransDtl tTransDtl = transDtlService.getTransDtlByBillno(req.getReversalbillno());
+        if (null == tTransDtl) {
+            resp.setRetcode(ErrorCode.ERRIF_POSDTL_NOTEXIST);
+            resp.setRetmsg("交易参考号" + req.getReversalbillno() + "不存在");
+            return resp;
+        }
+        if (!tTransDtl.getStatus().toUpperCase().equals(
+                RestaurantConstant.STATUS_TRANSDTL_SUCCESS.toUpperCase())) {
+            tTransDtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_FAIL);
+            tTransDtl.setAttr1("交易状态未成功");
+            resp.setRetcode(ErrorCode.ERRIF_POSDTL_NOTEXIST);
+            resp.setRetmsg("流水" + req.getReversalbillno() + "交易状态未成功，不能冲正");
+            return resp;
+        }
+        if (tTransDtl.getRevflag() == 1) {
+            resp.setRetcode(ErrorCode.ERRIF_POSDTL_NOTEXIST);
+            resp.setRetmsg("流水" + req.getReversalbillno() + "已冲正");
+            return resp;
+        }
+        try {
+            transDtlService.revertTransdtl(tTransDtl);
+            resp.setTermseqno(tTransDtl.getTermsqlno());
+            resp.setRetmsg("冲正成功");
+            resp.setRetcode(ErrorCode.ERRIF_OK);
+            return resp;
+        } catch (Exception e) {
+            e.printStackTrace();
+            resp.setRetcode(ErrorCode.ERRIF_TRANS_REVERSED);
+            resp.setRetmsg("冲正失败，错误：" + e.getMessage());
+            return resp;
+        }
+
+    }
+
+    @Override
+    public PosPaySysparaResp doGetDevpara(PosPaySysparaReq req) {
+        PosPaySysparaResp resp = new PosPaySysparaResp();
+        TDevparaGroup group = deviceParamService.getDevparaGroupByGroupid(req.getParagroupid());
+        if (null == group) {
+            resp.setRetcode(ErrorCode.ERRIF_POS_NOFUNC);
+            resp.setRetmsg("未找到" + req.getDevphyid() + "参数组");
+            return resp;
+        }
+        List<TDevpara> tDevparas = deviceParamService.getDevparaInfo(req.getParagroupid());
+
+        ArrayList<DevparaBean> sysParas = new ArrayList<DevparaBean>();
+        for (TDevpara t : tDevparas) {
+            DevparaBean sysPara = new DevparaBean();
+            sysPara.setParaname(t.getParaname());
+            sysPara.setParaval(t.getParaval());
+            sysParas.add(sysPara);
+        }
+        resp.setRetcode(ErrorCode.ERRIF_OK);
+        resp.setRetmsg("下载成功");
+        resp.setParaverno(group.getVerno().intValue());
+        resp.setParagroupid(group.getGroupid());
+        resp.setSyspara(sysParas);
+        return resp;
+    }
+
+    @Override
+    public PosPayWhitelistResp doGetWhitelist(PosPayWhitelistReq req) {
+        PosPayWhitelistResp resp = new PosPayWhitelistResp();
+        TDevice device = deviceService.getDeviceByDevphyid(req.getDevphyid());
+        if (null == device) {
+            resp.setRetcode(ErrorCode.E_DB_QRY);
+            resp.setRetmsg("设备物理ID不存在");
+            return resp;
+
+        }
+        if (device.getState() != 1) {
+            resp.setRetcode(ErrorCode.ERRIF_OTHER);
+            resp.setRetmsg("设备状态错误");
+            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> blacklistCards = cardService.getCardlistByTCardVer(req.getCardverno());
+        System.out.println("blacksize+++" + blacklistCards.size());
+        if (null == blacklistCards || blacklistCards.size() < 1) {
+            resp.setCardverno(maxCardverno);
+            resp.setRetcode(ErrorCode.ERRIF_OK);
+            resp.setRetmsg("下载成功");
+            resp.setCount(0);
+            resp.setWhitelist(cardverFlags);
+            return resp;
+        }
+
+        if (blacklistCards.size() < count) {
+
+            count = blacklistCards.size();
+        }
+        for (int i = 0; i < count; i++) {
+            TCardver cardver = blacklistCards.get(i);
+            CardverBean cardverFlag = new CardverBean();
+            cardverFlag.setCardno(cardver.getCardno());
+            cardverFlag.setCardphyid(cardver.getCardphyid());
+            cardverFlag.setStatus(cardver.getOptype());
+
+            cardverFlags.add(cardverFlag);
+        }
+
+
+        resp.setCardverno(maxCardverno);
+        resp.setRetcode(ErrorCode.ERRIF_OK);
+        resp.setRetmsg("下载成功");
+        resp.setCount(count);
+        resp.setWhitelist(cardverFlags);
+        return resp;
+    }
+
+    @Override
+    public PosPayHeartBeatResp posHeartBeat(PosPayHeartBeatReq req) {
+        PosPayHeartBeatResp resp = new PosPayHeartBeatResp();
+        TDevice device = deviceService.getDeviceByDevphyid(req.getDevphyid());
+        if (null == device) {
+            resp.setRetcode(ErrorCode.E_DB_QRY);
+            resp.setRetmsg("设备物理ID不存在");
+            return resp;
+        }
+        if (device.getState() != 1) {
+            resp.setRetcode(ErrorCode.ERRIF_OTHER);
+            resp.setRetmsg("设备状态错误");
+            return resp;
+        }
+        String datetime = DateUtil.getNow("yyyyMMddHHmmss");
+
+        device.setCardverno(req.getCardverno());
+        device.setLastbeattime(datetime);
+        device.setBeatstatus(1);
+        deviceService.saveDevice(device);
+
+        TDevparaGroup group = deviceParamService.getDevparaGroupByGroupid(req.getParagroupid());
+        if (group == null) {
+            resp.setRetcode(ErrorCode.ERRIF_OTHER);
+            resp.setRetmsg("未配置默认参数");
+            return resp;
+        }
+
+        resp.setRetcode(ErrorCode.ERRIF_OK);
+        resp.setRetmsg("心跳成功");
+        resp.setSystime(datetime);
+        resp.setParaverno(group.getVerno().intValue());
+        resp.setParagroupid(group.getGroupid());
+        resp.setCardverno(req.getCardverno());
+        return resp;
+
+    }
+
+    @Override
+    public PosPayQuerysalesResp posQuerySales(PosPaySysparaReq req) {
+        PosPayQuerysalesResp resp=new PosPayQuerysalesResp();
+        TDevice device = deviceService.getDeviceByDevphyid(req.getDevphyid());
+        if (null == device) {
+            resp.setRetcode(ErrorCode.E_DB_QRY);
+            resp.setRetmsg("设备物理ID不存在");
+            return resp;
+
+        }
+        if (device.getState() != 1) {
+            resp.setRetcode(ErrorCode.ERRIF_OTHER);
+            resp.setRetmsg("设备状态错误");
+            return resp;
+        }
+
+        SalesAmtBean salesAmtBean=transDtlService.getSalesToday(req.getTermdate(),device.getId());
+        ManageFeeAmtBean feeAmtBean=transDtlService.getManageFeeToday(req.getTermdate(),device.getId());
+
+
+        resp.setRetcode(ErrorCode.ERRIF_OK);
+        resp.setRetmsg("返回成功");
+        resp.setManagefeeamt(feeAmtBean.getManagefeeamt()*100);
+        resp.setManagefeecnt(feeAmtBean.getManagefeecnt());
+        resp.setSalesamt(salesAmtBean.getSalesamt()*100);
+        resp.setSalescnt(salesAmtBean.getSalescnt());
+        resp.setSalesdate(req.getTermdate());
+        return resp;
+    }
+
+    @Override
+    public PosPayAccqueryResp AccountQuery(PosPayAccqueryReq req) {
+        PosPayAccqueryResp resp=new PosPayAccqueryResp();
+
+        TDevice device = deviceService.getDeviceByDevphyid(req.getDevphyid());
+        if (null == device) {
+            resp.setRetcode(ErrorCode.E_DB_QRY);
+            resp.setRetmsg("设备物理ID不存在");
+            return resp;
+
+        }
+        if (device.getState() != 1) {
+            resp.setRetcode(ErrorCode.ERRIF_OTHER);
+            resp.setRetmsg("设备状态错误");
+            return resp;
+        }
+
+        TCard card=cardService.getCardByCardnoAndCardphyid(req.getCardno(),req.getCardphyid());
+
+        if(null==card){
+            resp.setRetcode(ErrorCode.ERRIF_CARD_NOTEXIST);
+            resp.setRetmsg("卡不存在");
+            return resp;
+        }
+
+        TCustomer customer=customerService.getCustomerByCustid(card.getCustid());
+        if(null==customer){
+            resp.setRetcode(ErrorCode.ERRIF_CARD_PWD);
+            resp.setRetmsg("未查询到卡对应客户");
+            return resp;
+        }
+
+        resp.setCardverno(card.getCardverno());
+        resp.setExpiredate(card.getClosedate());
+        resp.setStatus(card.getStatus());
+        resp.setUserid(customer.getCustid());
+        resp.setUsername(customer.getCustname());
+        resp.setSystime(DateUtil.getNow());
+
+        resp.setRetcode(ErrorCode.ERRIF_OK);
+        resp.setRetmsg("查询成功");
+        return resp;
+
+    }
+
+    @Override
+    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());
+        List<TMealtype> mealtypes = mealTypeDao.findAllByOrderByEndtime();
+        transDtl.setTermsqlno(req.getTermseqno());
+        String err="";
+        TDevice device = deviceService.getDeviceByDevphyid(req.getDevphyid());
+        if (null == device) {
+            err+="设备物理ID不存在;";
+
+        }
+        if (device.getState() != 1) {
+            err+="设备状态错误;";
+        }else{
+            transDtl.setTermid(device.getId());
+            transDtl.setShopid(device.getShopid());
+        }
+
+        TCard tCard = cardService.getCardByCardnoAndCardphyid(req.getCardno(), req.getCardphyid());
+        if (null == tCard) {
+
+            err+="卡号[" + req.getCardno() + "]不存在;";
+        }
+
+        TCustomer customer=customerService.getCustomerByCustid(tCard.getCustid());
+        if(null==customer){
+            err+="卡对应人员不存在;";
+        } else {
+            transDtl.setCustid(customer.getCustid());
+            transDtl.setCustname(customer.getCardno());
+        }
+
+
+
+        if("true".equals(req.getReversalflag())){
+            transDtl.setTranstype(RestaurantConstant.TRANSTYPE_TRANSDTL_REVERT);
+        }else{
+            transDtl.setTranstype(RestaurantConstant.TRANSTYPE_TRANSDTL_OFFLINE);
+        }
+
+        try {
+            for (TMealtype m : mealtypes) {
+                if (DateUtil.compareTime(m.getEndtime(), req.getTranstime())) {
+                    transDtl.setMealtype(m.getMealtype());
+                    break;
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            err+="设置餐补类型失败;";
+        }
+
+        if("true".equals(req.getReversalflag())){
+            TOfflineTransDtl tTransDtl =
+                    offlineTransDtlService.getOfflineTransDtlByTermsqlnoAndTermid(req.getTermseqno(),device.getId(),req.getTransdate());
+            if (null == tTransDtl) {
+                err+=("终端参考号" + req.getReversaltermseqno() + "不存在;");
+            }else{
+                if (!tTransDtl.getStatus().toUpperCase().equals(
+                        RestaurantConstant.STATUS_TRANSDTL_SUCCESS.toUpperCase())) {
+                    err+=("交易状态未成功;");
+                }
+                if (tTransDtl.getRevflag() == 1) {
+                    err+=("流水" + req.getReversaltermseqno() + "已冲正");
+                }
+
+                try {
+                    if(!"".equals(err)){
+                        transDtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_FAIL);
+                    }else{
+                        transDtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_INIT);
+                    }
+                    offlineTransDtlService.revertOfflineTransdtl(tTransDtl);
+                    resp.setTermseqno(tTransDtl.getTermsqlno());
+                    resp.setRetmsg("保存成功");
+                    resp.setRetcode(ErrorCode.ERRIF_OK);
+                    return resp;
+                } catch (Exception e) {
+                    e.printStackTrace();
+                    resp.setRetmsg("冲正失败，错误：" + e.getMessage());
+                }
+            }
+        }
+
+        if(!"".equals(err)){
+            transDtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_FAIL);
+        }else{
+            transDtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_INIT);
+        }
+        transDtl.setAttr1(err);
+        offlineTransDtlService.saveTransdtl(transDtl);
+
+        resp.setRetcode(ErrorCode.ERRIF_OK);
+        resp.setRetmsg("保存成功");
+        resp.setTermseqno(req.getTermseqno());
+        return resp;
+    }
+
+  /*  @Override
+    public void checkOfflineDtl() {
+        List<TOfflineTransDtl> transDtls=offlineTransDtlService.getUncheckOfflineTransdtl(DateUtil.getNow("yyyyMMdd"));
+        if(transDtls.size()<1){
+            return;
+        }
+        for(TOfflineTransDtl dtl:transDtls){
+
+
+
+
+        }
+
+    }*/
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/api/task/PosPayTask.java b/src/main/java/com/supwisdom/dlpay/api/task/PosPayTask.java
new file mode 100644
index 0000000..7b88a0b
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/api/task/PosPayTask.java
@@ -0,0 +1,41 @@
+package com.supwisdom.dlpay.api.task;
+
+import com.supwisdom.dlpay.api.service.PosPayService;
+import com.supwisdom.dlpay.framework.util.DateUtil;
+import com.supwisdom.dlpay.restaurant.dao.TransDtlDao;
+import com.supwisdom.dlpay.restaurant.domain.TTransDtl;
+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      //1.主要用于标记配置类，兼备Component的效果。
+@EnableScheduling   // 2.开启定时任务
+public class PosPayTask {
+    private static final Logger logger = LoggerFactory.getLogger(PosPayTask.class);
+
+
+    @Autowired
+    private TransDtlService transDtlService;
+
+    @Scheduled(cron = "0/10 * * * * ?")
+    private void configureTasks() {
+        List<TTransDtl> dtls=transDtlService.getSubmittingTransdtl();
+        if(dtls.size()>0){
+            logger.info("正在上传"+dtls.size()+"笔流水");
+            for(TTransDtl dtl:dtls){
+                dtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_SUCCESS);
+                transDtlService.saveTransdtl(dtl);
+            }
+        }
+
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/api/util/ErrorCode.java b/src/main/java/com/supwisdom/dlpay/api/util/ErrorCode.java
new file mode 100644
index 0000000..57a7905
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/api/util/ErrorCode.java
@@ -0,0 +1,95 @@
+package com.supwisdom.dlpay.api.util;
+
+/**
+ * Created by tangcheng on 16/8/8.
+ */
+public class ErrorCode {
+
+  public final static String ERRIF_OK = "0";// 成功
+  public final static String ERRIF_SYSTEM = "1";// 系统故障
+  public final static String ERRIF_NETWORK = "2";// 网络故障
+  public final static String ERRIF_DATABASE_ERROR = "3";// 数据库错误
+  public final static String ERRIF_SYS_DAYENDACC = "9";// 系统日终处理中
+  public final static String ERRIF_SIGN_ERROR = "4"; //签名验证错误
+  public final static String ERRIF_CHECKNUM_ERROR = "5";//验证码错误
+  public final static String ERRIF_FRONT_NOREG = "10";// 前置机未注册
+  public final static String ERRIF_FRONT_NOACTIVE = "11";// 前置机未激活
+  public final static String ERRIF_FRONT_NOLOGIN = "12";// 前置机未签到
+  public final static String ERRIF_FRONT_CLOSE = "13";// 前置机已注销
+  public final static String ERRIF_FRONT_DYNAKEY = "14";// 前置机密钥错
+  public final static String ERRIF_FRONT_NOFUNC = "15";// 前置机无此功能
+  public final static String ERRIF_DATE_FMT = "16";// 日期格式错误
+
+  public final static String ERRIF_POS_NOREG = "20";// 终端未注册
+  public final static String ERRIF_POS_NOTLOGIN = "21";// 终端未签到
+  public final static String ERRIF_POS_NOENABLE = "22";// 终端未启用
+  public final static String ERRIF_POS_DISABLE = "23";// 终端已停用
+  public final static String ERRIF_POS_CLOSE = "24";// 终端已注销
+  public final static String ERRIF_POS_TERMID = "25";// 终端号错误
+  public final static String ERRIF_POS_NOSHOP = "26";// 终端无指定商户
+  public final static String ERRIF_POS_NOINWORKTIME = "27";// 终端非工作时间
+  public final static String ERRIF_POS_NOFUNC = "28";// 终端无此功能
+  public final static String ERRIF_POS_NOAUTH = "29";// 终端未授权
+  public final static String ERRIF_POS_SEQNO_REPEAT = "30";// 终端流水号重复
+  public final static String ERRIF_POSDTL_NOTEXIST = "31";// 流水不存在
+  public final static String ERRIF_TRANS_REVERSED = "32";// 交易已冲正
+  public final static String ERRIF_POS_BOARDRATE = "33";// 搭伙费率错误
+  public final static String ERRIF_POS_TRANSAMT = "34";// 交易金额错误
+  public final static String ERRIF_POS_TRANSTYPE = "35";// 交易类型错误
+  public final static String ERRIF_POS_SHOPID = "36";// 终端机商户号错
+  public final static String ERRIF_NOTREVSUBSIDY = "37";// 有补助不能冲正
+  public final static String ERRIF_DATA = "38";// 终端数据错误
+
+  public final static String ERRIF_POS_ADDR = "39";// 终端地址错误
+
+  public final static String ERRIF_SHOP_NOTEXIST = "40";// 商户号不存在
+  public final static String ERRIF_SHOP_CLOSE = "41";// 商户已注销
+  public final static String ERRIF_SHOP_TYPE = "42";// 商户类型错误
+  public final static String ERRIF_SHOP_STOPPAY = "43";// 商户已止付
+  public final static String ERRIF_SHOP_ACC_EXCEPT = "44";// 商户账户异常
+  public final static String ERRIF_SHOPBAL_SHORTAGE = "45";// 商户余额不足
+
+  public final static String ERRIF_DPSDTL_NOTEXIST = "49";// 充值流水不存在
+  public final static String ERRIF_CARD_NOTEXIST = "50";// 卡号不存在
+
+  public final static String ERRIF_CARD_LOST = "51";// 卡已挂失
+  public final static String ERRIF_CARD_FROZED = "52";// 卡已冻结
+  public final static String ERRIF_CARD_BAD = "53";// 卡已登记为坏卡
+  public final static String ERRIF_CARD_LOCKED = "54";// 卡已锁定
+  public final static String ERRIF_CARD_DISABLED = "55";// 卡已禁用
+  public final static String ERRIF_CARD_EXPIRED = "56";// 卡已过有效期
+  public final static String ERRIF_CARD_CLOSE = "57";// 卡已注销
+  public final static String ERRIF_CARD_STATUSEXCEPT = "58";//卡状态异常
+  public final static String ERRIF_CARD_NORIGHT = "59";// 卡无此权限
+  public final static String ERRIF_CARD_PWD = "60";// 卡密码错误
+  public final static String ERRIF_CARDCNT_REPEAT = "61";// 卡交易次数重复
+  public final static String ERRIF_CARDCNT_EXCEPT = "62";// 卡交易次数异常
+  public final static String ERRIF_CARD_SUBSIDYNO_EXCEPT = "63";//卡补助序号异常
+  public final static String ERRIF_CARDBAL_SHORTAGE = "64";// 卡余额不足
+  public final static String ERRIF_CARDBAL_OVERDRAW = "65";// 卡已透支
+  public final static String ERRIF_CARDBAL_EXCEED_LIMIT = "66";// 卡余额超过限额
+  public final static String ERRIF_CARDBAL_EXCEPT = "67";// 卡余额异常
+  public final static String ERRIF_CARDACC_SHORTAGE = "68";// 卡账户余额不足
+  public final static String ERRIF_CARDACC_OVERDRAW = "69";// 卡账户已透支
+  public final static String ERRIF_CARDACC_EXCEPT = "70";// 卡账户异常
+  public final static String ERRIF_CARD_PAY_LIMIT = "71";// 消费金额超限
+  public final static String ERRIF_DPSKEY_NOTFIND= "72";// 系统充值秘钥未配置
+
+
+  public final static String ERRIF_AUTHCARD_INVALID = "81";// 授权卡认证错误
+  public final static String ERRIF_AUTHCARD_PWD = "89";// 授权卡密码错误
+  public final static String ERRIF_DEPOSIT_EXCEED_LIMIT = "90";// 充值已达到限额
+  public final static String E_CARDKEY = "98";// 系统卡密钥错误
+  public final static String ERRIF_OTHER = "99";// 其他错误
+  public final static String E_DB_NODATA = "100";// 无符合条件记录
+  public final static String E_DB_QRY = "101";// 查询错误
+  public final static String E_REQ_DATA_ERROR = "102";//请求数据有误
+  public final static String E_DB_CONSTRAINTVIOLATIONEXCEPTION = "111";//唯一性冲突
+  public final static String E_DB_SEQ_REFNO_R = "1000";// 获取交易参考号序列错误
+
+  public final static String E_EMPTY_PARAM = "231"; //请求参数为空
+  public final static String E_EMPTY_AREA = "232"; //设备、用户不存在或没有配置校区
+  public final static String E_CHECK_AREA = "233"; //设备、用户校区不匹配
+
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/ShopSettlementDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/ShopSettlementDao.java
index aa132f1..c763deb 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/dao/ShopSettlementDao.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/ShopSettlementDao.java
@@ -4,8 +4,12 @@
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 
 @Repository
 public interface ShopSettlementDao extends JpaRepository<TShopSettlement, String> {
     int countByShopid(Integer shopid);
+
+    List<TShopSettlement> findByShopid(Integer shopid);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TShopSettlement.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TShopSettlement.java
index 03a0faf..e84e91a 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/TShopSettlement.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TShopSettlement.java
@@ -8,7 +8,7 @@
   @Id
   @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_SETTLEMENT")
   @Column(name="SHOPSettlementno",unique = true, nullable = false, length = 9)
-  private String SHOPSettlementno;
+  private String shopsettlementno;
 
   @Column(name="SHOPID", precision = 9)
   private Integer shopid;
@@ -20,12 +20,12 @@
   private String operno;
 
 
-  public String getSHOPSettlementno() {
-    return SHOPSettlementno;
+  public String getShopSettlementno() {
+    return shopsettlementno;
   }
 
-  public void setSHOPSettlementno(String SHOPSettlementno) {
-    this.SHOPSettlementno = SHOPSettlementno;
+  public void setShopSettlementno(String SHOPSettlementno) {
+    this.shopsettlementno = SHOPSettlementno;
   }
 
   public Integer getShopid() {
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 60d79cf..d124781 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/filter/CrosXssFilter.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/filter/CrosXssFilter.java
@@ -9,6 +9,7 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
+import java.util.Map;
 
 @WebFilter
 public class CrosXssFilter implements Filter {
diff --git a/src/main/java/com/supwisdom/dlpay/framework/security/MyPermissionEvaluator.java b/src/main/java/com/supwisdom/dlpay/framework/security/MyPermissionEvaluator.java
index 4e96995..ea2c25b 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/security/MyPermissionEvaluator.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/security/MyPermissionEvaluator.java
@@ -29,6 +29,7 @@
   @Override
   public boolean hasPermission(Authentication authentication, Object targetUri, Object permission) {
     //TODO save logger
+
     if (targetUri != null) {
       UserDetails userDetails = (UserDetails) authentication.getPrincipal();
       if (userDetails != null) {
diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/DateUtil.java b/src/main/java/com/supwisdom/dlpay/framework/util/DateUtil.java
index 6faf336..93a4244 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/DateUtil.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/DateUtil.java
@@ -10,333 +10,343 @@
 import java.util.TimeZone;
 
 public class DateUtil {
-  private static final Logger logger = LoggerFactory.getLogger(DateUtil.class);
-  public static final String DATE_FMT = "yyyyMMdd";
-  public static final String TIME_FMT = "HHmmss";
-  public static final String DATETIME_FMT = "yyyyMMddHHmmss";
+    private static final Logger logger = LoggerFactory.getLogger(DateUtil.class);
+    public static final String DATE_FMT = "yyyyMMdd";
+    public static final String TIME_FMT = "HHmmss";
+    public static final String DATETIME_FMT = "yyyyMMddHHmmss";
 
-  /**
-   * Description: 返回一个当前时间 @return String 格式：yyyyMMddHHmmss @exception Modify
-   * History:
-   */
-  public static String getNow() {
-    java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMddHHmmss");
-    return sdf.format(new Date());
-  }
-
-
-  /**
-   * Description: 根据类型返回一个当前时间 @param partten String @return String 格式：partten
-   */
-  public static String getNow(String partten) {
-    SimpleDateFormat sdf = new SimpleDateFormat(partten);
-    return sdf.format(new Date());
-  }
-
-  /**
-   * Description: 得到一个特殊的时间 @param startTime String 格式：yyyyMMddHHmmss @param
-   * interval int 秒 @return String 格式：partten @exception Modify History:
-   */
-  public static String getNewTime(String startTime, int interval) {
-    try {
-      java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMddHHmmss");
-      Date d = sdf.parse(startTime);
-      Calendar calendar = Calendar.getInstance();
-      calendar.setTimeInMillis(d.getTime());
-      calendar.add(Calendar.SECOND, interval);
-      return sdf.format(calendar.getTime());
-    } catch (ParseException e) {
-      return startTime;
+    /**
+     * Description: 返回一个当前时间 @return String 格式：yyyyMMddHHmmss @exception Modify
+     * History:
+     */
+    public static String getNow() {
+        java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMddHHmmss");
+        return sdf.format(new Date());
     }
-  }
 
-  /**
-   * Description: 得到一个特殊的时间 @param startTime String 格式：partten @param
-   * interval int 秒 @return String 格式：partten @exception Modify History:
-   */
-  public static String getNewTime(String startTime, int interval, String partten) {
-    try {
-      java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(partten);
-      Date d = sdf.parse(startTime);
-      Calendar calendar = Calendar.getInstance();
-      calendar.setTimeInMillis(d.getTime());
-      calendar.add(Calendar.SECOND, interval);
-      return sdf.format(calendar.getTime());
-    } catch (ParseException e) {
-      return startTime;
-    }
-  }
+    public static boolean compareTime(String time1,String time2) throws ParseException{
+        SimpleDateFormat df = new SimpleDateFormat("HHmmss");
+        Date dt1=df.parse(time1);
+        Date dt2=df.parse(time2);
+        if(dt1.getTime()>dt2.getTime()){
+            return true;
 
-  public static String getNewDay(String startDay, int intervalday) {
-    try {
-      java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMdd");
-      Date d = sdf.parse(startDay);
-      Calendar calendar = Calendar.getInstance();
-      calendar.setTimeInMillis(d.getTime());
-      calendar.add(Calendar.DATE, intervalday);
-      return sdf.format(calendar.getTime());
-    } catch (ParseException e) {
-      return startDay;
-    }
-  }
-
-  /**
-   * 获取当天前后的时间
-   *
-   * @param intervalday
-   * @param format
-   * @return
-   */
-  public static String getNewDay(int intervalday, String format) {
-    SimpleDateFormat sdf = new SimpleDateFormat(format);
-    Calendar calendar = Calendar.getInstance();
-    calendar.setTime(new Date());
-    calendar.add(Calendar.DATE, intervalday);
-    return sdf.format(calendar.getTime());
-  }
-
-  /**
-   * 得到两个日期相差的天数 格式 yyyyMMdd @return diffdays = secondDay - firstDay
-   */
-  public static long getIntervalDay(String firstDay, String secondDay) {
-    try {
-      java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMdd");
-      Date f = sdf.parse(firstDay);
-      Date s = sdf.parse(secondDay);
-      long time = s.getTime() - f.getTime();
-      return time / (24 * 60 * 60 * 1000);
-    } catch (ParseException e) {
-      return 0;
-    }
-  }
-
-  /**
-   * Description: 比较两个时间字符串的前后关系 @param firstTime String 格式：yyyyMMddHHmmss
-   *
-   * @param secondTime String 格式: yyyyMMddHHmmss @return int |
-   *                   firstTime=second int=0 | firstTime>secondTime int>0 |
-   *                   firstTime<secondTime int<0 @exception Modify History:
-   */
-  public static int compareDatetime(String firstTime, String secondTime) {
-    try {
-      java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMddHHmmss");
-      Date f = sdf.parse(firstTime);
-      Date s = sdf.parse(secondTime);
-      return f.compareTo(s);
-    } catch (ParseException e) {
-      return 0;
-    }
-  }
-
-  /**
-   * Description: 比较两个时间字符串的前后关系 @param firstTime String 格式：pattern
-   *
-   * @param secondTime String 格式: yyyyMMddHHmmss @return int |
-   *                   firstTime=second int=0 | firstTime>secondTime int>0 |
-   *                   firstTime<secondTime int<0 @exception Modify History:
-   */
-  public static int compareDatetime(String firstTime, String secondTime, String pattern) {
-    try {
-      java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(pattern);
-      Date f = sdf.parse(firstTime);
-      Date s = sdf.parse(secondTime);
-      return f.compareTo(s);
-    } catch (ParseException e) {
-      return 0;
-    }
-  }
-
-  /**
-   * Description: 比较两个时间字符串的时间差 @param firstTime String 格式：yyyyMMddHHmmss
-   *
-   * @param secondTime String 格式: yyyyMMddHHmmss @param second int 格式 @return
-   *                   int | firstTime+seconds=secondTime int=0 | firstTime+seconds>secondTime
-   *                   int>0 | firstTime+seconds<secondTime int<0 @exception Modify History:
-   */
-  public static int compareDatetime(String firstTime, String secondTime, int seconds) {
-    try {
-      java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMddHHmmss");
-      Date f = sdf.parse(firstTime);
-      Date s = sdf.parse(secondTime);
-      Calendar calendar = Calendar.getInstance();
-      calendar.setTimeInMillis(f.getTime());
-      calendar.add(Calendar.SECOND, seconds);
-      Date temp = calendar.getTime();
-      return temp.compareTo(s);
-    } catch (Exception e) {
-      return 0;
-    }
-  }
-
-  /**
-   * Description: 对time重新格式化
-   */
-  public static String reformatDatetime(String time, String fromPattern, String toPattern) {
-    try {
-      java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(fromPattern);
-      Date d = sdf.parse(time);
-      Calendar calendar = Calendar.getInstance();
-      calendar.setTimeInMillis(d.getTime());
-      sdf = new SimpleDateFormat(toPattern);
-      return sdf.format(calendar.getTime());
-    } catch (Exception e) {
-      e.printStackTrace();
-      return time;
-    }
-  }
-
-  /**
-   * 获得两个字符串日期之间的时间差(单位毫秒) 格式 yyyyMMddHHmmss
-   */
-  public static long getInterval(String startTime, String endTime) {
-    long duration = 0;
-    try {
-      java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMddHHmmss");
-      duration = sdf.parse(endTime).getTime() - sdf.parse(startTime).getTime();
-    } catch (ParseException e) {
-      logger.error("Hi guys,there is an error when you try to parse the date string");
-    }
-    return duration;
-  }
-
-  /**
-   * 获得两个字符串日期之间的时间差(单位毫秒)
-   */
-  public static long getIntervalTime(String startTime, String endTime, String pattern) {
-    long duration = 0;
-    try {
-      java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(pattern);
-      duration = sdf.parse(endTime).getTime() - sdf.parse(startTime).getTime();
-    } catch (ParseException e) {
-      logger.error("Hi guys,there is an error when you try to parse the date string");
-    }
-    return duration;
-  }
-
-  /**
-   * 转换成日期格式
-   * 短格式：20140401 -> 2014-04-01
-   * 中格式：201404011200 -> 2014-04-01 12:00
-   * 长格式：20140401123025 -> 2014-04-01 12:30:25
-   **/
-  public static String parseToDateFormat(String str) {
-    switch (str.length()) {
-      case 8:
-        str = str.substring(0, 4) + "-" + str.substring(4, 6) + "-" + str.substring(6, 8);
-        break;
-      case 12:
-        str = str.substring(0, 4) + "-" + str.substring(4, 6) + "-" + str.substring(6, 8) + " " + str.substring(8, 10) + ":" + str.substring(10, 12);
-        break;
-      case 14:
-        str = str.substring(0, 4) + "-" + str.substring(4, 6) + "-" + str.substring(6, 8) + " " + str.substring(8, 10) + ":" + str.substring(10, 12) + ":" + str.substring(12, 14);
-        break;
-      default:
-        break;
-    }
-    return str;
-  }
-
-  /**
-   * 解日期格式
-   * 短格式：2014-04-01 -> 20140401
-   * 中格式：2014-04-01 12:00 -> 201404011200
-   * 长格式：2014-04-01 12:30:25 -> 20140401123025
-   **/
-  public static String unParseToDateFormat(String str) {
-    return str.replaceAll("-", "").replaceAll(" ", "").replaceAll(":", "");
-  }
-
-  /**
-   * 检验时间格式
-   */
-  public static boolean checkDatetimeValid(String datetime, String pattern) {
-    if (null == datetime) return false;
-    try {
-      java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(pattern);
-      Date d = sdf.parse(datetime);
-      return datetime.trim().equals(sdf.format(d));
-    } catch (Exception e) {
-    }
-    return false;
-  }
-
-  /**
-   * 获取指定日期是星期几 格式 yyyyMMdd
-   * MON|TUE|WED|THU|FRI|SAT|SUN
-   * 1		2		3		4		5		6		7
-   */
-  public static int getWeekday(String datestr) {
-    try {
-      java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMdd");
-      Calendar calendar = Calendar.getInstance();
-      boolean isFirstSunday = (calendar.getFirstDayOfWeek() == Calendar.SUNDAY); //一周第一天是否为星期天
-      Date d = sdf.parse(datestr);
-      calendar.setTimeInMillis(d.getTime());
-      int weekDay = calendar.get(calendar.DAY_OF_WEEK);
-      if (isFirstSunday) {
-        weekDay = weekDay - 1;
-        if (weekDay == 0) {
-          weekDay = 7;
         }
-      }
-      return weekDay;
-    } catch (Exception e) {
-      return -1;
+        return false;
+
     }
-  }
-
-  /**
-   * 获取指定日期
-   */
-  public static Date getSpecifyDate(String datestr, String pattern) {
-    try {
-      java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(pattern);
-      Date result = sdf.parse(datestr);
-      return result;
-    } catch (Exception e) {
-      return new Date();
+    /**
+     * Description: 根据类型返回一个当前时间 @param partten String @return String 格式：partten
+     */
+    public static String getNow(String partten) {
+        SimpleDateFormat sdf = new SimpleDateFormat(partten);
+        return sdf.format(new Date());
     }
-  }
 
-  public static Integer getLastDayOfMonth(Integer year, Integer month) {
-    Calendar cal = Calendar.getInstance();
-    cal.set(Calendar.YEAR, year);
-    cal.set(Calendar.MONTH, month - 1);
-    cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DATE));
-    String str = new SimpleDateFormat("yyyyMMdd ").format(cal.getTime()).toString();
-    Integer result = Integer.parseInt(str.substring(0, 4) + str.substring(4, 6) + str.substring(6, 8));
-    return result;
-  }
+    /**
+     * Description: 得到一个特殊的时间 @param startTime String 格式：yyyyMMddHHmmss @param
+     * interval int 秒 @return String 格式：partten @exception Modify History:
+     */
+    public static String getNewTime(String startTime, int interval) {
+        try {
+            java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMddHHmmss");
+            Date d = sdf.parse(startTime);
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTimeInMillis(d.getTime());
+            calendar.add(Calendar.SECOND, interval);
+            return sdf.format(calendar.getTime());
+        } catch (ParseException e) {
+            return startTime;
+        }
+    }
 
-  private static Date set(Date date, int calendarField, int amount) {
-    Calendar c = Calendar.getInstance();
-    c.setLenient(false);
-    c.setTime(date);
-    c.add(calendarField, amount);
-    return c.getTime();
-  }
+    /**
+     * Description: 得到一个特殊的时间 @param startTime String 格式：partten @param
+     * interval int 秒 @return String 格式：partten @exception Modify History:
+     */
+    public static String getNewTime(String startTime, int interval, String partten) {
+        try {
+            java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(partten);
+            Date d = sdf.parse(startTime);
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTimeInMillis(d.getTime());
+            calendar.add(Calendar.SECOND, interval);
+            return sdf.format(calendar.getTime());
+        } catch (ParseException e) {
+            return startTime;
+        }
+    }
+
+    public static String getNewDay(String startDay, int intervalday) {
+        try {
+            java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMdd");
+            Date d = sdf.parse(startDay);
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTimeInMillis(d.getTime());
+            calendar.add(Calendar.DATE, intervalday);
+            return sdf.format(calendar.getTime());
+        } catch (ParseException e) {
+            return startDay;
+        }
+    }
+
+    /**
+     * 获取当天前后的时间
+     *
+     * @param intervalday
+     * @param format
+     * @return
+     */
+    public static String getNewDay(int intervalday, String format) {
+        SimpleDateFormat sdf = new SimpleDateFormat(format);
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(new Date());
+        calendar.add(Calendar.DATE, intervalday);
+        return sdf.format(calendar.getTime());
+    }
+
+    /**
+     * 得到两个日期相差的天数 格式 yyyyMMdd @return diffdays = secondDay - firstDay
+     */
+    public static long getIntervalDay(String firstDay, String secondDay) {
+        try {
+            java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMdd");
+            Date f = sdf.parse(firstDay);
+            Date s = sdf.parse(secondDay);
+            long time = s.getTime() - f.getTime();
+            return time / (24 * 60 * 60 * 1000);
+        } catch (ParseException e) {
+            return 0;
+        }
+    }
+
+    /**
+     * Description: 比较两个时间字符串的前后关系 @param firstTime String 格式：yyyyMMddHHmmss
+     *
+     * @param secondTime String 格式: yyyyMMddHHmmss @return int |
+     *                   firstTime=second int=0 | firstTime>secondTime int>0 |
+     *                   firstTime<secondTime int<0 @exception Modify History:
+     */
+    public static int compareDatetime(String firstTime, String secondTime) {
+        try {
+            java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMddHHmmss");
+            Date f = sdf.parse(firstTime);
+            Date s = sdf.parse(secondTime);
+            return f.compareTo(s);
+        } catch (ParseException e) {
+            return 0;
+        }
+    }
+
+    /**
+     * Description: 比较两个时间字符串的前后关系 @param firstTime String 格式：pattern
+     *
+     * @param secondTime String 格式: yyyyMMddHHmmss @return int |
+     *                   firstTime=second int=0 | firstTime>secondTime int>0 |
+     *                   firstTime<secondTime int<0 @exception Modify History:
+     */
+    public static int compareDatetime(String firstTime, String secondTime, String pattern) {
+        try {
+            java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(pattern);
+            Date f = sdf.parse(firstTime);
+            Date s = sdf.parse(secondTime);
+            return f.compareTo(s);
+        } catch (ParseException e) {
+            return 0;
+        }
+    }
+
+    /**
+     * Description: 比较两个时间字符串的时间差 @param firstTime String 格式：yyyyMMddHHmmss
+     *
+     * @param secondTime String 格式: yyyyMMddHHmmss @param second int 格式 @return
+     *                   int | firstTime+seconds=secondTime int=0 | firstTime+seconds>secondTime
+     *                   int>0 | firstTime+seconds<secondTime int<0 @exception Modify History:
+     */
+    public static int compareDatetime(String firstTime, String secondTime, int seconds) {
+        try {
+            java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMddHHmmss");
+            Date f = sdf.parse(firstTime);
+            Date s = sdf.parse(secondTime);
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTimeInMillis(f.getTime());
+            calendar.add(Calendar.SECOND, seconds);
+            Date temp = calendar.getTime();
+            return temp.compareTo(s);
+        } catch (Exception e) {
+            return 0;
+        }
+    }
+
+    /**
+     * Description: 对time重新格式化
+     */
+    public static String reformatDatetime(String time, String fromPattern, String toPattern) {
+        try {
+            java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(fromPattern);
+            Date d = sdf.parse(time);
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTimeInMillis(d.getTime());
+            sdf = new SimpleDateFormat(toPattern);
+            return sdf.format(calendar.getTime());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return time;
+        }
+    }
+
+    /**
+     * 获得两个字符串日期之间的时间差(单位毫秒) 格式 yyyyMMddHHmmss
+     */
+    public static long getInterval(String startTime, String endTime) {
+        long duration = 0;
+        try {
+            java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMddHHmmss");
+            duration = sdf.parse(endTime).getTime() - sdf.parse(startTime).getTime();
+        } catch (ParseException e) {
+            logger.error("Hi guys,there is an error when you try to parse the date string");
+        }
+        return duration;
+    }
+
+    /**
+     * 获得两个字符串日期之间的时间差(单位毫秒)
+     */
+    public static long getIntervalTime(String startTime, String endTime, String pattern) {
+        long duration = 0;
+        try {
+            java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(pattern);
+            duration = sdf.parse(endTime).getTime() - sdf.parse(startTime).getTime();
+        } catch (ParseException e) {
+            logger.error("Hi guys,there is an error when you try to parse the date string");
+        }
+        return duration;
+    }
+
+    /**
+     * 转换成日期格式
+     * 短格式：20140401 -> 2014-04-01
+     * 中格式：201404011200 -> 2014-04-01 12:00
+     * 长格式：20140401123025 -> 2014-04-01 12:30:25
+     **/
+    public static String parseToDateFormat(String str) {
+        switch (str.length()) {
+            case 8:
+                str = str.substring(0, 4) + "-" + str.substring(4, 6) + "-" + str.substring(6, 8);
+                break;
+            case 12:
+                str = str.substring(0, 4) + "-" + str.substring(4, 6) + "-" + str.substring(6, 8) + " " + str.substring(8, 10) + ":" + str.substring(10, 12);
+                break;
+            case 14:
+                str = str.substring(0, 4) + "-" + str.substring(4, 6) + "-" + str.substring(6, 8) + " " + str.substring(8, 10) + ":" + str.substring(10, 12) + ":" + str.substring(12, 14);
+                break;
+            default:
+                break;
+        }
+        return str;
+    }
+
+    /**
+     * 解日期格式
+     * 短格式：2014-04-01 -> 20140401
+     * 中格式：2014-04-01 12:00 -> 201404011200
+     * 长格式：2014-04-01 12:30:25 -> 20140401123025
+     **/
+    public static String unParseToDateFormat(String str) {
+        return str.replaceAll("-", "").replaceAll(" ", "").replaceAll(":", "");
+    }
+
+    /**
+     * 检验时间格式
+     */
+    public static boolean checkDatetimeValid(String datetime, String pattern) {
+        if (null == datetime) return false;
+        try {
+            java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(pattern);
+            Date d = sdf.parse(datetime);
+            return datetime.trim().equals(sdf.format(d));
+        } catch (Exception e) {
+        }
+        return false;
+    }
+
+    /**
+     * 获取指定日期是星期几 格式 yyyyMMdd
+     * MON|TUE|WED|THU|FRI|SAT|SUN
+     * 1		2		3		4		5		6		7
+     */
+    public static int getWeekday(String datestr) {
+        try {
+            java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMdd");
+            Calendar calendar = Calendar.getInstance();
+            boolean isFirstSunday = (calendar.getFirstDayOfWeek() == Calendar.SUNDAY); //一周第一天是否为星期天
+            Date d = sdf.parse(datestr);
+            calendar.setTimeInMillis(d.getTime());
+            int weekDay = calendar.get(calendar.DAY_OF_WEEK);
+            if (isFirstSunday) {
+                weekDay = weekDay - 1;
+                if (weekDay == 0) {
+                    weekDay = 7;
+                }
+            }
+            return weekDay;
+        } catch (Exception e) {
+            return -1;
+        }
+    }
+
+    /**
+     * 获取指定日期
+     */
+    public static Date getSpecifyDate(String datestr, String pattern) {
+        try {
+            java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(pattern);
+            Date result = sdf.parse(datestr);
+            return result;
+        } catch (Exception e) {
+            return new Date();
+        }
+    }
+
+    public static Integer getLastDayOfMonth(Integer year, Integer month) {
+        Calendar cal = Calendar.getInstance();
+        cal.set(Calendar.YEAR, year);
+        cal.set(Calendar.MONTH, month - 1);
+        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DATE));
+        String str = new SimpleDateFormat("yyyyMMdd ").format(cal.getTime()).toString();
+        Integer result = Integer.parseInt(str.substring(0, 4) + str.substring(4, 6) + str.substring(6, 8));
+        return result;
+    }
+
+    private static Date set(Date date, int calendarField, int amount) {
+        Calendar c = Calendar.getInstance();
+        c.setLenient(false);
+        c.setTime(date);
+        c.add(calendarField, amount);
+        return c.getTime();
+    }
 
 
-  public static Date setMinutes(Date date, int amount) {
-    return set(date, Calendar.MINUTE, amount);
-  }
+    public static Date setMinutes(Date date, int amount) {
+        return set(date, Calendar.MINUTE, amount);
+    }
 
 
-  public static long getNowSecond() {
-    Calendar calendar = Calendar.getInstance();
-    return calendar.getTimeInMillis() / 1000;
-  }
+    public static long getNowSecond() {
+        Calendar calendar = Calendar.getInstance();
+        return calendar.getTimeInMillis() / 1000;
+    }
 
 
-  public static String getUTCTime(Long timeInMillisSecond) {
-    Calendar time = Calendar.getInstance();
-    SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
-    fmt.setTimeZone(TimeZone.getTimeZone("UTC"));
-    time.setTimeInMillis(timeInMillisSecond);
-    return fmt.format(time.getTime());
-  }
+    public static String getUTCTime(Long timeInMillisSecond) {
+        Calendar time = Calendar.getInstance();
+        SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
+        fmt.setTimeZone(TimeZone.getTimeZone("UTC"));
+        time.setTimeInMillis(timeInMillisSecond);
+        return fmt.format(time.getTime());
+    }
 
-  public static String getUTCTime() {
-    return getUTCTime(System.currentTimeMillis());
-  }
+    public static String getUTCTime() {
+        return getUTCTime(System.currentTimeMillis());
+    }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/bean/ManageFeeAmtBean.java b/src/main/java/com/supwisdom/dlpay/restaurant/bean/ManageFeeAmtBean.java
new file mode 100644
index 0000000..e4e6294
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/bean/ManageFeeAmtBean.java
@@ -0,0 +1,26 @@
+package com.supwisdom.dlpay.restaurant.bean;
+
+
+import java.math.BigInteger;
+
+public class ManageFeeAmtBean {
+    private Double managefeeamt;
+
+    private BigInteger managefeecnt;
+
+    public Double getManagefeeamt() {
+        return managefeeamt;
+    }
+
+    public void setManagefeeamt(Double managefeeamt) {
+        this.managefeeamt = managefeeamt;
+    }
+
+    public BigInteger getManagefeecnt() {
+        return managefeecnt;
+    }
+
+    public void setManagefeecnt(BigInteger managefeecnt) {
+        this.managefeecnt = managefeecnt;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/bean/MealBean.java b/src/main/java/com/supwisdom/dlpay/restaurant/bean/MealBean.java
new file mode 100644
index 0000000..9086da8
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/bean/MealBean.java
@@ -0,0 +1,34 @@
+package com.supwisdom.dlpay.restaurant.bean;
+
+/**
+ * Created by xiakaixiang on 16/9/26.
+ */
+public class MealBean {
+  private String mealtype; //餐次
+  private Integer totalcnt; //人次
+  private Double totalamt;  //金额
+
+  public String getMealtype() {
+    return mealtype;
+  }
+
+  public void setMealtype(String mealtype) {
+    this.mealtype = mealtype;
+  }
+
+  public Integer getTotalcnt() {
+    return totalcnt;
+  }
+
+  public void setTotalcnt(Integer totalcnt) {
+    this.totalcnt = totalcnt;
+  }
+
+  public Double getTotalamt() {
+    return totalamt;
+  }
+
+  public void setTotalamt(Double totalamt) {
+    this.totalamt = totalamt;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/bean/SalesAmtBean.java b/src/main/java/com/supwisdom/dlpay/restaurant/bean/SalesAmtBean.java
new file mode 100644
index 0000000..7f30ca0
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/bean/SalesAmtBean.java
@@ -0,0 +1,26 @@
+package com.supwisdom.dlpay.restaurant.bean;
+
+
+import java.math.BigInteger;
+
+public class SalesAmtBean{
+    private Double salesamt;
+
+    private BigInteger salescnt;
+
+    public Double getSalesamt() {
+        return salesamt;
+    }
+
+    public void setSalesamt(Double salesamt) {
+        this.salesamt = salesamt;
+    }
+
+    public BigInteger getSalescnt() {
+        return salescnt;
+    }
+
+    public void setSalescnt(BigInteger salescnt) {
+        this.salescnt = salescnt;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/bean/ShopMealShowBean.java b/src/main/java/com/supwisdom/dlpay/restaurant/bean/ShopMealShowBean.java
new file mode 100644
index 0000000..4e4a595
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/bean/ShopMealShowBean.java
@@ -0,0 +1,55 @@
+package com.supwisdom.dlpay.restaurant.bean;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by xiakaixiang on 16/9/26.
+ */
+public class ShopMealShowBean {
+  private String accno;
+  private String shopname;
+  private Integer rowcnt=0;
+  private List<ShopMealSqlBean>  termlist=new ArrayList<ShopMealSqlBean>(0);
+  private List<MealBean> suminfo=new ArrayList<MealBean>(0);
+
+  public List<MealBean> getSuminfo() {
+    return suminfo;
+  }
+
+  public void setSuminfo(List<MealBean> suminfo) {
+    this.suminfo = suminfo;
+  }
+
+  public Integer getRowcnt() {
+    return rowcnt;
+  }
+
+  public void setRowcnt(Integer rowcnt) {
+    this.rowcnt = rowcnt;
+  }
+
+  public String getAccno() {
+    return accno;
+  }
+
+  public void setAccno(String accno) {
+    this.accno = accno;
+  }
+
+  public String getShopname() {
+    return shopname;
+  }
+
+  public void setShopname(String shopname) {
+    this.shopname = shopname;
+  }
+
+  public List<ShopMealSqlBean> getTermlist() {
+    return termlist;
+  }
+
+  public void setTermlist(List<ShopMealSqlBean> termlist) {
+    this.termlist = termlist;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/bean/ShopMealSqlBean.java b/src/main/java/com/supwisdom/dlpay/restaurant/bean/ShopMealSqlBean.java
new file mode 100644
index 0000000..c3550e3
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/bean/ShopMealSqlBean.java
@@ -0,0 +1,47 @@
+package com.supwisdom.dlpay.restaurant.bean;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by xiakaixiang on 16/9/26.
+ */
+public class ShopMealSqlBean {
+  private String accno;
+  private String shopname;
+  private Integer termid;
+  private List<MealBean> meallist=new ArrayList<MealBean>(0);
+
+  public String getAccno() {
+    return accno;
+  }
+
+  public void setAccno(String accno) {
+    this.accno = accno;
+  }
+
+  public String getShopname() {
+    return shopname;
+  }
+
+  public void setShopname(String shopname) {
+    this.shopname = shopname;
+  }
+
+  public Integer getTermid() {
+    return termid;
+  }
+
+  public void setTermid(Integer termid) {
+    this.termid = termid;
+  }
+
+
+  public List<MealBean> getMeallist() {
+    return meallist;
+  }
+
+  public void setMeallist(List<MealBean> meallist) {
+    this.meallist = meallist;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/bean/TransDtlSearchBean.java b/src/main/java/com/supwisdom/dlpay/restaurant/bean/TransDtlSearchBean.java
index bd772c8..d77fdeb 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/bean/TransDtlSearchBean.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/bean/TransDtlSearchBean.java
@@ -4,7 +4,7 @@
 
 public class TransDtlSearchBean extends PageBean {
 
-    private String refno;
+    private String billno;
     private String custname;
     private String startdate;
     private String enddate;
@@ -21,12 +21,12 @@
         this.accdate = accdate;
     }
 
-    public String getRefno() {
-        return refno;
+    public String getBillno() {
+        return billno;
     }
 
-    public void setRefno(String refno) {
-        this.refno = refno;
+    public void setBillno(String billno) {
+        this.billno = billno;
     }
 
     public String getCustname() {
@@ -80,7 +80,7 @@
     @Override
     public String toString() {
         return "TransDtlSearchBean+++++{" +
-                "refno='" + refno + '\'' +
+                "billno='" + billno + '\'' +
                 ", custname='" + custname + '\'' +
                 ", startdate='" + startdate + '\'' +
                 ", enddate='" + enddate + '\'' +
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 c1a3027..5f303b3 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/controller/CustomerController.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/controller/CustomerController.java
@@ -110,9 +110,9 @@
     @PreAuthorize("hasPermission('/customer/download','')")
     @ResponseBody
     public JsonResult downloadfile(HttpServletRequest request, HttpServletResponse response) throws Exception{
-        String[] titles0 = {"姓名",	"市名卡号",	"市名卡银行卡号","人员类别号","手机（选填）"
+        String[] titles0 = {"姓名",	"市名卡号",	"市名卡银行卡号","人员类别号","物理卡号","手机（选填）"
         }; //表头
-        String[][] info0 = {{"张三",	"123456",	"3000000","1","12341234123"
+        String[][] info0 = {{"张三",	"123456",	"3000000","1","12345678","12341234123"
         }}; // 示例内容
         String fileName0 = "客户导入模板";// 保存数据
 
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 2d0aad2..0bcf9dc 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceController.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceController.java
@@ -2,12 +2,14 @@
 
 
 import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.framework.domain.TShopSettlement;
 import com.supwisdom.dlpay.restaurant.bean.DeviceSearchBean;
 import com.supwisdom.dlpay.restaurant.domain.TDevice;
 import com.supwisdom.dlpay.restaurant.service.DeviceService;
 import com.supwisdom.dlpay.framework.util.ExportExcel;
 import com.supwisdom.dlpay.framework.util.PageResult;
 import com.supwisdom.dlpay.framework.util.WebConstant;
+import com.supwisdom.dlpay.restaurant.service.ShopSettlementService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.stereotype.Controller;
@@ -18,6 +20,7 @@
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.util.List;
 
 @Controller
 @RequestMapping("/device")
@@ -25,6 +28,8 @@
 
     @Autowired
     private DeviceService deviceService;
+    @Autowired
+    private ShopSettlementService shopSettlementService;
 
     @RequestMapping("/index")
     public String indexView(ModelMap model) {
@@ -56,6 +61,8 @@
     @GetMapping("/loadadd")
     @PreAuthorize("hasPermission('/device/loadadd','')")
     public String loadadd(Model model) {
+        List<TShopSettlement> list=shopSettlementService.getAllShopSettlement();
+        model.addAttribute("shoplist", list);
         return "restaurant/device/form";
     }
 
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceManageController.java b/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceManageController.java
index 700aa53..1c39779 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceManageController.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceManageController.java
@@ -93,6 +93,4 @@
             return JsonResult.error("失败");
         }
     }
-
-
 }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/controller/TransDtlController.java b/src/main/java/com/supwisdom/dlpay/restaurant/controller/TransDtlController.java
index b62a81d..fefff9d 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/controller/TransDtlController.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/controller/TransDtlController.java
@@ -5,18 +5,12 @@
 import com.supwisdom.dlpay.api.bean.JsonResult;
 import com.supwisdom.dlpay.framework.domain.TShopSettlement;
 import com.supwisdom.dlpay.framework.util.*;
-import com.supwisdom.dlpay.restaurant.bean.AreaSearchBean;
 import com.supwisdom.dlpay.restaurant.bean.TransDtlSearchBean;
-import com.supwisdom.dlpay.restaurant.domain.TArea;
 import com.supwisdom.dlpay.restaurant.domain.TTransDtl;
-import com.supwisdom.dlpay.restaurant.service.AreaService;
 import com.supwisdom.dlpay.restaurant.service.ShopSettlementService;
 import com.supwisdom.dlpay.restaurant.service.TransDtlService;
-import org.jetbrains.annotations.NotNull;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
 import org.springframework.ui.ModelMap;
 import org.springframework.web.bind.annotation.*;
 
@@ -62,13 +56,13 @@
                                              @RequestParam(value = "shopid", required = false) Integer shopid,
                                              @RequestParam(value = "startdate", required = false) String startdate,
                                              @RequestParam(value = "enddate", required = false) String enddate,
-                                             @RequestParam(value = "refno", required = false) String refno,
+                                             @RequestParam(value = "billno", required = false) String billno,
                                              @RequestParam(value = "status", required = false) Integer status,
                                              @RequestParam(value = "termid", required = false) Integer termid) {
         try {
             if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
             if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
-            TransDtlSearchBean bean = getTransDtlSearchBean(custname, shopid, startdate, enddate, refno, status, termid);
+            TransDtlSearchBean bean = getTransDtlSearchBean(custname, shopid, startdate, enddate, billno, status, termid);
             bean.setPageNo(pageNo);
             bean.setPageSize(pageSize);
 
@@ -85,21 +79,21 @@
                                    @RequestParam(value = "shopid", required = false) Integer shopid,
                                    @RequestParam(value = "startdate", required = false) String startdate,
                                    @RequestParam(value = "enddate", required = false) String enddate,
-                                   @RequestParam(value = "refno", required = false) String refno,
+                                   @RequestParam(value = "billno", required = false) String billno,
                                    @RequestParam(value = "status", required = false) Integer status,
                                    @RequestParam(value = "termid", required = false) Integer termid,
                                    HttpServletRequest request, HttpServletResponse response) {
 
-        TransDtlSearchBean bean = getTransDtlSearchBean(custname, shopid, startdate, enddate, refno, status, termid);
+        TransDtlSearchBean bean = getTransDtlSearchBean(custname, shopid, startdate, enddate, billno, status, termid);
         System.out.println(bean.toString());
         return transDtlService.export(bean, request, response);
     }
 
-    private TransDtlSearchBean getTransDtlSearchBean( String custname,  Integer shopid, String startdate, String enddate, String refno,Integer status, Integer termid) {
+    private TransDtlSearchBean getTransDtlSearchBean( String custname,  Integer shopid, String startdate, String enddate, String billno,Integer status, Integer termid) {
         TransDtlSearchBean bean = new TransDtlSearchBean();
         bean.setCustname(custname);
         bean.setEnddate(enddate);
-        bean.setRefno(refno);
+        bean.setBillno(billno);
         bean.setStatus(status);
         bean.setShopid(shopid);
         if (StringUtil.isEmpty(startdate) || StringUtil.isEmpty(enddate)) {
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/controller/TransDtlFormController.java b/src/main/java/com/supwisdom/dlpay/restaurant/controller/TransDtlFormController.java
index 09de88a..98e41e4 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/controller/TransDtlFormController.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/controller/TransDtlFormController.java
@@ -3,7 +3,11 @@
 
 import com.supwisdom.dlpay.framework.util.DateUtil;
 import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.restaurant.bean.MealBean;
+import com.supwisdom.dlpay.restaurant.bean.ShopMealShowBean;
+import com.supwisdom.dlpay.restaurant.bean.ShopMealSqlBean;
 import com.supwisdom.dlpay.restaurant.domain.TArea;
+import com.supwisdom.dlpay.restaurant.domain.TMealtype;
 import com.supwisdom.dlpay.restaurant.domain.TTransDtlFormResult;
 import com.supwisdom.dlpay.restaurant.service.TransDtlFormService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -12,6 +16,7 @@
 import org.springframework.ui.ModelMap;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.ArrayList;
 import java.util.List;
 
 
@@ -48,4 +53,78 @@
         }
     }
 
+
+
+
+
+
+    private List<ShopMealShowBean> shopMealTransdata(List<ShopMealSqlBean> list) {
+        List<ShopMealShowBean> result = new ArrayList<ShopMealShowBean>(0);
+        boolean findTemp;
+        for (ShopMealSqlBean bean : list) {
+            findTemp = false;
+            for (ShopMealShowBean trade : result) {
+                if (bean.getAccno().equals(trade.getAccno())) {
+                    findTemp = true;
+                    trade.getTermlist().add(bean);
+                    trade.setRowcnt(trade.getRowcnt()+1);
+                    break;
+                }
+            }
+            if (!findTemp) {
+                ShopMealShowBean temp = new ShopMealShowBean();
+                temp.setAccno(bean.getAccno());
+                temp.setShopname(bean.getShopname());
+                temp.setRowcnt(1);
+                temp.getTermlist().add(bean);
+                result.add(temp);
+            }
+        }
+
+        for(ShopMealShowBean shop:result){
+            List<TMealtype> meallist=transDtlFormService.getAllMealType();
+            for(TMealtype meal:meallist){
+                int cnt=0;
+                double amt=0;
+                for(ShopMealSqlBean sq:shop.getTermlist()){
+                    for(MealBean ml:sq.getMeallist()){
+                        if(ml.getMealtype().equals(meal.getMealtype())){
+                            cnt+=ml.getTotalcnt();
+                            amt+=ml.getTotalamt();
+                        }
+                    }
+                }
+                MealBean nwmb=new MealBean();
+                nwmb.setMealtype(meal.getMealtype());
+                nwmb.setTotalcnt(cnt);
+                nwmb.setTotalamt(amt);
+                shop.getSuminfo().add(nwmb);
+            }
+        }
+        return result;
+    }
+
+    private List<MealBean> getTotalSumInfo(List<ShopMealShowBean> list){
+        List<TMealtype> meallist=transDtlFormService.getAllMealType();
+        List<MealBean> result=new ArrayList<MealBean>(0);
+        for(TMealtype meal:meallist){
+            int cnt=0;
+            double amt=0;
+            for(ShopMealShowBean ssb:list){
+                for(MealBean mb:ssb.getSuminfo()){
+                    if(mb.getMealtype().equals(meal.getMealtype())){
+                        cnt+=mb.getTotalcnt();
+                        amt+=mb.getTotalamt();
+                    }
+                }
+            }
+            MealBean nwmb=new MealBean();
+            nwmb.setMealtype(meal.getMealtype());
+            nwmb.setTotalcnt(cnt);
+            nwmb.setTotalamt(amt);
+            result.add(nwmb);
+        }
+        return result;
+    }
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/controller/TransDtlRevertController.java b/src/main/java/com/supwisdom/dlpay/restaurant/controller/TransDtlRevertController.java
index 7e3590b..bace525 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/controller/TransDtlRevertController.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/controller/TransDtlRevertController.java
@@ -69,7 +69,7 @@
 
             }
             bean.setCustname(custname);
-            bean.setRefno(refno);
+            bean.setBillno(refno);
             bean.setPageNo(pageNo);
             bean.setPageSize(pageSize);
 
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/dao/CardDao.java b/src/main/java/com/supwisdom/dlpay/restaurant/dao/CardDao.java
index b449305..dc55b15 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/dao/CardDao.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/dao/CardDao.java
@@ -2,6 +2,7 @@
 
 
 import com.supwisdom.dlpay.restaurant.domain.TCard;
+import com.supwisdom.dlpay.restaurant.domain.TCardPk;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaRepository;
@@ -10,7 +11,7 @@
 import org.springframework.stereotype.Repository;
 
 @Repository
-public interface CardDao extends JpaRepository<TCard, Integer> {
+public interface CardDao extends JpaRepository<TCard, TCardPk> {
 
     @Query(value = "update TB_CARD set STATUS=:status where CARDNO=:cardno", nativeQuery = true)
     void updateStatus(@Param("cardno") Integer cardno,@Param("status") Integer status);
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/dao/CardverDao.java b/src/main/java/com/supwisdom/dlpay/restaurant/dao/CardverDao.java
index d09cd64..8514195 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/dao/CardverDao.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/dao/CardverDao.java
@@ -3,10 +3,19 @@
 
 import com.supwisdom.dlpay.restaurant.domain.TCardver;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 @Repository
 public interface CardverDao extends JpaRepository<TCardver, String> {
 
+    @Query(value = "select max(cardverno) from Tb_Cardver ", nativeQuery=true)
+    String getMaxCardverno();
+
+
+    @Query(value = "from TCardver where cardverno>?1 ")
+    List<TCardver> findAllWhitelist(String cardverno);
 
 }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/dao/CustomerDao.java b/src/main/java/com/supwisdom/dlpay/restaurant/dao/CustomerDao.java
index 249434f..f8d8c64 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/dao/CustomerDao.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/dao/CustomerDao.java
@@ -21,4 +21,6 @@
     Integer countByBankcardno(String bankcardno);
 
     List<TCustomer> findAllByCardno(String cardno);
+
+    List<TCustomer> findAllByCardnoAndCardphyid(String cardno,String cardphyid);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/dao/DeviceDao.java b/src/main/java/com/supwisdom/dlpay/restaurant/dao/DeviceDao.java
index d50b6fb..aa896c1 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/dao/DeviceDao.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/dao/DeviceDao.java
@@ -21,6 +21,8 @@
 
     List<TDevice> findAllByDevgroupid(Integer devgroupid);
 
+    List<TDevice> findAllByDevphyid(String devphyid);
+
 
     List<TDevice> findAllByDevgroupidIsNullAndDevicenameContainingOrderById(String name);
 
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/dao/MealTypeDao.java b/src/main/java/com/supwisdom/dlpay/restaurant/dao/MealTypeDao.java
new file mode 100644
index 0000000..18e1e2e
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/dao/MealTypeDao.java
@@ -0,0 +1,14 @@
+package com.supwisdom.dlpay.restaurant.dao;
+
+
+import com.supwisdom.dlpay.restaurant.domain.TMealtype;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface MealTypeDao extends JpaRepository<TMealtype, String> {
+    List<TMealtype> findAllByOrderByEndtime();
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/dao/OfflineTransDtlDao.java b/src/main/java/com/supwisdom/dlpay/restaurant/dao/OfflineTransDtlDao.java
new file mode 100644
index 0000000..7e8d538
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/dao/OfflineTransDtlDao.java
@@ -0,0 +1,27 @@
+package com.supwisdom.dlpay.restaurant.dao;
+
+
+import com.supwisdom.dlpay.restaurant.domain.TOfflineTransDtl;
+import com.supwisdom.dlpay.restaurant.domain.TTransDtl;
+import com.supwisdom.dlpay.restaurant.domain.TTransDtlFormResult;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface OfflineTransDtlDao extends JpaRepository<TOfflineTransDtl, String>, JpaSpecificationExecutor<TTransDtl> {
+
+
+    TOfflineTransDtl getByBillno(String billno);
+
+
+    @Query(value = "select max(termsqlno) from tb_offlinetransdtl where termid=?1 and accdate=?2 ", nativeQuery=true)
+    Integer getMaxSqlnoToday(Integer deviceid, String accdate);
+
+    List<TOfflineTransDtl> findByTermsqlnoAndTermidAndAccdate(Integer termsqlno,Integer termid,String accdate);
+
+    List<TOfflineTransDtl> findAllByAccdateAndStatusIsNull(String accdate);
+}
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 f518615..61133b3 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/dao/TransDtlDao.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/dao/TransDtlDao.java
@@ -1,6 +1,8 @@
 package com.supwisdom.dlpay.restaurant.dao;
 
 
+import com.supwisdom.dlpay.restaurant.bean.ManageFeeAmtBean;
+import com.supwisdom.dlpay.restaurant.bean.SalesAmtBean;
 import com.supwisdom.dlpay.restaurant.domain.TTransDtl;
 import com.supwisdom.dlpay.restaurant.domain.TTransDtlFormResult;
 import org.springframework.data.domain.Page;
@@ -32,5 +34,12 @@
             "ORDER BY d.devicename",nativeQuery = true)
     List<TTransDtlFormResult> getFormResult(Integer devgroupid, String startdate, String enddate);
 
+    TTransDtl getByBillno(String billno);
+
+
+    @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);
 
 }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCard.java b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCard.java
index cf2df28..3ee3479 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCard.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCard.java
@@ -4,38 +4,30 @@
 import javax.persistence.*;
 
 @Entity
+@IdClass(TCardPk.class)
 @Table(name = "TB_CARD")
-@SequenceGenerator(name="SEQ_CARD",sequenceName="SEQ_CARD",allocationSize=1,initialValue = 1)
 public class TCard {
-    private Integer cardno;
-    private Integer custid;
+    private String cardno;
+    private String custid;
     private String cardphyid;
-    private Integer status;
+    private String  status;
     private Integer lossflag;
     private String opendate;
     private String closedate;
     private String cardverno;
 
+
     @Id
-    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_CARD")
-    @Column(name = "cardno", unique = true, nullable = false, length = 9)
-    public Integer getCardno() {
+    @Column(name = "cardno", nullable = false, length =32)
+    public String getCardno() {
         return cardno;
     }
 
-    public void setCardno(Integer cardno) {
+    public void setCardno(String cardno) {
         this.cardno = cardno;
     }
-
-    @Column(name = "custid" ,length = 9)
-    public Integer getCustid() {
-        return custid;
-    }
-
-    public void setCustid(Integer custid) {
-        this.custid = custid;
-    }
-    @Column(name = "cardphyid" ,length = 20)
+    @Id
+    @Column(name = "cardphyid" ,nullable = false,length = 8)
     public String getCardphyid() {
         return cardphyid;
     }
@@ -44,12 +36,21 @@
         this.cardphyid = cardphyid;
     }
 
-    @Column(name = "status" ,length = 1)
-    public Integer getStatus() {
+    @Column(name = "custid" ,length = 32)
+    public String getCustid() {
+        return custid;
+    }
+
+    public void setCustid(String custid) {
+        this.custid = custid;
+    }
+
+    @Column(name = "status" ,length = 10)
+    public String getStatus() {
         return status;
     }
 
-    public void setStatus(Integer status) {
+    public void setStatus(String status) {
         this.status = status;
     }
     @Column(name = "lossflag" ,length = 1)
@@ -78,7 +79,7 @@
         this.closedate = closedate;
     }
 
-    @Column(name = "cardverno" ,length = 16)
+    @Column(name = "cardverno" ,length = 20)
     public String getCardverno() {
         return cardverno;
     }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCardPk.java b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCardPk.java
new file mode 100644
index 0000000..c9e8c1d
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCardPk.java
@@ -0,0 +1,55 @@
+package com.supwisdom.dlpay.restaurant.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Id;
+import java.io.Serializable;
+
+public class TCardPk implements Serializable {
+  @Id
+  @Column(name = "cardphyid", nullable = false, precision = 8)
+  private String cardphyid;
+
+  @Id
+  @Column(name = "CARDNO", nullable = false, length = 32)
+  private String cardno;
+
+  public TCardPk() {
+  }
+
+  public TCardPk(String cardphyid, String cardno) {
+    this.cardphyid = cardphyid;
+    this.cardno = cardno;
+  }
+
+
+  public String getCardphyid() {
+    return cardphyid;
+  }
+
+  public void setCardphyid(String cardphyid) {
+    this.cardphyid = cardphyid;
+  }
+
+  public String getCardno() {
+    return cardno;
+  }
+
+  public void setCardno(String cardno) {
+    this.cardno = cardno;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o == null || getClass() != o.getClass()) return false;
+    TDevparaPk tDevparaPk = (TDevparaPk) o;
+    if (cardphyid != null ? !cardphyid.equals(tDevparaPk.getGroupid()) : cardphyid != null)
+      return false;
+    if (cardno != null ? !cardno.equals(tDevparaPk.getParaname()) : cardno != null)
+      return false;
+
+    return true;
+  }
+
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCardver.java b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCardver.java
index 9320ae7..361830a 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCardver.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCardver.java
@@ -8,16 +8,16 @@
 public class TCardver {
     private String cardverno;
     private String accdate;
-    private Integer cardno;
+    private String cardno;
     private String cardphyid;
-    private Integer custid;
-    private Integer optype;
+    private String custid;
+    private String optype;
     private Integer adderflag;
-    private Integer status;
+    private String status;
     private String createtime;
 
     @Id
-    @Column(name = "cardverno", unique = true, nullable = false, length = 16)
+    @Column(name = "cardverno", unique = true, nullable = false, length = 20)
     public String getCardverno() {
         return cardverno;
     }
@@ -33,15 +33,15 @@
     public void setAccdate(String accdate) {
         this.accdate = accdate;
     }
-    @Column(name = "cardno", length =9)
-    public Integer getCardno() {
+    @Column(name = "cardno", length =32)
+    public String getCardno() {
         return cardno;
     }
 
-    public void setCardno(Integer cardno) {
+    public void setCardno(String cardno) {
         this.cardno = cardno;
     }
-    @Column(name = "cardphyid", length = 20)
+    @Column(name = "cardphyid", length = 8)
     public String getCardphyid() {
         return cardphyid;
     }
@@ -49,20 +49,20 @@
     public void setCardphyid(String cardphyid) {
         this.cardphyid = cardphyid;
     }
-    @Column(name = "custid", length = 9)
-    public Integer getCustid() {
+    @Column(name = "custid", length = 32)
+    public String getCustid() {
         return custid;
     }
 
-    public void setCustid(Integer custid) {
+    public void setCustid(String custid) {
         this.custid = custid;
     }
-    @Column(name = "optype", length = 2)
-    public Integer getOptype() {
+    @Column(name = "optype", length = 10)
+    public String getOptype() {
         return optype;
     }
 
-    public void setOptype(Integer optype) {
+    public void setOptype(String optype) {
         this.optype = optype;
     }
     @Column(name = "adderflag", length = 1)
@@ -74,11 +74,11 @@
         this.adderflag = adderflag;
     }
     @Column(name = "status", length = 1)
-    public Integer getStatus() {
+    public String getStatus() {
         return status;
     }
 
-    public void setStatus(Integer status) {
+    public void setStatus(String status) {
         this.status = status;
     }
     @Column(name = "createtime", length = 14)
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 fc654f3..af84875 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCustomer.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCustomer.java
@@ -13,6 +13,7 @@
     private String custname;
     private String operid;
     private String cardno;
+    private String cardphyid;
     private String idno;
     private String idtype;
     private String bankcardno;
@@ -51,7 +52,7 @@
         this.custtype = custtype;
     }
 
-    @Column(name = "CARDNO", length = 16)
+    @Column(name = "CARDNO", length = 32)
     public String getCardno() {
         return cardno;
     }
@@ -128,4 +129,22 @@
     public void setLastsaved(String lastsaved) {
         this.lastsaved = lastsaved;
     }
+
+    @Column(name = "status", length = 1)
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    @Column(name = "cardphyid", length = 8)
+    public String getCardphyid() {
+        return cardphyid;
+    }
+
+    public void setCardphyid(String cardphyid) {
+        this.cardphyid = cardphyid;
+    }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TDevice.java b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TDevice.java
index 86810aa..007da23 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TDevice.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TDevice.java
@@ -15,6 +15,13 @@
     private String operid;
     private Integer devgroupid;
     private String lastsaved;
+    private String cardverno;
+    private Integer beatstatus;
+    private Integer runstatus;
+    private String lastlogintime;
+    private String lastbeattime;
+
+
 
     @Id
     @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_DEVICE")
@@ -23,8 +30,8 @@
         return id;
     }
 
-    public void setId(Integer areacode) {
-        this.id = areacode;
+    public void setId(Integer id) {
+        this.id = id;
     }
 
 
@@ -54,6 +61,16 @@
     public void setTermid(String termid) {
         this.termid = termid;
     }*/
+
+    @Column(name = "runstatus", length = 1)
+    public Integer getRunstatus() {
+        return runstatus;
+    }
+
+    public void setRunstatus(Integer runstatus) {
+        this.runstatus = runstatus;
+    }
+
     @Column(name = "shopid", length = 10)
     public Integer getShopid() {
         return shopid;
@@ -104,18 +121,43 @@
         this.lastsaved = lastsaved;
     }
 
-    @Override
-    public String toString() {
-        return "TDevice{" +
-                "id=" + id +
-                ", devicename='" + devicename + '\'' +
-                ", devphyid='" + devphyid + '\'' +
-                ", shopid=" + shopid +
-                ", factoryid='" + factoryid + '\'' +
-                ", state=" + state +
-                ", operid='" + operid + '\'' +
-                ", devgroupid=" + devgroupid +
-                ", lastsaved='" + lastsaved + '\'' +
-                '}';
+
+    @Column(name = "cardverno", length = 20)
+    public String getCardverno() {
+        return cardverno;
+    }
+
+    public void setCardverno(String cardverno) {
+        this.cardverno = cardverno;
+    }
+
+    @Column(name = "beatstatus", length = 1)
+    public Integer getBeatstatus() {
+        return beatstatus;
+    }
+
+
+    public void setBeatstatus(Integer beatstatus) {
+        this.beatstatus = beatstatus;
+    }
+
+
+    @Column(name = "lastlogintime", length = 14)
+    public String getLastlogintime() {
+        return lastlogintime;
+    }
+
+    public void setLastlogintime(String lastlogintime) {
+
+        this.lastlogintime = lastlogintime;
+    }
+
+    @Column(name = "lastbeattime", length = 14)
+    public String getLastbeattime() {
+        return lastbeattime;
+    }
+
+    public void setLastbeattime(String lastbeattime) {
+        this.lastbeattime = lastbeattime;
     }
 }
\ No newline at end of file
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TOfflineTransDtl.java b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TOfflineTransDtl.java
new file mode 100644
index 0000000..88cd4eb
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TOfflineTransDtl.java
@@ -0,0 +1,220 @@
+package com.supwisdom.dlpay.restaurant.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "TB_OFFLINETRANSDTL")
+public class TOfflineTransDtl {
+
+    private String billno;
+    private String custname;
+    private String custid;
+    private String cardno;
+    private Double amount;
+    private String transdate;
+    private String transtime;
+    private String accdate;
+    private String acctime;
+    private Integer termid;
+    private String status;
+    private Integer revflag;
+    private String transtype;
+    private Integer shopid;
+    private String attr1;
+    private String revbillno;
+    private Integer custtype;
+    private Double managefee;
+    private String mealtype;
+    private Integer termsqlno;
+
+
+
+    @Id
+    @Column(name = "billno", unique = true, nullable = false, length = 20)
+    public String getBillno() {
+        return billno;
+    }
+
+    public void setBillno(String billno) {
+        this.billno = billno;
+    }
+
+    @Column(name = "custname",  length = 30)
+    public String getCustname() {
+        return custname;
+    }
+
+    public void setCustname(String custname) {
+        this.custname = custname;
+    }
+
+    @Column(name = "custid",  length = 32)
+    public String getCustid() {
+        return custid;
+    }
+
+    public void setCustid(String custid) {
+        this.custid = custid;
+    }
+
+    @Column(name = "cardno",  length = 9)
+    public String getCardno() {
+        return cardno;
+    }
+
+    public void setCardno(String cardno) {
+        this.cardno = cardno;
+    }
+
+    @Column(name = "amount",   precision = 15)
+    public Double getAmount() {
+        return amount;
+    }
+
+    public void setAmount(Double amount) {
+        this.amount = amount;
+    }
+
+    @Column(name = "transdate",  length = 8)
+    public String getTransdate() {
+        return transdate;
+    }
+
+    public void setTransdate(String transdate) {
+        this.transdate = transdate;
+    }
+
+    @Column(name = "transtime",  length = 6)
+    public String getTranstime() {
+        return transtime;
+    }
+
+    public void setTranstime(String transtime) {
+        this.transtime = transtime;
+    }
+
+    @Column(name = "accdate",  length = 8)
+    public String getAccdate() {
+        return accdate;
+    }
+
+    public void setAccdate(String accdate) {
+        this.accdate = accdate;
+    }
+
+    @Column(name = "acctime",  length = 6)
+    public String getAcctime() {
+        return acctime;
+    }
+
+    public void setAcctime(String acctime) {
+        this.acctime = acctime;
+    }
+
+    @Column(name = "termid",  length = 9)
+    public Integer getTermid() {
+        return termid;
+    }
+
+    public void setTermid(Integer termid) {
+        this.termid = termid;
+    }
+
+    @Column(name = "status",  length = 10)
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    @Column(name = "revflag",  length = 1)
+    public Integer getRevflag() {
+        return revflag;
+    }
+
+    public void setRevflag(Integer revflag) {
+        this.revflag = revflag;
+    }
+
+    @Column(name = "transtype",  length = 10)
+    public String getTranstype() {
+        return transtype;
+    }
+
+    public void setTranstype(String transtype) {
+        this.transtype = transtype;
+    }
+
+
+    @Column(name = "shopid",  length = 9)
+    public Integer getShopid() {
+        return shopid;
+    }
+
+    public void setShopid(Integer shopid) {
+        this.shopid = shopid;
+    }
+
+
+    @Column(name = "attr1",  length = 200)
+    public String getAttr1() {
+        return attr1;
+    }
+
+    public void setAttr1(String attr1) {
+        this.attr1 = attr1;
+    }
+
+    @Column(name = "revbillno",  length = 20)
+    public String getRevbillno() {
+        return revbillno;
+    }
+
+    public void setRevbillno(String revbillno) {
+        this.revbillno = revbillno;
+    }
+
+
+
+    @Column(name="custtype",length = 1)
+    public Integer getCusttype() {
+        return custtype;
+    }
+
+    public void setCusttype(Integer custtype) {
+        this.custtype = custtype;
+    }
+
+    @Column(name="mealtype",length = 10)
+    public String getMealtype() {
+        return mealtype;
+    }
+
+    public void setMealtype(String mealtype) {
+        this.mealtype = mealtype;
+    }
+
+    @Column(name="termsqlno",length = 9)
+    public Integer getTermsqlno() {
+        return termsqlno;
+    }
+
+    public void setTermsqlno(Integer termsqlno) {
+        this.termsqlno = termsqlno;
+    }
+
+
+    @Column(name = "managefee",   precision = 15)
+    public Double getManagefee() {
+        return managefee;
+    }
+
+    public void setManagefee(Double managefee) {
+        this.managefee = managefee;
+    }
+}
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 edd872f..0f3c4c2 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TTransDtl.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TTransDtl.java
@@ -6,35 +6,38 @@
 @Table(name = "TB_TRANSDTL")
 public class TTransDtl {
 
-    private String refno;
+    private String billno;
     private String custname;
-    private Integer cardno;
+    private String custid;
+    private String cardno;
     private Double amount;
     private String transdate;
     private String transtime;
     private String accdate;
     private String acctime;
     private Integer termid;
-    private Integer status;
+    private String status;
     private Integer revflag;
     private String transtype;
     private Integer shopid;
     private String attr1;
-    private String attr2;
+    private String revbillno;
     private String transmode;
     private Integer custtype;
-    private Integer transperiod;
+    private Double managefee;
+    private String mealtype;
+    private Integer termsqlno;
 
 
 
     @Id
-    @Column(name = "refno", unique = true, nullable = false, length = 20)
-    public String getRefno() {
-        return refno;
+    @Column(name = "billno", unique = true, nullable = false, length = 20)
+    public String getBillno() {
+        return billno;
     }
 
-    public void setRefno(String refno) {
-        this.refno = refno;
+    public void setBillno(String billno) {
+        this.billno = billno;
     }
 
     @Column(name = "custname",  length = 30)
@@ -46,12 +49,21 @@
         this.custname = custname;
     }
 
+    @Column(name = "custid",  length = 32)
+    public String getCustid() {
+        return custid;
+    }
+
+    public void setCustid(String custid) {
+        this.custid = custid;
+    }
+
     @Column(name = "cardno",  length = 9)
-    public Integer getCardno() {
+    public String getCardno() {
         return cardno;
     }
 
-    public void setCardno(Integer cardno) {
+    public void setCardno(String cardno) {
         this.cardno = cardno;
     }
 
@@ -109,12 +121,12 @@
         this.termid = termid;
     }
 
-    @Column(name = "status",  length = 1)
-    public Integer getStatus() {
+    @Column(name = "status",  length = 10)
+    public String getStatus() {
         return status;
     }
 
-    public void setStatus(Integer status) {
+    public void setStatus(String status) {
         this.status = status;
     }
 
@@ -127,7 +139,7 @@
         this.revflag = revflag;
     }
 
-    @Column(name = "transtype",  length = 5)
+    @Column(name = "transtype",  length = 10)
     public String getTranstype() {
         return transtype;
     }
@@ -156,13 +168,13 @@
         this.attr1 = attr1;
     }
 
-    @Column(name = "attr2",  length = 200)
-    public String getAttr2() {
-        return attr2;
+    @Column(name = "revbillno",  length = 20)
+    public String getRevbillno() {
+        return revbillno;
     }
 
-    public void setAttr2(String attr2) {
-        this.attr2 = attr2;
+    public void setRevbillno(String revbillno) {
+        this.revbillno = revbillno;
     }
 
 
@@ -184,12 +196,31 @@
         this.custtype = custtype;
     }
 
-    @Column(name="transperiod",length = 1)
-    public Integer getTransperiod() {
-        return transperiod;
+    @Column(name="mealtype",length = 10)
+    public String getMealtype() {
+        return mealtype;
     }
 
-    public void setTransperiod(Integer transperiod) {
-        this.transperiod = transperiod;
+    public void setMealtype(String mealtype) {
+        this.mealtype = mealtype;
+    }
+
+    @Column(name="termsqlno",length = 9)
+    public Integer getTermsqlno() {
+        return termsqlno;
+    }
+
+    public void setTermsqlno(Integer termsqlno) {
+        this.termsqlno = termsqlno;
+    }
+
+
+    @Column(name = "managefee",   precision = 15)
+    public Double getManagefee() {
+        return managefee;
+    }
+
+    public void setManagefee(Double managefee) {
+        this.managefee = managefee;
     }
 }
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 364e512..742f0b4 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/CardService.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/CardService.java
@@ -7,6 +7,8 @@
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.List;
+
 public interface CardService {
 
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
@@ -18,4 +20,20 @@
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     JsonResult saveCardver(TCardver card);
 
+
+/*    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    TCard getCardByCardno(String cardno);*/
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    TCard getCardByCardnoAndCardphyid(String cardno,String Cardphyid);
+
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    String getMaxCarcver();
+
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    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 2ebc83d..ac82e55 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/CustomerService.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/CustomerService.java
@@ -18,6 +18,9 @@
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
     PageResult<TCustomer> getCustomerByCustname(CustomerSearchBean param);
 
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+    TCustomer getCustomerByCustid(String custid);
+
 
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     JsonResult saveCustomer(TCustomer customer);
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/DeviceService.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/DeviceService.java
index b3eb60f..302f677 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/DeviceService.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/DeviceService.java
@@ -19,6 +19,9 @@
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
     PageResult<TDevice> getDeviceByDevicename(String devicename);
 
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+    TDevice getDeviceByDevphyid(String devphyid);
+
 
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
     PageResult<TDevice> getDeviceByParam(DeviceSearchBean param);
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/OfflineTransDtlService.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/OfflineTransDtlService.java
new file mode 100644
index 0000000..e151699
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/OfflineTransDtlService.java
@@ -0,0 +1,36 @@
+package com.supwisdom.dlpay.restaurant.service;
+
+
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.restaurant.domain.TOfflineTransDtl;
+
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+
+public interface OfflineTransDtlService {
+
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    TOfflineTransDtl saveTransdtl(TOfflineTransDtl dtl);
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    TOfflineTransDtl getTransDtlByBillno(String billno);
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    TOfflineTransDtl getOfflineTransDtlByTermsqlnoAndTermid(Integer termsqlno,Integer termid,String termdate);
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+    Integer getMaxSeqnoToday(Integer deviceid, String accdate);
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    JsonResult revertOfflineTransdtl(TOfflineTransDtl dtl);
+
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+    List<TOfflineTransDtl> getUncheckOfflineTransdtl(String accdate);
+
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/ShopSettlementService.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/ShopSettlementService.java
index cc16a3a..046c8b8 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/ShopSettlementService.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/ShopSettlementService.java
@@ -12,4 +12,8 @@
     List<TShopSettlement> getAllShopSettlement();
 
 
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+    List<TShopSettlement> getShopByShopid(Integer shopid);
+
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/TransDtlFormService.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/TransDtlFormService.java
index 7decd6c..7c33261 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/TransDtlFormService.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/TransDtlFormService.java
@@ -2,6 +2,7 @@
 
 import com.supwisdom.dlpay.framework.util.PageResult;
 import com.supwisdom.dlpay.restaurant.domain.TArea;
+import com.supwisdom.dlpay.restaurant.domain.TMealtype;
 import com.supwisdom.dlpay.restaurant.domain.TTransDtlFormResult;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
@@ -14,4 +15,6 @@
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
     List<TTransDtlFormResult> getTransDtlFormResult(Integer devgroupid, String startdate, String enddate);
 
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+    List<TMealtype> getAllMealType();
 }
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 b1b430a..fbbbbc5 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/TransDtlService.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/TransDtlService.java
@@ -2,6 +2,8 @@
 
 import com.supwisdom.dlpay.api.bean.JsonResult;
 import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.restaurant.bean.ManageFeeAmtBean;
+import com.supwisdom.dlpay.restaurant.bean.SalesAmtBean;
 import com.supwisdom.dlpay.restaurant.bean.TransDtlSearchBean;
 import com.supwisdom.dlpay.restaurant.domain.TTransDtl;
 import org.springframework.transaction.annotation.Propagation;
@@ -9,6 +11,7 @@
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.util.List;
 
 
 public interface TransDtlService {
@@ -18,8 +21,26 @@
 
     JsonResult export(TransDtlSearchBean bean, HttpServletRequest request, HttpServletResponse response);
 
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    TTransDtl saveTransdtl(TTransDtl dtl);
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    TTransDtl getTransDtlByBillno(String billno);
 
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     JsonResult revertTransdtl(TTransDtl dtl);
 
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+    Integer getMaxSeqnoToday(Integer deviceid,String accdate);
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+    ManageFeeAmtBean getManageFeeToday(String transdate, Integer termid);
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+    SalesAmtBean getSalesToday(String transdate, Integer termid);
+
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+    List<TTransDtl> getSubmittingTransdtl();
 }
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 58b953a..baa5428 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
@@ -4,11 +4,16 @@
 import com.supwisdom.dlpay.restaurant.dao.CardDao;
 import com.supwisdom.dlpay.restaurant.dao.CardverDao;
 import com.supwisdom.dlpay.restaurant.domain.TCard;
+import com.supwisdom.dlpay.restaurant.domain.TCardPk;
 import com.supwisdom.dlpay.restaurant.domain.TCardver;
 import com.supwisdom.dlpay.restaurant.service.CardService;
+import com.supwisdom.dlpay.restaurant.util.RestaurantConstant;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+import java.util.Optional;
+
 @Service
 public class CardServiceImpl implements CardService {
     @Autowired
@@ -33,4 +38,24 @@
         cardverDao.save(card);
         return JsonResult.ok();
     }
+
+    @Override
+    public TCard getCardByCardnoAndCardphyid(String cardno,String cardphyid) {
+        TCardPk pk=new TCardPk(cardphyid,cardno);
+        Optional<TCard> card=cardDao.findById(pk);
+        if(!card.isPresent()){
+            return null;
+        }
+        return card.get();
+    }
+
+    @Override
+    public String getMaxCarcver() {
+        return cardverDao.getMaxCardverno();
+    }
+
+    @Override
+    public List<TCardver> getCardlistByTCardVer(String cardverno) {
+        return cardverDao.findAllWhitelist(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 b48b425..9184d9c 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
@@ -8,6 +8,7 @@
 import com.supwisdom.dlpay.restaurant.dao.CardverDao;
 import com.supwisdom.dlpay.restaurant.dao.CustomerDao;
 import com.supwisdom.dlpay.restaurant.domain.TCard;
+import com.supwisdom.dlpay.restaurant.domain.TCardPk;
 import com.supwisdom.dlpay.restaurant.domain.TCardver;
 import com.supwisdom.dlpay.restaurant.domain.TCustomer;
 import com.supwisdom.dlpay.restaurant.service.CustomerService;
@@ -33,12 +34,11 @@
 
     @Autowired
     private SystemUtilService systemUtilService;
-/*
     @Autowired
     private CardDao cardDao;
 
     @Autowired
-    private CardverDao cardverDao;*/
+    private CardverDao cardverDao;
 
     @Override
     public PageResult<TCustomer> getCustomerByCustname(CustomerSearchBean param) {
@@ -49,61 +49,74 @@
         }
         return new PageResult<>(customerDao.findAll(pageable));
     }
+
+    @Override
+    public TCustomer getCustomerByCustid(String custid) {
+        Optional<TCustomer> cust=customerDao.findById(custid);
+        if(cust.isPresent()){
+            return cust.get();
+        }
+        return null;
+    }
+
     @Override
     public JsonResult saveCustomer(TCustomer customer) {
-        if(StringUtil.isEmpty(customer.getCustid())){
-            List<TCustomer> cus=customerDao.findAllByCardno(customer.getCardno());
-            if(cus.size()!=0){
-                return JsonResult.error("用户"+cus.get(0).getCustname()+"已拥有该卡");
+        if (StringUtil.isEmpty(customer.getCustid())) {
+            List<TCustomer> cust =
+                    customerDao.findAllByCardnoAndCardphyid(customer.getCardno(), customer.getCardphyid());
+            if (cust.size() != 0) {
+                return JsonResult.error("用户" + cust.get(0).getCustname() + "已拥有该卡");
             }
         }
         customer.setLastsaved(DateUtil.getNow("yyyyMMddHHmmss"));
-        customerDao.save(customer);
-       /* if(null !=cus){
-            String cardverno= systemUtilService.getCardverno();
-            String date=DateUtil.getNow("yyyyMMdd");
-            TCard card=new TCard();
+        TCustomer cus = customerDao.save(customer);
+        if (null != cus) {
+            String cardverno = systemUtilService.getCardverno();
+            String date = DateUtil.getNow("yyyyMMdd");
+            TCard card = new TCard();
             card.setCardno(cus.getCardno());
             card.setOpendate(date);
             card.setCustid(cus.getCustid());
-            card.setStatus(1);
+            card.setStatus("normal");
+            card.setCardphyid(cus.getCardphyid());
             card.setCardverno(cardverno);
             cardDao.save(card);
 
 
-            saveCardver(cardverno, date, cus);
-        }*/
+            saveCardver(cardverno, date, cus, card.getStatus(), RestaurantConstant.STATUS_CARD_NORMAL);
+        }
 
         return JsonResult.ok("成功");
     }
 
 
-/*
-    private void saveCardver(String cardverno, String date, TCustomer cus) {
-        TCardver tCardver=new TCardver();
+    private void saveCardver(String cardverno, String date, TCustomer cus, String status, String optype) {
+        TCardver tCardver = new TCardver();
         tCardver.setAccdate(date);
         tCardver.setCardno(cus.getCardno());
+        tCardver.setCardphyid(cus.getCardphyid());
+
         tCardver.setAdderflag(1);
-        tCardver.setOptype(1);
-        tCardver.setStatus(1);
+        tCardver.setOptype(optype);
+        tCardver.setStatus(status);
         tCardver.setCustid(cus.getCustid());
         tCardver.setCreatetime(DateUtil.getNow("yyyyMMddHHmmss"));
         tCardver.setCardverno(cardverno);
         cardverDao.save(tCardver);
     }
-*/
 
     @Override
     public JsonResult deleteCustomer(String custid) {
 
-        TCustomer customer=customerDao.findById(custid).get();
-        String cardverno= systemUtilService.getCardverno();
-       /* TCard card=cardDao.findById(customer.getCardno()).get();
-        card.setStatus(RestaurantConstant.STATUS_CARD_CANCEL);
+        TCustomer customer = customerDao.findById(custid).get();
+        String cardverno = systemUtilService.getCardverno();
+        TCardPk pk = new TCardPk(customer.getCardphyid(), customer.getCardno());
+        TCard card = cardDao.findById(pk).get();
+        card.setStatus(RestaurantConstant.STATUS_CARD_LOGOUT);
         card.setCardverno(cardverno);
         cardDao.save(card);
-        String date=DateUtil.getNow("yyyyMMdd");
-        saveCardver(cardverno,date,customer);*/
+        String date = DateUtil.getNow("yyyyMMdd");
+        saveCardver(cardverno, date, customer, card.getStatus(), RestaurantConstant.STATUS_CARD_LOGOUT);
 
 
         customerDao.deleteById(custid);
@@ -111,8 +124,6 @@
     }
 
 
-
-
     @Override
     public JsonResult importFile(MultipartFile file, HttpServletRequest request) throws Exception {
         String fname = file.getOriginalFilename();
@@ -125,42 +136,43 @@
 //    InputStream excelstream = new FileInputStream(savePath+"/"+fname);
         InputStream excelstream = file.getInputStream();
         List<Object[][]> oList = null;
-        try{
+        try {
             if (fname.endsWith(".xls")) {
                 oList = ImportExcelUtil.getIntegralData(excelstream);//2003版本
             } else {
                 oList = ImportExcelUtil.getIntegralData07(excelstream);//2007版本以上
             }
-        }catch (Exception e){
+        } catch (Exception e) {
             return JsonResult.error("模板格式错误，请重新下载模板");
         }
 
 
         String msg = "";
-        Integer successCnt=0;
-        Integer failCnt=0;
+        Integer successCnt = 0;
+        Integer failCnt = 0;
         for (Object[][] data : oList) {
             for (int i = 1; i < data.length; i++) {
 
                 if (StringUtil.isEmpty((String) data[i][0]) || StringUtil.isEmpty((String) data[i][1]) || StringUtil.isEmpty((String) data[i][2])) {
                     msg = msg + "第" + i + "行，关键字段缺失。<br/>";
-                    failCnt+=1;
-                } else if (customerDao.countByCardno((String) data[i][1]) >0) {
+                    failCnt += 1;
+                } else if (customerDao.countByCardno((String) data[i][1]) > 0) {
                     msg = msg + "第" + i + "行，该市名卡已存在。<br/>";
-                    failCnt+=1;
-                } else{
-                    TCustomer d=new TCustomer();
+                    failCnt += 1;
+                } else {
+                    TCustomer d = new TCustomer();
                     d.setCustname((String) data[i][0]);
-                    String cardno=(String) data[i][1];
+                    String cardno = (String) data[i][1];
                     d.setCardno(cardno);
                     d.setBankcardno((String) data[i][2]);
-                    String custtype=(String) data[i][3];
+                    String custtype = (String) data[i][3];
                     d.setCusttype(Integer.parseInt(custtype));
-                    if(null!=data[i][4]){
-                        d.setPhone((String) data[i][4]);
+                    d.setCardphyid((String) data[i][4]);
+                    if (null != data[i][5]) {
+                        d.setPhone((String) data[i][5]);
                     }
                     sList.add(d);
-                    successCnt+=1;
+                    successCnt += 1;
                 }
             }
         }
@@ -168,44 +180,44 @@
         // resp.setMsg("成功导入了"+sList.size()+"条信息");
         resp.setMsg(String.format(Locale.CHINESE, msg));
         return resp;*/
-        String batchno=DateUtil.getNow("yyyyMMddHHmmss");
-        if(StringUtil.isEmpty(msg)){
-            for(TCustomer d:sList){
+        String batchno = DateUtil.getNow("yyyyMMddHHmmss");
+        if (StringUtil.isEmpty(msg)) {
+            for (TCustomer d : sList) {
                 d.setBatchno(batchno);
                 saveCustomer(d);
             }
 
-            return JsonResult.ok("成功导入"+sList.size()+"条信息");
+            return JsonResult.ok("成功导入" + sList.size() + "条信息");
         }
-        msg="导入成功"+successCnt+"条，导入失败"+failCnt+"条<br/>"+msg;
+        msg = "导入成功" + successCnt + "条，导入失败" + failCnt + "条<br/>" + msg;
 
         return JsonResult.error(String.format(Locale.CHINESE, msg));
     }
 
     @Override
     public JsonResult export(HttpServletRequest request, HttpServletResponse response) {
-        String[] titles0 = {"市民卡号",	"姓名",	"联系电话","银行卡号"
+        String[] titles0 = {"市民卡号", "姓名", "联系电话", "银行卡号"
         }; //表头
         String fileName0 = "客户名单";// 保存数据
         String[][] info0 = {{}};
-        List<TCustomer> dtl=customerDao.findAll();
-        Integer cnt=dtl.size();
-        if(cnt>0 ){
+        List<TCustomer> dtl = customerDao.findAll();
+        Integer cnt = dtl.size();
+        if (cnt > 0) {
             System.out.println("---init here---");
-            info0=new String[cnt][titles0.length];
+            info0 = new String[cnt][titles0.length];
 
-            for(int i=0;i<cnt;i++){
-                TCustomer t=dtl.get(i);
-                info0[i][0]=t.getCardno();
-                info0[i][1]=t.getCustname();
-                info0[i][2]=t.getPhone();
-                info0[i][3]=t.getBankcardno();
+            for (int i = 0; i < cnt; i++) {
+                TCustomer t = dtl.get(i);
+                info0[i][0] = t.getCardno();
+                info0[i][1] = t.getCustname();
+                info0[i][2] = t.getPhone();
+                info0[i][3] = t.getBankcardno();
 
             }
         }
 
         try {
-            ExportExcel.queryexcel(fileName0, titles0,info0,request, response);
+            ExportExcel.queryexcel(fileName0, titles0, info0, request, response);
             return JsonResult.ok("操作成功");
         } catch (Exception e) {
             e.printStackTrace();
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceServiceImpl.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceServiceImpl.java
index 169e3d2..64d3080 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceServiceImpl.java
@@ -101,6 +101,18 @@
     }
 
     @Override
+    public TDevice getDeviceByDevphyid(String devphyid) {
+        if(StringUtil.isEmpty(devphyid)){
+            devphyid="";
+        }
+        List<TDevice> lst=deviceDao.findAllByDevphyid(devphyid);
+        if(lst.size()>0){
+            return lst.get(0);
+        }
+        return null;
+    }
+
+    @Override
     public List<TDevice> getDeviceByGroupId(Integer groupid) {
             return deviceDao.findAllByDevgroupid(groupid);
     }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/OfflineTransDtlServiceImpl.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/OfflineTransDtlServiceImpl.java
new file mode 100644
index 0000000..a21021e
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/OfflineTransDtlServiceImpl.java
@@ -0,0 +1,111 @@
+package com.supwisdom.dlpay.restaurant.service.impl;
+
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.framework.dao.ShopSettlementDao;
+import com.supwisdom.dlpay.framework.domain.TShopSettlement;
+import com.supwisdom.dlpay.framework.service.SystemUtilService;
+import com.supwisdom.dlpay.framework.util.DateUtil;
+import com.supwisdom.dlpay.framework.util.ExportExcel;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.restaurant.bean.ManageFeeAmtBean;
+import com.supwisdom.dlpay.restaurant.bean.SalesAmtBean;
+import com.supwisdom.dlpay.restaurant.bean.TransDtlSearchBean;
+import com.supwisdom.dlpay.restaurant.dao.OfflineTransDtlDao;
+import com.supwisdom.dlpay.restaurant.dao.TransDtlDao;
+import com.supwisdom.dlpay.restaurant.domain.TOfflineTransDtl;
+import com.supwisdom.dlpay.restaurant.domain.TTransDtl;
+import com.supwisdom.dlpay.restaurant.service.OfflineTransDtlService;
+import com.supwisdom.dlpay.restaurant.service.TransDtlService;
+import com.supwisdom.dlpay.restaurant.util.RestaurantConstant;
+import org.hibernate.query.internal.NativeQueryImpl;
+import org.hibernate.transform.Transformers;
+import org.jetbrains.annotations.NotNull;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.swing.text.html.Option;
+import java.util.*;
+
+@Service
+public class OfflineTransDtlServiceImpl implements OfflineTransDtlService {
+    @Autowired
+    private OfflineTransDtlDao transDtlDao;
+    @Autowired
+    private SystemUtilService systemUtilService;
+
+
+
+    @Override
+    public TOfflineTransDtl saveTransdtl(TOfflineTransDtl dtl) {
+        return transDtlDao.save(dtl);
+    }
+
+    @Override
+    public TOfflineTransDtl getTransDtlByBillno(String billno) {
+        return transDtlDao.getByBillno(billno);
+    }
+
+    @Override
+    public TOfflineTransDtl getOfflineTransDtlByTermsqlnoAndTermid(Integer termsqlno, Integer termid,String termdate) {
+        List<TOfflineTransDtl> dtl=transDtlDao.findByTermsqlnoAndTermidAndAccdate(termsqlno,termid,termdate);
+        if(dtl.size()<1){
+            return null;
+        }
+        return dtl.get(0);
+    }
+
+
+    @Override
+    public Integer getMaxSeqnoToday(Integer deviceid, String accdate) {
+        Integer onlineseqno= transDtlDao.getMaxSqlnoToday(deviceid,accdate);
+        if (null == onlineseqno) {
+            onlineseqno = 0;
+        }
+        return onlineseqno;
+    }
+
+    @Override
+    public JsonResult revertOfflineTransdtl(TOfflineTransDtl dtl) {
+
+        if(dtl.getStatus().equals(RestaurantConstant.STATUS_TRANSDTL_FAIL)){
+            transDtlDao.save(dtl);
+            return null;
+        }
+
+        TOfflineTransDtl targetDtl=transDtlDao.findById(dtl.getBillno()).get();
+       
+        TOfflineTransDtl revDtl=new TOfflineTransDtl();
+        BeanUtils.copyProperties(targetDtl,revDtl);
+        revDtl.setBillno(systemUtilService.getRefno());
+        revDtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_INIT);
+        revDtl.setAccdate(DateUtil.getNow("yyyyMMdd"));
+        revDtl.setAcctime(DateUtil.getNow("HHmmss"));
+        revDtl.setRevbillno(dtl.getBillno());
+        revDtl.setTranstype(RestaurantConstant.TRANSTYPE_TRANSDTL_REVERT);
+        revDtl.setAmount(targetDtl.getAmount()*-1.00);
+        transDtlDao.save(revDtl);
+        targetDtl.setRevflag(1);
+        transDtlDao.save(targetDtl);
+        return JsonResult.ok("操作成功");
+    }
+
+    @Override
+    public List<TOfflineTransDtl> getUncheckOfflineTransdtl(String accdate) {
+        return transDtlDao.findAllByAccdateAndStatusIsNull(accdate);
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/ShopSettlementServiceImpl.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/ShopSettlementServiceImpl.java
index 41f043d..a5ff9d1 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/ShopSettlementServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/ShopSettlementServiceImpl.java
@@ -27,4 +27,9 @@
     public List<TShopSettlement> getAllShopSettlement() {
         return shopSettlementDao.findAll();
     }
+
+    @Override
+    public List<TShopSettlement> getShopByShopid(Integer shopid) {
+        return  shopSettlementDao.findByShopid(shopid);
+    }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/TransDtlFormServiceImpl.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/TransDtlFormServiceImpl.java
index 0377d16..576cca7 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/TransDtlFormServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/TransDtlFormServiceImpl.java
@@ -3,7 +3,9 @@
 import com.supwisdom.dlpay.framework.util.DateUtil;
 import com.supwisdom.dlpay.framework.util.PageResult;
 import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.restaurant.dao.MealTypeDao;
 import com.supwisdom.dlpay.restaurant.dao.TransDtlDao;
+import com.supwisdom.dlpay.restaurant.domain.TMealtype;
 import com.supwisdom.dlpay.restaurant.domain.TTransDtlFormResult;
 import com.supwisdom.dlpay.restaurant.service.TransDtlFormService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -16,6 +18,8 @@
 public class TransDtlFormServiceImpl implements TransDtlFormService {
     @Autowired
     private TransDtlDao transDtlFormDao;
+    @Autowired
+    private MealTypeDao mealTypeDao;
 
     @Override
     public List<TTransDtlFormResult> getTransDtlFormResult(Integer devgroupid, String startdate, String enddate) {
@@ -30,4 +34,9 @@
         return transDtlFormDao.getFormResult(devgroupid,startdate,enddate);
 
     }
+
+    @Override
+    public List<TMealtype> getAllMealType() {
+        return mealTypeDao.findAll();
+    }
 }
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 e47decc..b0f0442 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
@@ -8,11 +8,15 @@
 import com.supwisdom.dlpay.framework.util.ExportExcel;
 import com.supwisdom.dlpay.framework.util.PageResult;
 import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.restaurant.bean.ManageFeeAmtBean;
+import com.supwisdom.dlpay.restaurant.bean.SalesAmtBean;
 import com.supwisdom.dlpay.restaurant.bean.TransDtlSearchBean;
 import com.supwisdom.dlpay.restaurant.dao.TransDtlDao;
 import com.supwisdom.dlpay.restaurant.domain.TTransDtl;
 import com.supwisdom.dlpay.restaurant.service.TransDtlService;
 import com.supwisdom.dlpay.restaurant.util.RestaurantConstant;
+import org.hibernate.query.internal.NativeQueryImpl;
+import org.hibernate.transform.Transformers;
 import org.jetbrains.annotations.NotNull;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -22,6 +26,9 @@
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
 
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
 import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
@@ -42,10 +49,13 @@
     @Autowired
     private SystemUtilService systemUtilService;
 
+    @PersistenceContext
+    private EntityManager entityManager;
+
     @Override
     public PageResult<TTransDtl> getTransDtlByParam(TransDtlSearchBean param) {
         Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize()
-                , Sort.by("refno"));
+                , Sort.by("billno"));
 
         Specification<TTransDtl> spec = gettTransDtlSpecification(param);
 
@@ -59,8 +69,8 @@
                 public Predicate toPredicate(Root<TTransDtl> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {
                     List<Predicate> list = new ArrayList<>();
 
-                    if (!StringUtil.isEmpty(param.getRefno())) {
-                        list.add(cb.like(root.get("refno").as(String.class), "%" + param.getRefno() + "%"));
+                    if (!StringUtil.isEmpty(param.getBillno())) {
+                        list.add(cb.like(root.get("billno").as(String.class), "%" + param.getBillno() + "%"));
                     }
                     if (!StringUtil.isEmpty(param.getCustname())) {
                         list.add(cb.like(root.get("custname").as(String.class), "%" + param.getCustname() + "%"));
@@ -109,7 +119,7 @@
             for(int i=0;i<cnt;i++){
                 TTransDtl t=dtl.get(i);
                 info0[i][0]=t.getCustname();
-                info0[i][1]=t.getRefno();
+                info0[i][1]=t.getBillno();
                 info0[i][2]=t.getAmount().toString();
                 info0[i][3]=t.getAccdate();
                 info0[i][4]=t.getTransdate();
@@ -117,8 +127,9 @@
                 info0[i][6]=shopmap.get(t.getShopid());
                 String status="";
                 switch (t.getStatus()){
-                    case 1:status="未入账"; break;
-                    case 0:status="已入账"; break;
+                    case "init":status="未入账"; break;
+                    case "success":status="已入账"; break;
+                    case "fail":status="已入账"; break;
                     default:status="未知状态";
                 }
                 info0[i][7]=status;
@@ -136,24 +147,94 @@
         return JsonResult.error("操作失败");
     }
 
+    @Override
+    public TTransDtl saveTransdtl(TTransDtl dtl) {
+        return transDtlDao.save(dtl);
+    }
+
+    @Override
+    public TTransDtl getTransDtlByBillno(String billno) {
+        return transDtlDao.getByBillno(billno);
+    }
 
 
     @Override
     public JsonResult revertTransdtl(TTransDtl dtl) {
-        TTransDtl targetDtl=transDtlDao.findById(dtl.getRefno()).get();
+        TTransDtl targetDtl=transDtlDao.findById(dtl.getBillno()).get();
         if(null==targetDtl){
             return JsonResult.error("未查询到目标流水");
         }
         TTransDtl revDtl=new TTransDtl();
         BeanUtils.copyProperties(targetDtl,revDtl);
-        revDtl.setRefno(systemUtilService.getRefno());
-        revDtl.setStatus(0);
-        revDtl.setAccdate(DateUtil.getNow("yyyyMMdd"));
-        revDtl.setAcctime(DateUtil.getNow("HHmmss"));
-        revDtl.setAttr2(dtl.getAttr2());
+        revDtl.setBillno(systemUtilService.getRefno());
+        revDtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_INIT);
+        String date=DateUtil.getNow("yyyyMMdd");
+        String time=DateUtil.getNow("HHmmss");
+        revDtl.setAccdate(date);
+        revDtl.setAcctime(time);
+        revDtl.setTransdate(date);
+        revDtl.setTranstime(time);
+        revDtl.setRevbillno(dtl.getBillno());
+        revDtl.setAttr1(dtl.getAttr1());
+        revDtl.setStatus(dtl.getStatus());
         revDtl.setTranstype(RestaurantConstant.TRANSTYPE_TRANSDTL_REVERT);
         revDtl.setAmount(targetDtl.getAmount()*-1.00);
         transDtlDao.save(revDtl);
+        targetDtl.setRevflag(1);
+        transDtlDao.save(targetDtl);
         return JsonResult.ok("操作成功");
     }
+
+    @Override
+    public Integer getMaxSeqnoToday(Integer deviceid, String accdate) {
+        Integer onlineseqno= transDtlDao.getMaxSqlnoToday(deviceid,accdate);
+        if (null == onlineseqno) {
+            onlineseqno = 0;
+        }
+        return onlineseqno;
+    }
+
+    @Override
+    public ManageFeeAmtBean getManageFeeToday(String transdate, Integer termid) {
+        StringBuffer querySql = new StringBuffer(
+                "select sum(managefee) as managefeeamt,count(managefee) as managefeecnt " +
+                        " from tb_transdtl where transdate=:transdate and termid=:termid and managefee!=0 ");
+
+        Query query = entityManager.createNativeQuery(querySql.toString());
+        query.setParameter("transdate",transdate);
+        query.setParameter("termid",termid);
+        query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(ManageFeeAmtBean.class));
+
+        List<ManageFeeAmtBean> list = query.getResultList();
+        ManageFeeAmtBean bean=list.get(0);
+        if(bean.getManagefeeamt()==null){
+            bean.setManagefeeamt(0.0);
+        }
+        return bean;
+    }
+
+    @Override
+    public SalesAmtBean getSalesToday(String transdate, Integer termid) {
+        StringBuffer querySql = new StringBuffer("select sum(amount) as salesamt,count(amount) as salescnt "+
+                "from tb_transdtl where transdate=:transdate and termid=:termid");
+
+        Query query = entityManager.createNativeQuery(querySql.toString());
+        query.setParameter("transdate",transdate);
+        query.setParameter("termid",termid);
+        query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(SalesAmtBean.class));
+
+        List<SalesAmtBean> list = query.getResultList();
+        SalesAmtBean bean=list.get(0);
+        if(bean.getSalesamt()==null){
+            bean.setSalesamt(0.0);
+        }
+        return bean;
+    }
+
+    @Override
+    public List<TTransDtl> getSubmittingTransdtl() {
+        return transDtlDao.findAllByStatus(RestaurantConstant.STATUS_TRANSDTL_WAIT);
+    }
+
+
 }
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 3015eff..932fb67 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/util/RestaurantConstant.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/util/RestaurantConstant.java
@@ -6,15 +6,27 @@
   public static final String STATUS_DISCOUNTRULE_CLOSED = "closed";   //无效
   public static final String STATUS_DISCOUNTRULE_REJECT = "reject";   //驳回
 
-  public static final Integer STATUS_TRANSDTL_UNCHECKED = 0;   //未入账
-  public static final Integer STATUS_TRANSDTL_CHECKED = 1;   //已入账
-  public static final String TRANSTYPE_TRANSDTL_ONLINE = "lj";   //联机
-  public static final String TRANSTYPE_TRANSDTL_OFFLINE = "tj";   //脱机
-  public static final String TRANSTYPE_TRANSDTL_REVERT = "cz";   //冲正
+  public static final String STATUS_TRANSDTL_INIT = "init";   //初始化
+  public static final String STATUS_TRANSDTL_WAIT = "wait";   //提交中
+  public static final String STATUS_TRANSDTL_SUCCESS = "suc";   //已入账
+  public static final String STATUS_TRANSDTL_FAIL = "fail";   //取消
 
 
-  public static final Integer STATUS_CARD_NORMAL = 1;   //正常
-  public static final Integer STATUS_CARD_CANCEL= 2;   //注销
+
+  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 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 RULETYPE_QUOTA = "quota"; //定额
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 088c74d..24567ce 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
@@ -64,6 +64,7 @@
 
 
     @GetMapping(value = ["/gettoken", "/gettoken/{clientid}"])
+    @ResponseBody
     fun loginInit(appid: String, @PathVariable clientid: String?,
                   @RequestHeader(Constants.HEADER_TETANTID) tetantId: String?): ResponseEntity<Any> {
 
@@ -92,7 +93,7 @@
                 it.loginTimestamp = now
                 it.roles = api.roles
                 it.tenantId = tetantId
-                it.token = HmacUtil.HMACSHA256(token, api.secret)
+                it.token = HmacUtil.HMACSHA256( api.secret,token)
             }.also {
                 apiClientRepository.save(it)
             }
@@ -110,7 +111,7 @@
     }
 
     private fun checkSecretToken(api: ApiClientRedis, secret: String): Boolean {
-        return (api.token == secret)
+        return (api.token.toLowerCase() == secret.toLowerCase())
     }
 
     @GetMapping(value = ["/authentication", "/authentication/{clientid}"])
diff --git a/src/main/kotlin/com/supwisdom/dlpay/security.kt b/src/main/kotlin/com/supwisdom/dlpay/security.kt
index 4392fa6..7e0b13a 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/security.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/security.kt
@@ -121,12 +121,14 @@
                         .antMatcher("/api/**")
                         .authorizeRequests()
                         .antMatchers("/api/auth/**").permitAll()
+                        //.antMatchers("/api/pos/**").permitAll()
                         .antMatchers("/api/notify/**").permitAll()
                         .antMatchers("/api/common/**").hasAnyRole("THIRD_COMMON", "THIRD_ADMIN")
                         .antMatchers("/api/consume/**").hasRole("THIRD_CONSUME")
                         .antMatchers("/api/deposit/**").hasRole("THIRD_DEPOSIT")
                         .antMatchers("/api/user/**").hasRole("THIRD_ADMIN")
                         .antMatchers("/api/shop/**").hasRole("THIRD_SHOP")
+                        .antMatchers("/api/pos/**").hasRole("THIRD_SHOP")
                         .anyRequest().hasRole("THIRD_COMMON")
                         .and()
                         .csrf().ignoringAntMatchers("/api/**")
diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql
index 27a53ab..6f33be3 100644
--- a/src/main/resources/data.sql
+++ b/src/main/resources/data.sql
@@ -77,9 +77,9 @@
 
 INSERT INTO "tb_dictionary"(dictval,dicttype,dictcaption,dicttypename) VALUES ('0', 'sexList', '女', '性别');
 INSERT INTO "tb_dictionary"(dictval,dicttype,dictcaption,dicttypename) VALUES ('1', 'sexList', '男', '性别');
-INSERT INTO "tb_dictionary"(dictval,dicttype,dictcaption,dicttypename) VALUES ('lj', 'transtypeList', '联机', '交易类型');
-INSERT INTO "tb_dictionary"(dictval,dicttype,dictcaption,dicttypename) VALUES ('tj', 'transtypeList', '脱机', '交易类型');
-INSERT INTO "tb_dictionary"(dictval,dicttype,dictcaption,dicttypename) VALUES ('cz', 'transtypeList', '冲正', '交易类型');
+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 ('0', 'transtatusList', '未入账', '流水状态');
 INSERT INTO "tb_dictionary"(dictval,dicttype,dictcaption,dicttypename) VALUES ('1', 'transtatusList', '已入账', '流水状态');
 
@@ -104,7 +104,10 @@
 INSERT INTO "tb_function"(id,createtime,isleaf,lastsaved,menuicon,menuurl,name,ordernum,parentid) VALUES (30, NULL, 1, NULL, '', '/transdtlrev/index', '交易冲正', NULL, 28);
 INSERT INTO "tb_function"(id,createtime,isleaf,lastsaved,menuicon,menuurl,name,ordernum,parentid) VALUES (1, NULL, 1, NULL, '', '/custtype/index', '客户类型维护', 1, 22);
 INSERT INTO "tb_function"(id,createtime,isleaf,lastsaved,menuicon,menuurl,name,ordernum,parentid) VALUES (23, NULL, 1, NULL, 'layui-icon-home', '/customer/index', '就餐对象管理', 3, 22);
-
+INSERT INTO "tb_function" (id,createtime,isleaf,lastsaved,menuicon,menuurl,name,ordernum,parentid) VALUES (10, NULL, 0, NULL, 'layui-icon-util', '#', '参数管理', 3, -1);
+INSERT INTO "tb_function" (id,createtime,isleaf,lastsaved,menuicon,menuurl,name,ordernum,parentid) VALUES (11, NULL, 1, NULL, 'layui-icon-util', '/param/syspara', '全局参数配置', 1, 10);
+INSERT INTO "tb_function" (id,createtime,isleaf,lastsaved,menuicon,menuurl,name,ordernum,parentid) VALUES (12, NULL, 1, NULL, 'layui-icon-util', '/param/businesspara', '业务参数配置', 2, 10);
+INSERT INTO "tb_function" (id,createtime,isleaf,lastsaved,menuicon,menuurl,name,ordernum,parentid) VALUES (17, NULL, 1, NULL, 'layui-icon-util', '/param/apiclientpara', '应用参数配置', 3, 10);
 
 INSERT INTO "tb_mealtype" (mealtype,endtime,lastsaved,mealname) VALUES ('dinner', '200000', '20190709102922', '晚餐');
 INSERT INTO "tb_mealtype" (mealtype,endtime,lastsaved,mealname) VALUES ('lunch', '130000', '20190709102922', '中午');
@@ -112,9 +115,7 @@
 INSERT INTO "tb_oper_role" (id,operid,roleid) VALUES ('2c9cab836a90185f016a901b005f001b', '402882816a8fe884016a8fe8c0530000', '2c9cab836a8af5d5016a8af6ece20000');
 INSERT INTO "tb_oper_role" (id,operid,roleid) VALUES ('ff8080816aaf2ec3016aaf30c1b60007', 'LOR2IwRkbOjp+sVG9KR2BpHZbwGKepS4', 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
 INSERT INTO "tb_oper_role" (id,operid,roleid) VALUES ('ff8080816ab96daf016ab9743dc60050', '2c9cab836a9666e0016a96694bbb0004', 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_operator" (operid,closedate,email,mobile,opendate,opercode,opername,operpwd,opertype,sex,status) VALUES ('402882816a8fe884016a8fe8c0530000', NULL, '', '', '20190507', 'test', '11112', '$2a$10$Xa/UKDQ/WkiKVQAyv5Hu4eiqt6HtwVK3YA0Glg1/y1uiEsXnG7ZeS', 'oper', 'normal', 'male');
-INSERT INTO "tb_operator" (operid,closedate,email,mobile,opendate,opercode,opername,operpwd,opertype,sex,status) VALUES ('LOR2IwRkbOjp+sVG9KR2BpHZbwGKepS4', '20500101', '', '', '20190101', 'system', '系统管理员', '$2a$10$Ex9xp11.vCaD8D0a7ahiUOKqDij1TcCUBwRAmrqXeDvAkmzLibn4.', 'oper', 'normal', 'male');
-INSERT INTO "tb_operator" (operid,closedate,email,mobile,opendate,opercode,opername,operpwd,opertype,sex,status) VALUES ('2c9cab836a9666e0016a96694bbb0004', NULL, '', '', '20190508', 'test1', 'test1', '$2a$10$lkfzdX.0ioX9FU2BmPzHz.tv2DTR8XvaZzA0vpkEYV5vx/IDtIsGy', 'oper', 'normal', 'normal');
+INSERT INTO "tb_operator" (operid,closedate,email,mobile,opendate,opercode,opername,operpwd,opertype,sex,status) VALUES ('LOR2IwRkbOjp+sVG9KR2BpHZbwGKepS4', '20500101', '', '', '20190101', 'system', '系统管理员', '$2a$10$Ex9xp11.vCaD8D0a7ahiUOKqDij1TcCUBwRAmrqXeDvAkmzLibn4.', 'oper', 'male','normal');
 INSERT INTO "tb_paytype_config" (paytype,configid,config_name,config_value) VALUES ('yktpay', 'appid', NULL, '100005');
 INSERT INTO "tb_paytype_config" (paytype,configid,config_name,config_value) VALUES ('yktpay', 'appkey', NULL, 'adc4ac6822fd462780f878b86cb94688');
 INSERT INTO "tb_paytype_config" (paytype,configid,config_name,config_value) VALUES ('yktpay', 'orderurl', NULL, 'http://172.28.201.101:9116/epayapi/services/thirdparty/common/pay');
@@ -290,6 +291,19 @@
 INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (23, '', 15, '查询', '/device/index');
 INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (25, '', 15, '添加页面', '/device/loadadd');
 INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (31, '', 15, '添加', '/device/add');
+INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (26, '', 11, '修改', '/param/sysparaupdate');
+INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (27, '', 11, '查询', '/param/syspara');
+INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (28, '', 12, '查询', '/param/businesspara');
+INSERT INTO "tb_resource"  (id,code,function_id,name,uri) VALUES (29, '', 12, '删除', '/param/deletebusinesspara');
+INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (30, '', 12, '修改', '/param/businessparaupdate');
+INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (32, '', 12, '新增', '/param/addbusinesspara');
+INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (33, '', 12, '新增跳转', '/param/load4addbuspara');
+INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (34, '', 17, '查询', '/param/apiclientpara');
+INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (35, '', 17, '新增修改跳转', '/param/load4addapiclient');
+INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (36, '', 17, '修改状态', '/param/updateapiclientstate');
+INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (37, '', 17, '删除', '/param/deleteapiclient');
+INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (39, '', 17, '修改', '/param/updateapiclientpara');
+INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (40, '', 17, '新增', '/param/addapiclientpara');
 INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (38, '', 15, '修改状态', '/device/updatestate');
 INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (42, '', 15, '导入页面', '/device/loadimport');
 INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (44, '', 15, '导入', '/device/import');
@@ -336,10 +350,10 @@
 INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (88, '', 30, '查询', '/transdtlrev/index');
 INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (89, '', 30, '加载冲正页面', '/transdtlrev/loadrevert');
 INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (90, '', 30, '冲正', '/transdtlrev/revert');
-INSERT INTO "tb_resource"(id,code,function_id,name,uri) VALUES (27, '', 1, '加载添加', '/custtype/loadadd');
-INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (28, '', 1, '添加', '/custtype/add');
-INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (29, '', 1, '修改', '/custtype/update');
-INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (30, '', 1, '删除', '/custtype/delete');
+INSERT INTO "tb_resource"(id,code,function_id,name,uri) VALUES 91, '', 1, '加载添加', '/custtype/loadadd');
+INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (92, '', 1, '添加', '/custtype/add');
+INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (93, '', 1, '修改', '/custtype/update');
+INSERT INTO "tb_resource" (id,code,function_id,name,uri) VALUES (94, '', 1, '删除', '/custtype/delete');
 
 INSERT INTO "tb_role" (roleid,createtime,editflag,lastsaved,rolecode,roledesc,rolename) VALUES ('d1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '20190101000000', 0, '', 'ROLE_ADMIN', '超级管理员', '超级管理员');
 INSERT INTO "tb_role" (roleid,createtime,editflag,lastsaved,rolecode,roledesc,rolename) VALUES ('2c9cab836a8af5d5016a8af6ece20000', '20190506102639', 1, '', 'ROLE_ADMIN', '系统管理员', '系统管理员');
diff --git a/src/main/resources/templates/restaurant/customer/form.html b/src/main/resources/templates/restaurant/customer/form.html
index 757f63a..748db9d 100644
--- a/src/main/resources/templates/restaurant/customer/form.html
+++ b/src/main/resources/templates/restaurant/customer/form.html
@@ -17,6 +17,14 @@
     </div>
 
     <div class="layui-form-item">
+        <label class="layui-form-label"><span style="color: red">* </span>物理卡号</label>
+        <div class="layui-input-block">
+            <input name="cardphyid" placeholder="请输入" type="text" class="layui-input" maxlength="20"
+                   lay-verify="required" required/>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
         <label class="layui-form-label">人员类别</label>
         <div class="layui-input-block">
             <select name="custtype" id="customer-custtype" lay-verify="required">
diff --git a/src/main/resources/templates/restaurant/customer/index.html b/src/main/resources/templates/restaurant/customer/index.html
index 47b1a9c..bfb9aa9 100644
--- a/src/main/resources/templates/restaurant/customer/index.html
+++ b/src/main/resources/templates/restaurant/customer/index.html
@@ -37,12 +37,14 @@
             elem: '#customer-table',
             url: '[[@{/customer/list}]]',
             page: true,
+            minWidth: 80,
             cols: [
                 [
-                    {field: 'custid', title: '客户号',width: 140, sort: true},
-                    {field: 'custname', sort: true, width: 150, title: '客户姓名'},
-                    {field: 'cardno', sort: true, width: 150, title: '市名卡号'},
-                    {field: 'phone', sort: true, width: 140, title: '联系电话'},
+                    {field: 'custid', title: '客户号', sort: true},
+                    {field: 'custname', sort: true,  title: '客户姓名'},
+                    {field: 'cardno', sort: true,width: 200, title: '市名卡号'},
+                    {field: 'cardphyid', sort: true, title: '物理卡号'},
+                    {field: 'phone',  title: '联系电话'},
                     {field: 'bankcardno', sort: true, width: 200, title: '银行卡号'},
                     {
                         field: 'custtype', width:100, title: '人员类别', templet: function (item) {
@@ -54,7 +56,7 @@
                         }
                     },
                     {
-                        field: 'custid', align: 'center', title: '操作', fixed: 'right', templet: function (item) {
+                        field: 'custid', align: 'center',width:150, title: '操作', fixed: 'right', templet: function (item) {
                             return ' <a class="layui-btn  layui-btn-xs" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a> '+
                                 ' <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>';
                         }
diff --git a/src/main/resources/templates/restaurant/device/form.html b/src/main/resources/templates/restaurant/device/form.html
index 1f3d234..17e5877 100644
--- a/src/main/resources/templates/restaurant/device/form.html
+++ b/src/main/resources/templates/restaurant/device/form.html
@@ -18,11 +18,20 @@
     </div>
 
 
-    <div class="layui-form-item">
-        <label class="layui-form-label"><span style="color: red">* </span>所属商户ID</label>
+   <!-- <div class="layui-form-item">
+        <label class="layui-form-label"><span style="color: red">* </span>所属商户</label>
         <div class="layui-input-block">
             <input name="shopid" placeholder="请输入" type="text" class="layui-input"/>
         </div>
+    </div>-->
+
+    <div class="layui-form-item">
+        <label class="layui-form-label"><span style="color: red">* </span>所属商户</label>
+        <div class="layui-input-block">
+            <select name="shopid"  lay-verify="required">
+                <option th:each="shop : ${shoplist}" th:value="${shop.shopid}">[[${shop.shopname}]]</option>
+            </select>
+        </div>
     </div>
 
     <div class="layui-form-item model-form-footer">
@@ -76,6 +85,7 @@
             console.log(data);
             layer.load(2);
             let token = $("meta[name='_csrf_token']").attr("value");
+            console.log(token);
             $.ajax({
                 type: "POST",
                 dataType: "json",
diff --git a/src/main/resources/templates/restaurant/devicemanage/form.html b/src/main/resources/templates/restaurant/devicemanage/form.html
index b3d650f..59894af 100644
--- a/src/main/resources/templates/restaurant/devicemanage/form.html
+++ b/src/main/resources/templates/restaurant/devicemanage/form.html
@@ -4,7 +4,7 @@
     <div class="layui-form-item">
         <label class="layui-form-label"><span style="color: red">* </span>设备名称</label>
         <div class="layui-input-block">
-            <input name="devicename" placeholder="建议采用带有地理坐标的名称" type="text" class="layui-input" maxlength="20"
+            <input name="devicename" placeholder="建议采用商户的名称" type="text" class="layui-input" maxlength="20"
                    lay-verify="required|devphyid" required/>
         </div>
     </div>
diff --git a/src/main/resources/templates/restaurant/transdtl/index.html b/src/main/resources/templates/restaurant/transdtl/index.html
index 3188c65..555d218 100644
--- a/src/main/resources/templates/restaurant/transdtl/index.html
+++ b/src/main/resources/templates/restaurant/transdtl/index.html
@@ -37,7 +37,7 @@
                     <div class="layui-inline">
                         <label class="layui-form-label"> 交易号：</label>
                         <div class="layui-input-inline">
-                            <input id="transdtl-refno" name="refno" class="layui-input " type="text"/>
+                            <input id="transdtl-refno" name="billno" class="layui-input " type="text"/>
                         </div>
                     </div>
                     <div class="layui-inline">
@@ -124,14 +124,13 @@
                 enddate:enddate
             },
             toolbar: true,
-            minWidth: 80,
             defaultToolbar: ['filter', 'print'],
             page: true,
             cols: [
                 [
-                    {field: 'custname', title: '姓名', fixed: 'left'},
+                    {field: 'custname', title: '姓名',width:100, fixed: 'left'},
                     {field: 'cardno', title: '市民卡号', fixed: 'left'},
-                    {field: 'refno', title: '交易号', fixed: 'left', sort: true},
+                    {field: 'billno', title: '交易号', fixed: 'left',width:200, sort: true},
                     {field: 'amount', title: '交易金额', sort: true,
                         templet: function (item) {
                             return numberFormat(item.amount,2);
@@ -140,6 +139,7 @@
                         field: 'accdate',
                         title: '交易日期',
                         sort: true,
+                        width:120,
                         templet: function (item) {
                             var date = item.accdate;
                             if (date != null) {
@@ -152,6 +152,7 @@
                         field: 'transdate',
                         title: '记账日期',
                         sort: true,
+                        width:120,
                         templet: function (item) {
                             var date = item.transdate;
                             if (date != null) {
@@ -214,7 +215,7 @@
                     shopid: shopid,
                     startdate: startdate,
                     enddate: enddate,
-                    refno: refno,
+                    billno: refno,
                     status: status,
                     termid: termid
                 }, page: {curr: 1}
diff --git a/src/main/resources/templates/restaurant/transdtlform/index.html b/src/main/resources/templates/restaurant/transdtlform/index.html
index 6d872c4..1320191 100644
--- a/src/main/resources/templates/restaurant/transdtlform/index.html
+++ b/src/main/resources/templates/restaurant/transdtlform/index.html
@@ -8,7 +8,7 @@
     </div>
     <div class="layui-card-body">
         <div class="layui-form toolbar">
-            <form id="transdtl-form"  >
+            <form id="transdtl-form">
                 <div class="layui-form-item">
                     <div class="layui-inline">
                         <label class="layui-form-label">交易日期：</label>
@@ -21,36 +21,121 @@
                                    id="transdtlform-enddate" placeholder="yyyy-MM-dd">
                         </div>
                     </div>
+                    <div class="layui-inline">
+                        <label class="layui-form-label"><span style="color: red">* </span>设备组</label>
+                        <div class="layui-input-block">
+                            <input id="search-transdtlform-form-devgroupid" type="text" name="devgroupid"
+                                   lay-filter="search-transdtlform-form-devgroupid-filter" autocomplete="off"
+                                   class="layui-input"/>
+                        </div>
+                    </div>
+                    <button class="layui-btn" lay-filter="transdtlform-form-submit" lay-submit id="transdtlform-submitbtn">保存</button>
                 </div>
-                <div class="layui-input-inline">
-                    <input id="search-devparabind-form-devgroupid" type="text"
-                           lay-filter="search-devparabind-form-devgroupid-filter" autocomplete="off"
-                           class="layui-input"/>
-                </div>
+
+
             </form>
 
         </div>
-        <table class="layui-table" id="transdtl-table" lay-filter="table"></table>
+        <table class="layui-table" id="transdtlform-table" lay-filter="transdtlform-table">
+            <thead>
+            <tr>
+                <th rowspan="2" style="min-width:100px;text-align: center;vertical-align: middle;">商户名称</th>
+                <th rowspan="2" style="min-width:100px;text-align: center;vertical-align: middle;">终端编号</th>
+                <th colspan="2" style="min-width:140px;text-align: center">早餐</th>
+                <th colspan="2" style="min-width:140px;text-align: center">中餐</th>
+                <th colspan="2" style="min-width:140px;text-align: center">晚餐</th>
+            </tr>
+            <tr>
+                <th style="min-width:70px;text-align: center">人次</th>
+                <th style="min-width:70px;text-align: center">金额</th>
+                <th style="min-width:70px;text-align: center">人次</th>
+                <th style="min-width:70px;text-align: center">金额</th>
+                <th style="min-width:70px;text-align: center">人次</th>
+                <th style="min-width:70px;text-align: center">金额</th>
+            </tr>
+            </thead>
+            <tbody id="pdata">
+            <!-- start ajax zone -->
+            <tr th:each="group,iterStat : ${pagelist}">
+                <td th:rowspan="${iterStat.size+1}"
+                    style="min-width:100px;text-align: center;vertical-align:middle">
+                    [[${group.devgroupname}]]
+                </td>
+
+                 <td th:each="device,iterStat : ${group}"
+                        style="min-width:100px;text-align: center;vertical-align:middle">
+                    [[${device.devicename}]]
+                </td>
+                <c:if test="${mtype3.mealtype eq mb.mealtype}">
+                    <td style="min-width:70px;text-align: center">
+                        <c:out
+                                value="${mb.totalcnt}"/>
+                    </td>
+                    <td style="min-width:70px;text-align: center">
+                        <fmt:formatNumber
+                                pattern="##0.00"
+                                value="${mb.totalamt}"/>
+                    </td>
+                </c:if>
+            </tr>
+            <tr>
+                <td style="min-width:100px;text-align: center;vertical-align:middle"
+                    title="${second.termid}">
+                    <c:out value="${second.termname}"/>
+                </td>
+                <c:if test="${mtype4.mealtype eq mb1.mealtype}">
+                    <td style="min-width:70px;text-align: center">
+                        <c:out
+                                value="${mb1.totalcnt}"/>
+                    </td>
+                    <td style="min-width:70px;text-align: center">
+                        <fmt:formatNumber
+                                pattern="##0.00"
+                                value="${mb1.totalamt}"/>
+                    </td>
+                </c:if>
+            </tr>
+            <tr>
+                <td style="min-width:100px;text-align: right">
+                    <c:out value="${temp.shopname}"/>
+                    小计：
+                </td>
+                <td style="min-width:70px;text-align: center">
+                    <c:out
+                            value="${s1.totalcnt}"/>
+                </td>
+                <td style="min-width:70px;text-align: center">
+                    <fmt:formatNumber
+                            pattern="##0.00"
+                            value="${s1.totalamt}"/>
+                </td>
+            </tr>
+            </c:forEach>
+            <tr class="active">
+                <td colspan="2" style="min-width:100px;text-align: right">总计：</td>
+                <td style="min-width:70px;text-align: center">
+                    <c:out
+                            value="${s2.totalcnt}"/>
+                </td>
+                <td style="min-width:70px;text-align: center">
+                    <fmt:formatNumber pattern="##0.00"
+                                      value="${s2.totalamt}"/>
+                </td>
+            </tr>
+            </tbody>
+        </table>
     </div>
 </div>
 
 <script>
-
-    layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
-        let form = layui.form;
+    layui.use(['form', 'table', 'layer', 'admin', 'element','treeSelect'], function () {
         let table = layui.table;
-        let admin = layui.admin;
         var treeSelect = layui.treeSelect;
+        var enddate = $("#transdtlform-enddate").val();
+        var treeNode=null;
 
-
-
-        // 搜索按钮点击事件
-        $('#btn-search').click(function () {
-            let key = $('#search-value').val().trim();
-            table.reload('table', {where: {searchkey: key}});
-        });
         treeSelect.render({
-            elem: '#search-devparabind-form-devgroupid',
+            elem: '#search-transdtlform-form-devgroupid',
             data: '[[@{/device/binddevparagrouptree}]]',
             type: 'get',
             placeholder: '选择设备组',
@@ -65,12 +150,15 @@
             },
             // 点击回调
             click: function (d) {
-                var treeNode = d.current;
-                console.log(treeNode);
+                treeNode = d.current;
                 return true;
             },
             success: function (d) {
-                console.log(d); // 加载完成后的回调函数
+                // 加载完成后的回调函数
+                //checkNode需指向filter而非id
+                treeSelect.checkNode(
+                    'search-transdtlform-form-devgroupid-filter',
+                    1);
             }
         });
         laydate.render({
@@ -86,6 +174,39 @@
             max: enddate
         });
 
+        form.on('submit(transdtlform-form-submit)', function (data) {
+            layer.load(2);
+            let token = $("meta[name='_csrf_token']").attr("value");
+            $.ajax({
+                type: "POST",
+                dataType: "json",
+                url: url,
+                headers: {
+                    'Accept': 'application/json',
+                    'Content-Type': 'application/json',
+                    'X-CSRF-TOKEN': token,
+                },
+                data: JSON.stringify(data.field),
+                success: function (result) {
+                    layer.closeAll('loading');
+                    if (result.code == 200) {
+                        layer.msg(result.msg, {icon: 1});
+                    } else if (result.code == 401) {
+                        layer.msg(result.msg, {icon: 2, time: 1500}, function () {
+                            location.replace('/login');
+                        }, 1000);
+                        return;
+                    } else {
+                        layer.msg(result.msg, {icon: 2});
+                    }
+                },
+                error: function () {
+                    layer.closeAll('loading');
+                    layer.msg("请求服务器失败！", {icon: 2});
+                }
+            });
+            return false;
+        });
 
     });
 
