消费规则添加按月按次
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