食堂消费初始化,食堂消费确认,消费流水查询,消费冲正,离线流水上传,白名单下载,pos机系统参数下载,心跳,签到,账户余额查询,营业额查询
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;
+        });
 
     });