diff --git a/src/main/java/com/supwisdom/dlpay/AppLoginRunner.java b/src/main/java/com/supwisdom/dlpay/AppLoginRunner.java
index a4cc8ed..7322f57 100644
--- a/src/main/java/com/supwisdom/dlpay/AppLoginRunner.java
+++ b/src/main/java/com/supwisdom/dlpay/AppLoginRunner.java
@@ -1,6 +1,7 @@
 package com.supwisdom.dlpay;
 
 import com.supwisdom.dlpay.framework.dao.BusinessparaDao;
+import com.supwisdom.dlpay.framework.domain.TBusinesspara;
 import com.supwisdom.dlpay.framework.util.StringUtil;
 import com.supwisdom.dlpay.paysdk.ApiLoginHelper;
 import com.supwisdom.dlpay.paysdk.proxy.ApiLoginProxy;
@@ -38,14 +39,14 @@
 
     @Scheduled(cron = "${payapi.logintime}")
     private void doLogin() {
-        String appid=businessparaDao.findByParakey("payapi.appid").getParaval();
-        String secret=businessparaDao.findByParakey("payapi.secret").getParaval();
-        if(StringUtil.isEmpty(appid)||StringUtil.isEmpty(secret)){
+        TBusinesspara appid=businessparaDao.findByParakey("payapi.appid");
+        TBusinesspara secret=businessparaDao.findByParakey("payapi.secret");
+        if(null==(appid)||null==(secret)){
             logger.info("业务参数appid或secret未配置");
             return;
         }
         ApiLoginHelper helper = new ApiLoginHelper(apiLoginProxy);
-        helper.login(appid, secret);
+        helper.login(appid.getParaval(), secret.getParaval());
         logger.info("登录成功");
     }
 
diff --git a/src/main/java/com/supwisdom/dlpay/api/service/impl/PosPayServiceImpl.java b/src/main/java/com/supwisdom/dlpay/api/service/impl/PosPayServiceImpl.java
index 1e1146a..2d99bcc 100644
--- a/src/main/java/com/supwisdom/dlpay/api/service/impl/PosPayServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/api/service/impl/PosPayServiceImpl.java
@@ -66,31 +66,7 @@
             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);
@@ -98,31 +74,35 @@
             return resp;
         }
 
+        //TODO:改 GroupID逻辑
         Integer groupid = req.getParagroupid();
-        if (groupid == 0) {
+       /* 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;
+            group=deviceParamService.getDefaultDevparaGroup();
+            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());
+        if(group.getGlobalflag()==false){
+            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);
         }
-        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);
@@ -145,14 +125,24 @@
             resp.setRetmsg("设备不存在");
             return resp;
         }
-        // 检查卡状态
+        //TODO:改 检查卡状态
         TCard tCard = cardService.getCardByCardnoAndCardphyid(req.getCardno(), req.getCardphyid());
         if (null == tCard) {
             resp.setRetcode(ErrorCode.ERRIF_CARD_NOTEXIST);
             resp.setRetmsg("卡号[" + req.getCardno() + "]不存在");
             return resp;
         }
-
+        if (!tCard.getStatus().equals(RestaurantConstant.STATUS_CARD_NORMAL)){
+            resp.setRetcode(ErrorCode.ERRIF_CARD_DISABLED);
+            resp.setRetmsg("卡号[" + req.getCardno() + "]已注销");
+            return resp;
+        }
+        if(!tCard.getTransstatus().equals(RestaurantConstant.STATUS_CARD_NORMAL)){
+            resp.setRetmsg("卡号[" + req.getCardno() + "]状态异常;");
+            resp.setRetcode(ErrorCode.ERRIF_CARD_DISABLED);
+            return resp;
+        }
+        //TODO:改 这个意思不大
         TCustomer customer=customerService.getCustomerByCustid(tCard.getCustid());
         if(null==customer){
             resp.setRetcode(ErrorCode.ERRIF_POSDTL_NOTEXIST);
@@ -161,7 +151,15 @@
         }
         Double managefee=0.0;
 
+        TTransDtl odtl=transDtlService.getPosTransdtl(tDevice.getId(),req.getTermseqno(),req.getTermdate());
 
+        if(null!=odtl){
+            resp.setRetcode(ErrorCode.ERRIF_POS_SEQNO_REPEAT);
+            resp.setRetmsg("该pos当日流水重复");
+            return resp;
+        }
+
+        //TODO:改 同一流水号判重？？二维码消费逻辑:请求核心平台解码获取身份
         TTransDtl tTransdtl = new TTransDtl();
         tTransdtl.setAccdate(systemUtilService.getAccdate());
         tTransdtl.setTermid(tDevice.getId());
@@ -179,7 +177,7 @@
         tTransdtl.setAmount(0D);
         tTransdtl.setManagefee(0.0);
         tTransdtl.setRevflag(0);
-        List<TMealtype> mealtypes = mealTypeDao.findAllByOrderByEndtime();
+        List<TMealtype> mealtypes = mealTypeDao.findAllByOrderByEndtime(); //TODO:改 餐次设备时钟
         try {
             for (TMealtype m : mealtypes) {
                 if (DateUtil.compareTime(m.getEndtime(), req.getTermtime())) {
@@ -205,7 +203,16 @@
             tTransdtl.setCustname("");
         }
 
-        transDtlService.saveTransdtl(tTransdtl);
+        TTransDtl dtl=transDtlService.saveTransdtl(tTransdtl);
+
+/*        CitizenCardPayinitParam param=new CitizenCardPayinitParam();
+        param.setBillno(dtl.getBillno());
+        param.setShopaccno(dtl.getShopid());
+        param.setTransdate(dtl.getTransdate());
+        param.setTranstime(dtl.getTranstime());
+        param.setCardNo(dtl.getCardno());
+        param.setAmount(0);
+        CitizenPayResponse response=payApiService.citizencardPayinit(param);*/
         resp.setBillno(tTransdtl.getBillno());
         resp.setRetcode(ErrorCode.ERRIF_OK);
         resp.setAnonymous(false);
@@ -226,12 +233,8 @@
     @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());
+
+        TTransDtl tTransdtl = transDtlService.getTransDtlByBillno(req.getBillno()); //TODO:改 事务加锁改状态
         if (null == tTransdtl) {
             resp.setRetcode(ErrorCode.ERRIF_POSDTL_NOTEXIST);
             resp.setRetmsg("交易参考号" + req.getBillno() + "不存在");
@@ -243,55 +246,39 @@
             resp.setRetmsg("客户" + tTransdtl.getCustid() + "不存在");
             return resp;
         }
-        Integer extamount = 0;
+
+        Integer extamount = 0; //TODO:改 餐补规则的应用??
         if (cus.getCusttype() == 1) {
             extamount += 100;
         }
 
+        Integer posamount=req.getAmount();
+
+
+
         tTransdtl.setAmount(req.getAmount() / 100.0);
-        tTransdtl.setManagefee(extamount / 100.0);
+        tTransdtl.setManagefee(extamount / 100.0); //managefeetype :mealer discount
         tTransdtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_WAIT);
-        TTransDtl dtl=transDtlService.saveTransdtl(tTransdtl);
-        CitizenCardPayinitParam param=new CitizenCardPayinitParam();
-        param.setBillno(dtl.getBillno());
-        param.setShopaccno(dtl.getShopid());
-        param.setTransdate(dtl.getTransdate());
-        param.setTranstime(dtl.getTranstime());
-        param.setCardNo(dtl.getCardno());
-        param.setDtltype("canteen");
-        param.setAmount(0);
-        CitizenPayResponse response=payApiService.citizencardPayinit(param);
+        transDtlService.saveTransdtl(tTransdtl);
 
-        if(response.getRetcode()!=0){
-            tTransdtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_FAIL);
-            tTransdtl.setAttr1(response.getRetmsg());
-            transDtlService.saveTransdtl(tTransdtl);
-            resp.setRetcode(response.getRetcode()+"");
-            resp.setRetmsg(response.getRetmsg());
-            return resp;
-        }
-        CitizenCardPayfinishParam finishparam=new CitizenCardPayfinishParam();
-        finishparam.setRefno(response.getRefno());
-        CitizenPayResponse finishresp=payApiService.citizencardPayFinish(finishparam);
-        if(finishresp.getRetcode()!=0){
-            tTransdtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_FAIL);
-            tTransdtl.setAttr1(finishresp.getRetmsg());
-            transDtlService.saveTransdtl(tTransdtl);
-            resp.setRetcode(finishresp.getRetcode()+"");
-            resp.setRetmsg(finishresp.getRetmsg());
-            return resp;
-        }
 
+
+        //TODO:调核心平台初始化确认 逻辑缺！！！
         tTransdtl.setStatus(RestaurantConstant.STATUS_TRANSDTL_SUCCESS);
         transDtlService.saveTransdtl(tTransdtl);
 
+
         resp.setBillno(req.getBillno());
-        Double retAmount=finishresp.getAmount()*100;
+        Double retAmount=tTransdtl.getAmount()*100;
         resp.setAmount(retAmount.intValue());
         resp.setExtraamt(extamount*100);
         resp.setUserid(cus.getCustid());
         resp.setUsername(cus.getCustname());
-        resp.setRequire_query(false);
+        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;
@@ -322,7 +309,7 @@
         resp.setExtraamt(retExtamt.intValue());
         resp.setUserid(cus.getCustid());
         resp.setUsername(cus.getCustname());
-        resp.setRequire_query(true);
+        resp.setRequire_query(true); //TODO:改 什么时候成功
         resp.setBalance(0);
         resp.setRetcode(ErrorCode.ERRIF_OK);
         return resp;
@@ -599,7 +586,7 @@
             err+="卡对应人员不存在;";
         } else {
             transDtl.setCustid(customer.getCustid());
-            transDtl.setCustname(customer.getCardno());
+            transDtl.setCustname(customer.getCustname());
         }
 
 
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/bean/CustomerExportBean.java b/src/main/java/com/supwisdom/dlpay/restaurant/bean/CustomerExportBean.java
new file mode 100644
index 0000000..adcdd79
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/bean/CustomerExportBean.java
@@ -0,0 +1,42 @@
+package com.supwisdom.dlpay.restaurant.bean;
+
+
+
+public class CustomerExportBean {
+    private String custname;
+    private String phone;
+    private String cardno;
+    private String bankcardno;
+
+    public String getCustname() {
+        return custname;
+    }
+
+    public void setCustname(String custname) {
+        this.custname = custname;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public String getCardno() {
+        return cardno;
+    }
+
+    public void setCardno(String cardno) {
+        this.cardno = cardno;
+    }
+
+    public String getBankcardno() {
+        return bankcardno;
+    }
+
+    public void setBankcardno(String bankcardno) {
+        this.bankcardno = bankcardno;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/bean/CustomerSaveBean.java b/src/main/java/com/supwisdom/dlpay/restaurant/bean/CustomerSaveBean.java
new file mode 100644
index 0000000..8a5c01a
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/bean/CustomerSaveBean.java
@@ -0,0 +1,143 @@
+package com.supwisdom.dlpay.restaurant.bean;
+
+
+
+public class CustomerSaveBean {
+    private String custid;
+    private Integer custtype;
+    private String custname;
+    private String operid;
+    private String idno;
+    private String idtype;
+    private String phone;
+    private String batchno;
+    private String lastsaved;
+    private String status;
+    private String cardno;
+    private String cardphyid;
+    private String bankcardno;
+
+    public String getCustid() {
+        return custid;
+    }
+
+    public void setCustid(String custid) {
+        this.custid = custid;
+    }
+
+    public Integer getCusttype() {
+        return custtype;
+    }
+
+    public void setCusttype(Integer custtype) {
+        this.custtype = custtype;
+    }
+
+    public String getCustname() {
+        return custname;
+    }
+
+    public void setCustname(String custname) {
+        this.custname = custname;
+    }
+
+    public String getOperid() {
+        return operid;
+    }
+
+    public void setOperid(String operid) {
+        this.operid = operid;
+    }
+
+    public String getIdno() {
+        return idno;
+    }
+
+    public void setIdno(String idno) {
+        this.idno = idno;
+    }
+
+    public String getIdtype() {
+        return idtype;
+    }
+
+    public void setIdtype(String idtype) {
+        this.idtype = idtype;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public String getBatchno() {
+        return batchno;
+    }
+
+    public void setBatchno(String batchno) {
+        this.batchno = batchno;
+    }
+
+    public String getLastsaved() {
+        return lastsaved;
+    }
+
+    public void setLastsaved(String lastsaved) {
+        this.lastsaved = lastsaved;
+    }
+
+    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;
+    }
+
+    public String getBankcardno() {
+        return bankcardno;
+    }
+
+    public void setBankcardno(String bankcardno) {
+
+        this.bankcardno = bankcardno;
+    }
+
+    @Override
+    public String toString() {
+        return "CustomerSaveBean{" +
+                "custid='" + custid + '\'' +
+                ", custtype=" + custtype +
+                ", custname='" + custname + '\'' +
+                ", operid='" + operid + '\'' +
+                ", idno='" + idno + '\'' +
+                ", idtype='" + idtype + '\'' +
+                ", phone='" + phone + '\'' +
+                ", batchno='" + batchno + '\'' +
+                ", lastsaved='" + lastsaved + '\'' +
+                ", status='" + status + '\'' +
+                ", cardno='" + cardno + '\'' +
+                ", cardphyid='" + cardphyid + '\'' +
+                ", bankcardno='" + bankcardno + '\'' +
+                '}';
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/bean/CustomerShowBean.java b/src/main/java/com/supwisdom/dlpay/restaurant/bean/CustomerShowBean.java
new file mode 100644
index 0000000..c053e2e
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/bean/CustomerShowBean.java
@@ -0,0 +1,84 @@
+package com.supwisdom.dlpay.restaurant.bean;
+
+
+import javax.persistence.Column;
+
+public class CustomerShowBean {
+    private String custid;
+    private Integer custtype;
+    private String custname;
+    private String phone;
+    private String cardno;
+    private String cardphyid;
+    private String bankcardno;
+
+    public CustomerShowBean(){
+
+    }
+
+    public CustomerShowBean(String custid, Integer custtype, String custname, String phone, String cardno, String cardphyid, String bankcardno) {
+        this.custid = custid;
+        this.custtype = custtype;
+        this.custname = custname;
+        this.phone = phone;
+        this.cardno = cardno;
+        this.cardphyid = cardphyid;
+        this.bankcardno = bankcardno;
+    }
+
+    public String getCustid() {
+        return custid;
+    }
+
+    public void setCustid(String custid) {
+        this.custid = custid;
+    }
+
+    public Integer getCusttype() {
+        return custtype;
+    }
+
+    public void setCusttype(Integer custtype) {
+        this.custtype = custtype;
+    }
+
+    public String getCustname() {
+        return custname;
+    }
+
+    public void setCustname(String custname) {
+        this.custname = custname;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    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 getBankcardno() {
+        return bankcardno;
+    }
+
+    public void setBankcardno(String bankcardno) {
+        this.bankcardno = bankcardno;
+    }
+}
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 5f303b3..38435b8 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/controller/CustomerController.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/controller/CustomerController.java
@@ -6,7 +6,9 @@
 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.bean.CustomerSaveBean;
 import com.supwisdom.dlpay.restaurant.bean.CustomerSearchBean;
+import com.supwisdom.dlpay.restaurant.bean.CustomerShowBean;
 import com.supwisdom.dlpay.restaurant.domain.TCustType;
 import com.supwisdom.dlpay.restaurant.domain.TCustomer;
 import com.supwisdom.dlpay.restaurant.service.CustTypeService;
@@ -52,7 +54,7 @@
     @RequestMapping("/list")
     @PreAuthorize("hasPermission('/customer/list','')")
     @ResponseBody
-    public PageResult<TCustomer> getDataList(@RequestParam("page") Integer pageNo,
+    public PageResult<CustomerShowBean> getDataList(@RequestParam("page") Integer pageNo,
                                              @RequestParam("limit") Integer pageSize,
                                              @RequestParam(value = "searchkey", required = false) String searchKey) {
         try {
@@ -62,7 +64,9 @@
             searchBean.setPageNo(pageNo);
             searchBean.setCustname(searchKey);
             searchBean.setPageSize(pageSize);
-            return customerService.getCustomerByCustname(searchBean);
+            PageResult<CustomerShowBean> bean= customerService.getCustomerByCustname(searchBean);
+
+            return bean;
         } catch (Exception e) {
             e.printStackTrace();
             return new PageResult<>(99, "系统查询错误");
@@ -81,7 +85,7 @@
     @PostMapping("/add")
     @PreAuthorize("hasPermission('/customer/add','')")
     @ResponseBody
-    public JsonResult add(@RequestBody TCustomer customer) {
+    public JsonResult add(@RequestBody CustomerSaveBean customer) {
         if (customer != null) {
             return customerService.saveCustomer(customer);
         } else {
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceParamController.java b/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceParamController.java
index afaacae..8c0c7bd 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceParamController.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceParamController.java
@@ -131,7 +131,8 @@
     try {
       if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
       if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
-      return deviceParamService.getDevparaBindInfos(searchkey, pageNo, pageSize);
+      PageResult<DevparaBindBean> result= deviceParamService.getDevparaBindInfos(searchkey, pageNo, pageSize);
+      return result;
     } catch (Exception e) {
       e.printStackTrace();
       return new PageResult<>(99, "系统查询错误");
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 dc55b15..d1f234d 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/dao/CardDao.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/dao/CardDao.java
@@ -10,10 +10,17 @@
 import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 @Repository
 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);
 
+    List<TCard> findAllByCustid(String custid);
+
+    List<TCard> findAllByCardno(String cardno);
+
+    Integer countByCardno(String cardno);
 }
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 f8d8c64..40e6f99 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/dao/CustomerDao.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/dao/CustomerDao.java
@@ -15,12 +15,4 @@
 
     Page<TCustomer> findAllByCustnameContaining(String custname, Pageable pageable);
 
-
-    Integer countByCardno(String cardno);
-
-    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/DevparaGroupDao.java b/src/main/java/com/supwisdom/dlpay/restaurant/dao/DevparaGroupDao.java
index d9b52fe..04033ee 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/dao/DevparaGroupDao.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/dao/DevparaGroupDao.java
@@ -13,6 +13,8 @@
 
   TDevparaGroup findByGroupid(int groupid);
 
+  TDevparaGroup findByGlobalflag(Boolean t);
+
   @Query("select count(t.groupid) from TDevparaGroup t where t.groupname=?1 ")
   long checkGroupnameExists(String groupname);
 
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 61133b3..f2b60b6 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/dao/TransDtlDao.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/dao/TransDtlDao.java
@@ -42,4 +42,6 @@
 
     List<TTransDtl> findAllByStatus(String status);
 
+    TTransDtl getByTransdateAndTermidAndTermsqlno(String transdate,Integer termid,Integer termsqlno);
+
 }
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 3ee3479..85d3174 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCard.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCard.java
@@ -11,10 +11,12 @@
     private String custid;
     private String cardphyid;
     private String  status;
-    private Integer lossflag;
+    private Integer transstatus;
     private String opendate;
     private String closedate;
     private String cardverno;
+    private String expiredate;
+    private String bankcardno;
 
 
     @Id
@@ -53,13 +55,13 @@
     public void setStatus(String status) {
         this.status = status;
     }
-    @Column(name = "lossflag" ,length = 1)
-    public Integer getLossflag() {
-        return lossflag;
+    @Column(name = "transstatus" ,length = 1)
+    public Integer getTransstatus() {
+        return transstatus;
     }
 
-    public void setLossflag(Integer lossflag) {
-        this.lossflag = lossflag;
+    public void setTransstatus(Integer transstatus) {
+        this.transstatus = transstatus;
     }
 
     @Column(name = "opendate" ,length = 8)
@@ -87,4 +89,22 @@
     public void setCardverno(String cardverno) {
         this.cardverno = cardverno;
     }
+
+    @Column(name = "expiredate" ,length = 8)
+    public String getExpiredate() {
+        return expiredate;
+    }
+
+    public void setExpiredate(String expiredate) {
+        this.expiredate = expiredate;
+    }
+
+    @Column(name = "bankcardno" ,length = 20)
+    public String getBankcardno() {
+        return bankcardno;
+    }
+
+    public void setBankcardno(String bankcardno) {
+        this.bankcardno = bankcardno;
+    }
 }
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 a237010..e6070a4 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCustomer.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/domain/TCustomer.java
@@ -14,11 +14,8 @@
     private Integer custtype;
     private String custname;
     private String operid;
-    private String cardno;
-    private String cardphyid;
     private String idno;
     private String idtype;
-    private String bankcardno;
     private String phone;
     private String batchno;
     private String lastsaved;
@@ -55,16 +52,6 @@
         this.custtype = custtype;
     }
 
-    @Column(name = "CARDNO", length = 32)
-    public String getCardno() {
-        return cardno;
-    }
-
-    public void setCardno(String cardno) {
-        this.cardno = cardno;
-    }
-
-
     @Column(name = "IDNO", length = 20)
     public String getIdno() {
         return idno;
@@ -75,16 +62,6 @@
     }
 
 
-    @Column(name = "BANKCARDNO", length = 30)
-    public String getBankcardno() {
-        return bankcardno;
-    }
-
-    public void setBankcardno(String bankcardno) {
-        this.bankcardno = bankcardno;
-    }
-
-
     @Column(name = "BATCHNO", length = 14)
     public String getBatchno() {
         return batchno;
@@ -141,13 +118,4 @@
     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/service/CustomerService.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/CustomerService.java
index ac82e55..d22b33a 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/CustomerService.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/CustomerService.java
@@ -2,7 +2,9 @@
 
 import com.supwisdom.dlpay.api.bean.JsonResult;
 import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.restaurant.bean.CustomerSaveBean;
 import com.supwisdom.dlpay.restaurant.bean.CustomerSearchBean;
+import com.supwisdom.dlpay.restaurant.bean.CustomerShowBean;
 import com.supwisdom.dlpay.restaurant.bean.DeviceSearchBean;
 import com.supwisdom.dlpay.restaurant.domain.TCustomer;
 import com.supwisdom.dlpay.restaurant.domain.TDevice;
@@ -16,14 +18,14 @@
 
 public interface CustomerService {
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
-    PageResult<TCustomer> getCustomerByCustname(CustomerSearchBean param);
+    PageResult<CustomerShowBean> 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);
+    JsonResult saveCustomer(CustomerSaveBean customer);
 
 
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/DeviceParamService.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/DeviceParamService.java
index 8b6ba10..94b18ca 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/DeviceParamService.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/DeviceParamService.java
@@ -21,6 +21,9 @@
   @Transactional(rollbackFor = Exception.class, readOnly = true)
   TDevparaGroup getDevparaGroupByGroupid(int groupid);
 
+  @Transactional(rollbackFor = Exception.class, readOnly = true)
+  TDevparaGroup getDefaultDevparaGroup();
+
   @Transactional(rollbackFor = Exception.class)
   boolean deleteDevparaGroup(TDevparaGroup group) throws WebCheckException;
 
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 fbbbbc5..adfcc0f 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/TransDtlService.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/TransDtlService.java
@@ -28,6 +28,10 @@
     TTransDtl getTransDtlByBillno(String billno);
 
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+    TTransDtl getPosTransdtl(Integer termid,Integer termsqlno,String termdate);
+
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     JsonResult revertTransdtl(TTransDtl dtl);
 
 
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 9184d9c..1d393e1 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
@@ -3,7 +3,7 @@
 import com.supwisdom.dlpay.api.bean.JsonResult;
 import com.supwisdom.dlpay.framework.service.SystemUtilService;
 import com.supwisdom.dlpay.framework.util.*;
-import com.supwisdom.dlpay.restaurant.bean.CustomerSearchBean;
+import com.supwisdom.dlpay.restaurant.bean.*;
 import com.supwisdom.dlpay.restaurant.dao.CardDao;
 import com.supwisdom.dlpay.restaurant.dao.CardverDao;
 import com.supwisdom.dlpay.restaurant.dao.CustomerDao;
@@ -11,8 +11,11 @@
 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.CardService;
 import com.supwisdom.dlpay.restaurant.service.CustomerService;
 import com.supwisdom.dlpay.restaurant.util.RestaurantConstant;
+import org.hibernate.query.internal.NativeQueryImpl;
+import org.hibernate.transform.Transformers;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Pageable;
@@ -20,9 +23,13 @@
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.InputStream;
+import java.math.BigInteger;
 import java.util.*;
 
 
@@ -36,18 +43,38 @@
     private SystemUtilService systemUtilService;
     @Autowired
     private CardDao cardDao;
+    @Autowired
+    private CardService cardService;
 
     @Autowired
     private CardverDao cardverDao;
 
+    @PersistenceContext
+    private EntityManager entityManager;
+
     @Override
-    public PageResult<TCustomer> getCustomerByCustname(CustomerSearchBean param) {
-        Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize()
-                , Sort.by("custid"));
-        if (null != param.getCustname()) {
-            return new PageResult<>(customerDao.findAllByCustnameContaining(param.getCustname(), pageable));
+    public PageResult<CustomerShowBean> getCustomerByCustname(CustomerSearchBean param) {
+        StringBuffer querySql = new StringBuffer("select t.cardno,t.custid,c.custname, " +
+                "t.bankcardno,t.cardphyid,c.phone,c.custtype from Tb_card t " +
+                "left join tb_customer c on t.custid=c.custid ");
+        StringBuffer countSql = new StringBuffer("select count(*) as cnt from Tb_card t left join tb_customer c on t.custid=c.custid ");
+        if (!StringUtil.isEmpty(param.getCustname())) {
+            querySql.append(" where  c.custname like :str ");
+            countSql.append(" where  c.custname like :str ");
         }
-        return new PageResult<>(customerDao.findAll(pageable));
+        querySql.append(" order by t.cardno ");
+        Query query = entityManager.createNativeQuery(querySql.toString());
+        Query countQuery = entityManager.createNativeQuery(countSql.toString());
+        if (!StringUtil.isEmpty(param.getCustname())) {
+            query.setParameter("str", "%" + param.getCustname().trim() + "%");
+            countQuery.setParameter("str", "%" + param.getCustname().trim() + "%");
+        }
+        query.setFirstResult((param.getPageNo() - 1) * param.getPageSize());
+        query.setMaxResults(param.getPageSize()); //分页显示
+        query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(CustomerShowBean.class));
+        List<CustomerShowBean> list = query.getResultList();
+        BigInteger count = (BigInteger) countQuery.getSingleResult();
+        return new PageResult<>(count.longValue(), list);
     }
 
     @Override
@@ -60,46 +87,56 @@
     }
 
     @Override
-    public JsonResult saveCustomer(TCustomer customer) {
+    public JsonResult saveCustomer(CustomerSaveBean customer) {
         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() + "已拥有该卡");
+            TCard card =
+                    cardService.getCardByCardnoAndCardphyid(customer.getCardno(), customer.getCardphyid());
+            if (null!=card) {
+                return JsonResult.error("用户" + customer.getCustname() + "已拥有该卡");
             }
         }
-        customer.setLastsaved(DateUtil.getNow("yyyyMMddHHmmss"));
-        TCustomer cus = customerDao.save(customer);
+
+        TCustomer cus=new TCustomer();
+        cus.setCusttype(customer.getCusttype());
+        cus.setBatchno(customer.getBatchno());
+        cus.setLastsaved(DateUtil.getNow("yyyyMMddHHmmss"));
+        cus.setPhone(customer.getPhone());
+        cus.setCustname(customer.getCustname());
+        cus.setIdno(customer.getIdno());
+        cus.setIdtype(customer.getIdtype());
+        cus.setStatus(RestaurantConstant.STATUS_CARD_NORMAL);
+        cus = customerDao.save(cus);
         if (null != cus) {
             String cardverno = systemUtilService.getCardverno();
             String date = DateUtil.getNow("yyyyMMdd");
             TCard card = new TCard();
-            card.setCardno(cus.getCardno());
+            card.setCardno(customer.getCardno());
             card.setOpendate(date);
             card.setCustid(cus.getCustid());
             card.setStatus("normal");
-            card.setCardphyid(cus.getCardphyid());
+            card.setCardphyid(customer.getCardphyid());
             card.setCardverno(cardverno);
-            cardDao.save(card);
+            card.setBankcardno(customer.getBankcardno());
+            card.setExpiredate("");
+            card=cardDao.save(card);
 
-
-            saveCardver(cardverno, date, cus, card.getStatus(), RestaurantConstant.STATUS_CARD_NORMAL);
+            saveCardver(cardverno, date, card, card.getStatus(), RestaurantConstant.STATUS_CARD_NORMAL);
         }
 
         return JsonResult.ok("成功");
     }
 
 
-    private void saveCardver(String cardverno, String date, TCustomer cus, String status, String optype) {
+    private void saveCardver(String cardverno, String date, TCard card, String status, String optype) {
         TCardver tCardver = new TCardver();
         tCardver.setAccdate(date);
-        tCardver.setCardno(cus.getCardno());
-        tCardver.setCardphyid(cus.getCardphyid());
+        tCardver.setCardno(card.getCardno());
+        tCardver.setCardphyid(card.getCardphyid());
 
         tCardver.setAdderflag(1);
         tCardver.setOptype(optype);
         tCardver.setStatus(status);
-        tCardver.setCustid(cus.getCustid());
+        tCardver.setCustid(card.getCustid());
         tCardver.setCreatetime(DateUtil.getNow("yyyyMMddHHmmss"));
         tCardver.setCardverno(cardverno);
         cardverDao.save(tCardver);
@@ -110,13 +147,15 @@
 
         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, card.getStatus(), RestaurantConstant.STATUS_CARD_LOGOUT);
+        List<TCard> card = cardDao.findAllByCustid(custid);
+        for(TCard c:card){
+            c.setStatus(RestaurantConstant.STATUS_CARD_LOGOUT);
+            c.setCardverno(cardverno);
+            cardDao.save(c);
+            String date = DateUtil.getNow("yyyyMMdd");
+            saveCardver(cardverno, date, c, c.getStatus(), RestaurantConstant.STATUS_CARD_LOGOUT);
+        }
+
 
 
         customerDao.deleteById(custid);
@@ -132,7 +171,7 @@
             return JsonResult.error("文件格式错误,请选择excel文件格式(.xls/.xlsx)");
         }
 
-        List<TCustomer> sList = new ArrayList<>();
+        List<CustomerSaveBean> sList = new ArrayList<>();
 //    InputStream excelstream = new FileInputStream(savePath+"/"+fname);
         InputStream excelstream = file.getInputStream();
         List<Object[][]> oList = null;
@@ -156,11 +195,11 @@
                 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) {
+                } else if (cardDao.countByCardno((String) data[i][1]) > 0) {
                     msg = msg + "第" + i + "行，该市名卡已存在。<br/>";
                     failCnt += 1;
                 } else {
-                    TCustomer d = new TCustomer();
+                    CustomerSaveBean d = new CustomerSaveBean();
                     d.setCustname((String) data[i][0]);
                     String cardno = (String) data[i][1];
                     d.setCardno(cardno);
@@ -182,7 +221,7 @@
         return resp;*/
         String batchno = DateUtil.getNow("yyyyMMddHHmmss");
         if (StringUtil.isEmpty(msg)) {
-            for (TCustomer d : sList) {
+            for (CustomerSaveBean d : sList) {
                 d.setBatchno(batchno);
                 saveCustomer(d);
             }
@@ -200,14 +239,15 @@
         }; //表头
         String fileName0 = "客户名单";// 保存数据
         String[][] info0 = {{}};
-        List<TCustomer> dtl = customerDao.findAll();
+        List<CustomerExportBean> dtl = getCustomerExport();
+
         Integer cnt = dtl.size();
         if (cnt > 0) {
             System.out.println("---init here---");
             info0 = new String[cnt][titles0.length];
 
             for (int i = 0; i < cnt; i++) {
-                TCustomer t = dtl.get(i);
+                CustomerExportBean t = dtl.get(i);
                 info0[i][0] = t.getCardno();
                 info0[i][1] = t.getCustname();
                 info0[i][2] = t.getPhone();
@@ -225,5 +265,14 @@
         return JsonResult.error("操作失败");
     }
 
+    private  List<CustomerExportBean> getCustomerExport() {
+        StringBuffer querySql = new StringBuffer(
+                "select c.custname,c.phone,t.cardno,t.bankcardno from tb_card t left join tb_customer c on t.custid=c.custid");
+
+        Query query = entityManager.createNativeQuery(querySql.toString());
+        query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(CustomerExportBean.class));
+        List<CustomerExportBean> list = query.getResultList();
+        return list;
+    }
 
 }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceDiscountRuleServiceImpl.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceDiscountRuleServiceImpl.java
index c76a7c5..7530e47 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceDiscountRuleServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceDiscountRuleServiceImpl.java
@@ -36,6 +36,7 @@
 import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 
 @Service
 public class DeviceDiscountRuleServiceImpl implements DeviceDiscountRuleService {
@@ -51,6 +52,8 @@
     private CustomerDao customerDao;
     @Autowired
     private DeviceDao deviceDao;
+    @Autowired
+    private CardDao cardDao;
 
     @PersistenceContext
     private EntityManager entityManager;
@@ -152,9 +155,10 @@
 
     private TCustomer getCustomerByCardno(String cardno) {
         if (!StringUtil.isEmpty(cardno)) {
-            List<TCustomer> list = customerDao.findAllByCardno(cardno.trim());
-            if (!StringUtil.isEmpty(list)) {
-                return list.get(0);
+            TCard clst=cardDao.findAllByCardno(cardno).get(0);
+            Optional<TCustomer> list = customerDao.findById(clst.getCustid());
+            if (list.isPresent()) {
+                return list.get();
             }
         }
         return null;
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceParamServiceImpl.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceParamServiceImpl.java
index 865114d..2c3e714 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceParamServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceParamServiceImpl.java
@@ -61,6 +61,11 @@
   }
 
   @Override
+  public TDevparaGroup getDefaultDevparaGroup() {
+    return devparaGroupDao.findByGlobalflag(true);
+  }
+
+  @Override
   public boolean deleteDevparaGroup(TDevparaGroup group) throws WebCheckException {
     if (null != group) {
       if (group.getGlobalflag()) {
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 e004451..06b5a37 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
@@ -152,6 +152,11 @@
         return transDtlDao.getByBillno(billno);
     }
 
+    @Override
+    public TTransDtl getPosTransdtl(Integer termid, Integer termsqlno, String termdate) {
+        return transDtlDao.getByTransdateAndTermidAndTermsqlno(termdate,termid,termsqlno);
+    }
+
 
     @Override
     public JsonResult revertTransdtl(TTransDtl dtl) {
diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql
index b65eed5..5c28f58 100644
--- a/src/main/resources/data.sql
+++ b/src/main/resources/data.sql
@@ -1,5 +1,7 @@
-﻿INSERT INTO "tb_apiclient" (appid,roles,secret,status,thirdurl,bcrypt_secret) VALUES ('200001', 'ROLE_THIRD_SHOP;ROLE_THIRD_DEPOSIT;ROLE_THIRD_ADMIN;ROLE_THIRD_CONSUME;ROLE_THIRD_COMMON', 'oUw2NmA09ficiVWD4TUQLDOkPyzQa3VzbjjsW0B2qTk=', 'normal', NULL, '$2a$10$Iaftjij0mOzWY3Yo3e83geMT2ExqsP4b84enC454xFoxP1rKDWl/e');
-INSERT INTO "tb_apiclient" (appid,roles,secret,status,thirdurl,bcrypt_secret) VALUES ('100001', 'ROLE_THIRD_ADMIN', 'oUw2NmA09ficiVWD4TUQLDOkPyzQa3VzbjjsW0B2qTk=', 'normal', NULL, '$2a$10$dcHoUeXbjMJw7YV5UyW/PugQYBK3MlNudXuqfeciSn.sr1fYwEHTK');
+﻿INSERT INTO "tb_apiclient" (appid,roles,secret,status,thirdurl,bcrypt_secret) VALUES ('200001', 'ROLE_THIRD_SHOP;ROLE_THIRD_DEPOSIT;ROLE_THIRD_ADMIN;ROLE_THIRD_CONSUME;ROLE_THIRD_COMMON', 'dc1d26c0d43e442588092c8d45c21bce', 'normal', NULL, '$2a$10$Iaftjij0mOzWY3Yo3e83geMT2ExqsP4b84enC454xFoxP1rKDWl/e');
+--INSERT INTO "tb_apiclient" (appid,roles,secret,status,thirdurl,bcrypt_secret) VALUES ('100001', 'ROLE_THIRD_ADMIN', 'oUw2NmA09ficiVWD4TUQLDOkPyzQa3VzbjjsW0B2qTk=', 'normal', NULL, '$2a$10$dcHoUeXbjMJw7YV5UyW/PugQYBK3MlNudXuqfeciSn.sr1fYwEHTK');
+INSERT INTO "tb_apiclient" (appid,roles,secret,status,thirdurl,bcrypt_secret) VALUES ('3000004', 'ROLE_THIRD_SHOP;ROLE_THIRD_DEPOSIT;ROLE_THIRD_CONSUME', 'c9ae5b4fe5014b5b9eb19e1a0797a3a3', 'normal', NULL, '$2a$10$XvsC6sUyXhKhZvvfKK7.t.UVu8PuP5Mc5UdblLZzsVCtAsT6i2NBK');
+
 
 INSERT INTO "tb_devpara" (paraname,groupid,maxval,minval,paradesc,paraval,valtype) VALUES ('communicate_time', 1, '255', '0', '终端请求超时时间(单位:秒)', '3', 'N');
 INSERT INTO "tb_devpara" (paraname,groupid,maxval,minval,paradesc,paraval,valtype) VALUES ('socket_switch', 1, NULL, NULL, '长连接是否启用(0不启用,1启用)', '1', 'B');
@@ -439,10 +441,10 @@
 INSERT INTO "tb_custtype" (custtypeid,custtypename,feetype) VALUES (2, '外部人员', NULL);
 INSERT INTO "tb_custtype" (custtypeid,custtypename,feetype) VALUES (1, '内部人员', NULL);
 
-insert into "tb_businesspara" (parakey,paravalue) values('upgrade_url','http://172.28.43.252:9977/file/download');
-insert into "tb_businesspara" (parakey,paravalue) values('upgrade_version','posa711dali-1.');
-INSERT INTO "tb_businesspara" (parakey,paravalue) VALUES ('payapi.appid', '200001');
-INSERT INTO "tb_businesspara" (parakey,paravalue) VALUES ('payapi.secret', 'dc1d26c0d43e442588092c8d45c21bce');
+insert into "tb_businesspara" (parakey,paraval) values('upgrade_url','http://172.28.43.252:9977/file/download');
+insert into "tb_businesspara" (parakey,paraval) values('upgrade_version','posa711dali-1.');
+INSERT INTO "tb_businesspara" (parakey,paraval) VALUES ('payapi.appid', '200001');
+INSERT INTO "tb_businesspara" (parakey,paraval) VALUES ('payapi.secret', 'dc1d26c0d43e442588092c8d45c21bce');
 
 
 CREATE SEQUENCE SEQ_REFNO
