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 2953097..5a3bb0c 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
@@ -171,18 +171,18 @@
             cardno = req.getCardno();
         }
 
-        TBusinesspara ignoreflag=businessparaDao.findByParakey("customer.ignore");
-        if(null!=(ignoreflag)&&"true".equalsIgnoreCase(ignoreflag.getParaval())){
-                tCard = cardService.getCardByCardno(cardno);
-                customer=customerService.getCustomerByCardno(cardno);
-                if(null==tCard||null==customer){
-                    logger.info("用户未在用户表中");
-                    QueryUserParam param=new QueryUserParam();
-                    param.setCitizencardno(cardno);
-                    UserInforResponse usrresp=userProxy.querybycardno(param);
+        TBusinesspara ignoreflag = businessparaDao.findByParakey("customer.ignore");
+        if (null != (ignoreflag) && "true".equalsIgnoreCase(ignoreflag.getParaval())) {
+            tCard = cardService.getCardByCardno(cardno);
+            customer = customerService.getCustomerByCardno(cardno);
+            if (null == tCard || null == customer) {
+                logger.info("用户未在用户表中");
+                QueryUserParam param = new QueryUserParam();
+                param.setCitizencardno(cardno);
+                UserInforResponse usrresp = userProxy.querybycardno(param);
 
-                    logger.info(usrresp.getRetcode()+"|||"+usrresp.getRetmsg());
-                    if(usrresp.getRetcode()==0){
+                logger.info(usrresp.getRetcode() + "|||" + usrresp.getRetmsg());
+                if (usrresp.getRetcode() == 0) {
 
                         /*CustomerSaveBean customer=new CustomerSaveBean();
                         customer.setCusttype(2);
@@ -197,57 +197,57 @@
                         customer.setStatus(RestaurantConstant.STATUS_CARD_NORMAL);
                         customer.setCheckstatus(RestaurantConstant.STATUS_CHECKSTATUS_NORMAL);
                         customerService.saveCustomer(customer);*/
-                        customer=new TCustomer();
-                        customer.setCusttype(2);
-                        customer.setLastsaved(DateUtil.getNow("yyyyMMddHHmmss"));
-                        customer.setPhone(usrresp.getPhone());
-                        customer.setCustname(usrresp.getUsername());
-                        customer.setIdno(usrresp.getIdno());
-                        customer.setIdtype(usrresp.getIdtype());
-                        customer.setStatus(RestaurantConstant.STATUS_CARD_NORMAL);
-                        customer.setCheckstatus(RestaurantConstant.STATUS_CHECKSTATUS_NORMAL);
+                    customer = new TCustomer();
+                    customer.setCusttype(2);
+                    customer.setLastsaved(DateUtil.getNow("yyyyMMddHHmmss"));
+                    customer.setPhone(usrresp.getPhone());
+                    customer.setCustname(usrresp.getUsername());
+                    customer.setIdno(usrresp.getIdno());
+                    customer.setIdtype(usrresp.getIdtype());
+                    customer.setStatus(RestaurantConstant.STATUS_CARD_NORMAL);
+                    customer.setCheckstatus(RestaurantConstant.STATUS_CHECKSTATUS_NORMAL);
 
-                        customer = customerDao.save(customer);
-                        if(null!=customer){
-                            String cardverno = systemUtilService.getCardverno();
-                            tCard=new TCard();
-                            tCard.setCardno(cardno);
-                            tCard.setOpendate(DateUtil.getNow("yyyyMMdd"));
-                            tCard.setCustid(customer.getCustid());
-                            tCard.setStatus(RestaurantConstant.STATUS_CARD_NORMAL);
-                            tCard.setTransstatus(RestaurantConstant.STATUS_CARD_NORMAL);
-                            if(null!=usrresp.getCardphyid()){
-                                tCard.setCardphyid(usrresp.getCardphyid());
-                            }
-                            tCard.setCardverno(cardverno);
-                            tCard.setBankcardno(usrresp.getBankcardno());
-                            tCard.setExpiredate(usrresp.getExpiredate());
-                            tCard = cardDao.save(tCard);
-
-                            TCardver tCardver = new TCardver();
-                            tCardver.setAccdate(DateUtil.getNow("yyyyMMdd"));
-                            tCardver.setCardno(tCard.getCardno());
-                            tCardver.setCardphyid(tCard.getCardphyid());
-                            tCardver.setAdderflag(1);
-                            tCardver.setOptype(RestaurantConstant.OPTYPE_CARD_OPEN);
-                            tCardver.setStatus(RestaurantConstant.STATUS_CARD_NORMAL);
-                            tCardver.setCustid(tCard.getCustid());
-                            tCardver.setCreatetime(DateUtil.getNow("yyyyMMddHHmmss"));
-                            tCardver.setCardverno(cardverno);
-                            cardverDao.save(tCardver);
-                        }else{
-                            resp.setRetcode(ErrorCode.ERRIF_CARD_NOTEXIST);
-                            resp.setRetmsg("保存客户出错");
-                            return resp;
+                    customer = customerDao.save(customer);
+                    if (null != customer) {
+                        String cardverno = systemUtilService.getCardverno();
+                        tCard = new TCard();
+                        tCard.setCardno(cardno);
+                        tCard.setOpendate(DateUtil.getNow("yyyyMMdd"));
+                        tCard.setCustid(customer.getCustid());
+                        tCard.setStatus(RestaurantConstant.STATUS_CARD_NORMAL);
+                        tCard.setTransstatus(RestaurantConstant.STATUS_CARD_NORMAL);
+                        if (null != usrresp.getCardphyid()) {
+                            tCard.setCardphyid(usrresp.getCardphyid());
                         }
+                        tCard.setCardverno(cardverno);
+                        tCard.setBankcardno(usrresp.getBankcardno());
+                        tCard.setExpiredate(usrresp.getExpiredate());
+                        tCard = cardDao.save(tCard);
 
-                    }else{
+                        TCardver tCardver = new TCardver();
+                        tCardver.setAccdate(DateUtil.getNow("yyyyMMdd"));
+                        tCardver.setCardno(tCard.getCardno());
+                        tCardver.setCardphyid(tCard.getCardphyid());
+                        tCardver.setAdderflag(1);
+                        tCardver.setOptype(RestaurantConstant.OPTYPE_CARD_OPEN);
+                        tCardver.setStatus(RestaurantConstant.STATUS_CARD_NORMAL);
+                        tCardver.setCustid(tCard.getCustid());
+                        tCardver.setCreatetime(DateUtil.getNow("yyyyMMddHHmmss"));
+                        tCardver.setCardverno(cardverno);
+                        cardverDao.save(tCardver);
+                    } else {
                         resp.setRetcode(ErrorCode.ERRIF_CARD_NOTEXIST);
-                        resp.setRetmsg("卡号[" + cardno + "]未在核心平台查询到");
+                        resp.setRetmsg("保存客户出错");
                         return resp;
                     }
+
+                } else {
+                    resp.setRetcode(ErrorCode.ERRIF_CARD_NOTEXIST);
+                    resp.setRetmsg("卡号[" + cardno + "]未在核心平台查询到");
+                    return resp;
                 }
-        }else{
+            }
+        } else {
 
             tCard = cardService.getCardByCardno(cardno);
             if (null == tCard) {
@@ -345,23 +345,47 @@
     }
 
     private Double getDiscountAmount(String termdate, String custid, Double amount, DiscountBean bean) {
-        Integer limit;
-        if(RestaurantConstant.RULEMODE_MONTH.equals(bean.getRulemode())){
-            limit=transDtlService.getDiscountLimitMonth(termdate.substring(0,6),custid,bean.getRuleid());
-        }else{
-            limit=transDtlService.getDiscountLimitToday(termdate,custid,bean.getRuleid());
-        }
-
-        if (bean.getLimitcnt() > limit) {
-
-            if (RestaurantConstant.RULETYPE_REDUCTION.equals(bean.getRuletype())) {
-                amount = amount - bean.getAmount();
-            } else if (RestaurantConstant.RULETYPE_DISCOUNT.equals(bean.getRuletype())) {
-                amount = amount * (bean.getAmount() / 10);
-            } else if (RestaurantConstant.RULETYPE_QUOTA.equals(bean.getRuletype())) {
-                BigDecimal amt = BigDecimal.valueOf(bean.getAmount());
-                amount = amt.doubleValue();
+        Integer discount_cnt;
+        Integer limit = bean.getLimitcnt();
+        boolean monthflag = RestaurantConstant.RULEMODE_MONTH.equals(bean.getRulemode());
+        try {
+            if (monthflag) {
+                logger.info("按月计费");
+                discount_cnt = transDtlService.getDiscountLimitMonth(termdate.substring(0, 6), custid, bean.getRuleid());
+            } else {
+                discount_cnt = transDtlService.getDiscountLimitToday(termdate, custid, bean.getRuleid());
             }
+
+            if (limit > discount_cnt) {
+                if (monthflag) {
+                    TBusinesspara cntflag = businessparaDao.findByParakey("discounttime.month");
+                    Integer i = 0;
+                    if (null != cntflag) {
+                        String value = cntflag.getParaval();
+                        if (!StringUtil.isEmpty(value)) {
+                            i = Integer.parseInt(value);
+                        }
+                    }
+                    if (i > 0) {
+                        Integer daycnt=transDtlService.getDiscountLimitTodayWithPeriod(termdate,custid,bean.getRuleid(),bean.getStarttime(),bean.getEndtime());
+                        if(daycnt>=i){
+                            return amount;
+                        }
+                    }
+                }
+
+                if (RestaurantConstant.RULETYPE_REDUCTION.equals(bean.getRuletype())) {
+                    amount = amount - bean.getAmount();
+                } else if (RestaurantConstant.RULETYPE_DISCOUNT.equals(bean.getRuletype())) {
+                    amount = amount * (bean.getAmount() / 10);
+                } else if (RestaurantConstant.RULETYPE_QUOTA.equals(bean.getRuletype())) {
+                    BigDecimal amt = BigDecimal.valueOf(bean.getAmount());
+                    amount = amt.doubleValue();
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return amount;
         }
         return amount;
     }
@@ -392,16 +416,18 @@
             return resp;
         }
         Double amount = req.getAmount() / 100.0;
-        Double cntamount=0.0;
-        logger.info("交易号："+tTransdtl.getBillno()+",,,交易金额："+req.getAmount());
+        Double cntamount = 0.0;
+        logger.info("交易号：" + tTransdtl.getBillno() + ",,,交易金额：" + req.getAmount());
         DiscountBean bean = deviceDiscountRuleService.getCustomerDiscount(tDevice.getId(), req.getTermtime(), cus.getCustid());
         if (null != bean) {
-            tTransdtl.setRuleid(bean.getRuleid());
             cntamount = getDiscountAmount(req.getTermdate(), cus.getCustid(), amount, bean);
-            tTransdtl.setManagefee(amount-cntamount);
+            if(cntamount!=amount){
+                tTransdtl.setRuleid(bean.getRuleid());
+            }
+            tTransdtl.setManagefee(amount - cntamount);
             tTransdtl.setManagefeetype(bean.getRuletype());
             tTransdtl.setAmount(cntamount);
-        }else{
+        } else {
             tTransdtl.setManagefeetype(RestaurantConstant.RULETYPE_NORMAL);
             tTransdtl.setAmount(amount);
             tTransdtl.setManagefee(cntamount);
@@ -414,10 +440,10 @@
         } else {
             group = deviceParamService.getDevparaGroupByGroupid(bind.getGroupid());
         }
-        TDevpara para=deviceParamService.getDevparaInfoByParaname(group.getGroupid(),"once_limit_amt");
-        if(null!=para||StringUtil.isEmpty(para.getParaval())){
-            Double oncelimit=Double.parseDouble(para.getParaval())/100;
-            if(amount>oncelimit&&cntamount>oncelimit){
+        TDevpara para = deviceParamService.getDevparaInfoByParaname(group.getGroupid(), "once_limit_amt");
+        if (null != para || StringUtil.isEmpty(para.getParaval())) {
+            Double oncelimit = Double.parseDouble(para.getParaval()) / 100;
+            if (amount > oncelimit && cntamount > oncelimit) {
                 resp.setRetcode("99");
                 resp.setRetmsg("消费金额超出单笔消费限额");
                 return resp;
@@ -836,8 +862,8 @@
                 cardno = qrcoderesp.getCitycardno();
                 cardphyid = qrcoderesp.getCardphyid();
             } else {
-                cardno="";
-                cardphyid="";
+                cardno = "";
+                cardphyid = "";
             }
         } else {
             cardno = req.getCardno();
@@ -856,8 +882,11 @@
                 transDtl.setCustname(customer.getCustname());
                 DiscountBean bean = deviceDiscountRuleService.getCustomerDiscount(device.getId(), req.getTranstime(), customer.getCustid());
                 if (null != bean) {
-                    transDtl.setRuleid(bean.getRuleid());
-                    amount = getDiscountAmount(req.getTransdate(), customer.getCustid(), amount, bean);
+
+                    Double discountedamt = getDiscountAmount(req.getTransdate(), customer.getCustid(), amount, bean);
+                    if(discountedamt!=amount){
+                        transDtl.setRuleid(bean.getRuleid());
+                    }
                 }
             }
         }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/bean/DiscountBean.java b/src/main/java/com/supwisdom/dlpay/restaurant/bean/DiscountBean.java
index 3b5ad3e..20ae7a9 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/bean/DiscountBean.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/bean/DiscountBean.java
@@ -7,17 +7,21 @@
     private Double amount;
     private Integer ruleid;
     private String rulemode;
+    private String starttime;
+    private String endtime;
 
     public DiscountBean(){
 
     }
 
-    public DiscountBean(String ruletype, Integer limitcnt, Double amount, Integer ruleid, String rulemode) {
+    public DiscountBean(String ruletype, Integer limitcnt, Double amount, Integer ruleid, String rulemode, String starttime, String endtime) {
         this.ruletype = ruletype;
         this.limitcnt = limitcnt;
         this.amount = amount;
         this.ruleid = ruleid;
         this.rulemode = rulemode;
+        this.starttime = starttime;
+        this.endtime = endtime;
     }
 
     public Integer getRuleid() {
@@ -59,4 +63,20 @@
     public void setRulemode(String rulemode) {
         this.rulemode = rulemode;
     }
+
+    public String getStarttime() {
+        return starttime;
+    }
+
+    public void setStarttime(String starttime) {
+        this.starttime = starttime;
+    }
+
+    public String getEndtime() {
+        return endtime;
+    }
+
+    public void setEndtime(String endtime) {
+        this.endtime = endtime;
+    }
 }
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 5df3122..45981ec 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/dao/TransDtlDao.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/dao/TransDtlDao.java
@@ -49,9 +49,19 @@
 
     Integer countByAccdateAndCustidAndRuleid(String accdate,String custid,Integer ruleid);
 
-    @Query(value = "select count(refno) from tb_transdtl where substr(accdate,1,6)=?1 and custid=?2 and ruleid=?3",nativeQuery = true)
+    @Query(value = "select count(refno) from tb_transdtl where substr(accdate,1,6)=?1" +
+            " and custid=?2 and ruleid=?3",nativeQuery = true)
     Integer countTrandtlByAccdateAndCustidAndRuleidWithMonth(String accdate,String custid,Integer ruleid);
 
+    @Query(value = "select count(refno) from tb_transdtl where substr(accdate,1,6)=?1" +
+            " and custid=?2 and ruleid=?3 and substr(acctime,1,4) BETWEEN ?4 and ?5",nativeQuery = true)
+    Integer countTrandtlByAccdateAndCustidAndRuleidWithMonthAndPeriod(String accdate,String custid,Integer ruleid,String starttime,String endtime);
+
+    @Query(value = "select count(refno) from tb_transdtl where accdate=?1" +
+            " and custid=?2 and ruleid=?3 and substr(acctime,1,4) BETWEEN ?4 and ?5",nativeQuery = true)
+    Integer countTrandtlByAccdateAndCustidAndRuleidWithPeriod(String accdate,String custid,Integer ruleid,String starttime,String endtime);
+
+
     @Query("select min(accdate) from TTransDtl")
     String getMinTransdate();
 
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 35e48fd..af06e93 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/TransDtlService.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/TransDtlService.java
@@ -55,5 +55,11 @@
     Integer getDiscountLimitToday(String termdate,String custid,Integer ruleid);
 
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+    Integer getDiscountLimitTodayWithPeriod(String termdate,String custid,Integer ruleid,String starttime,String endtime);
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
     Integer getDiscountLimitMonth(String termdate,String custid,Integer ruleid);
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+    Integer getDiscountLimitMonthWithPeriod(String termdate,String custid,Integer ruleid,String starttime,String endtime);
 }
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 d0098f2..7d6a6db 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
@@ -400,7 +400,7 @@
 
     @Override
     public DiscountBean getCustomerDiscount(Integer deviceid, String termtime, String custid) {
-        StringBuffer sql = new StringBuffer("select d.limitcnt,d.ruletype,d.amount,d.ruleid from  tb_discount_rule d " +
+        StringBuffer sql = new StringBuffer("select d.limitcnt,d.ruletype,d.amount,d.ruleid,d.starttime,d.endtime,d.rulemode from  tb_discount_rule d " +
                 "left join tb_discount_devbind t on t.ruleid=d.ruleid " +
                 "left join tb_discount_detail c on t.ruleid=c.ruleid " +
                 "where d.status='normal' and t.deviceid=:deviceid " +
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 a8731bc..00c5ad9 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
@@ -300,9 +300,19 @@
     }
 
     @Override
+    public Integer getDiscountLimitTodayWithPeriod(String termdate, String custid, Integer ruleid, String starttime, String endtime) {
+        return transDtlDao.countTrandtlByAccdateAndCustidAndRuleidWithPeriod(termdate,custid,ruleid,starttime,endtime);
+    }
+
+    @Override
     public Integer getDiscountLimitMonth(String termdate, String custid, Integer ruleid) {
         return transDtlDao.countTrandtlByAccdateAndCustidAndRuleidWithMonth(termdate,custid,ruleid);
     }
 
+    @Override
+    public Integer getDiscountLimitMonthWithPeriod(String termdate, String custid, Integer ruleid, String starttime, String endtime) {
+        return transDtlDao.countTrandtlByAccdateAndCustidAndRuleidWithMonthAndPeriod(termdate,custid,ruleid,starttime,endtime);
+    }
+
 
 }
diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql
index 6d69446..aafc754 100644
--- a/src/main/resources/data.sql
+++ b/src/main/resources/data.sql
@@ -511,6 +511,7 @@
 INSERT INTO "tb_businesspara" (parakey,paraval) VALUES ('payapi.appid', '200001');
 INSERT INTO "tb_businesspara" (parakey,paraval) VALUES ('payapi.secret', 'dc1d26c0d43e442588092c8d45c21bce');
 INSERT INTO "tb_businesspara" (parakey,paraval) VALUES ('customer.ignore', 'false');
+INSERT INTO "tb_businesspara" (parakey,paraval) VALUES ('discounttime.month', '0');
 
 
 CREATE SEQUENCE SEQ_REFNO
