完善二维码消费接口
diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/WaterDeviceParam.java b/src/main/java/com/supwisdom/dlpay/framework/util/WaterDeviceParam.java
index 8ad1e25..a4950b9 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/WaterDeviceParam.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/WaterDeviceParam.java
@@ -33,4 +33,11 @@
     public static final String paidAmount = "paidAmount";
     //  立即扣费阈值
     public static final String imdDecThreshold = "imdDecThreshold";
+    //  允许未入账金额
+    public static final String permitNotAccAmount = "permitNotAccAmount";
+    //  是否允许消费
+    public static final String permit = "permit";
+    //  限制消费信息
+    public static final String limitMsg = "limitmsg";
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/UserDataService.java b/src/main/java/com/supwisdom/dlpay/system/service/UserDataService.java
index 0a8bad2..918cb87 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/UserDataService.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/UserDataService.java
@@ -53,4 +53,6 @@
 
     @Transactional(rollbackFor = Exception.class, readOnly = true)
     PageResult<UserAccountDTO> queryUserAccByParam(UserAccountSearchBean param);
+
+    double subtract(Double minuend, Double subtractor);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/impl/UserDataServiceImpl.java b/src/main/java/com/supwisdom/dlpay/system/service/impl/UserDataServiceImpl.java
index 18e921c..fa55c34 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/impl/UserDataServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/impl/UserDataServiceImpl.java
@@ -249,7 +249,7 @@
         return new PageResult<>(count.longValue(), list);
     }
 
-    private double subtract(Double minuend,Double subtractor){
+    public double subtract(Double minuend,Double subtractor){
         return new BigDecimal(String.valueOf(minuend))
                 .subtract(new BigDecimal(String.valueOf(subtractor)))
                 .doubleValue();
diff --git a/src/main/kotlin/com/supwisdom/dlpay/water/controller/api_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/water/controller/api_controller.kt
index 58d4175..145ad01 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/water/controller/api_controller.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/water/controller/api_controller.kt
@@ -15,6 +15,7 @@
 import com.supwisdom.dlpay.water.service.CollectdtlService
 import mu.KotlinLogging
 import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.http.HttpRequest
 import org.springframework.http.ResponseEntity
 import org.springframework.web.bind.annotation.*
 import org.springframework.web.servlet.ModelAndView
@@ -101,8 +102,20 @@
                 return ResponseEntity.ok(ResponseBodyBuilder.create()
                         .fail(WaterErrorCode.DATA_NOTFOUND_ERROR, "物理卡号不匹配"))
             }
+//            val notaccAmount = userDataService.subtract(personIdentity.coamount, personIdentity.accamount)
             //2. 通过 deviceno 查询设备费率参数
             val deviceParam = deviceService.getParaMapByDeviceno(param.deviceno)
+//            if (notaccAmount > deviceParam[WaterDeviceParam.permitNotAccAmount]!!.toInt()) {
+//                return ResponseEntity.ok(ResponseBodyBuilder.create()
+//                        .data(WaterDeviceParam.cobillNo, "")
+//                        .data(WaterDeviceParam.feeAmount, "")
+//                        .data(WaterDeviceParam.waterLimit, "")
+//                        .data(WaterDeviceParam.feestart, "")
+//                        .data(WaterDeviceParam.feeUnit, "")
+//                        .data(WaterDeviceParam.permit, 1)
+//                        .data(WaterDeviceParam.limitMsg,"限制消费!未扣费金额过多")
+//                        .success())
+//            }
             //3. 创建 collectdtl 记录初始流水
             val trans = TCollectdtl().apply {
                 mode = TradeDict.PAY_MODE_CARD
@@ -126,6 +139,8 @@
                     .data(WaterDeviceParam.waterLimit, deviceParam[WaterDeviceParam.waterLimit]!!)
                     .data(WaterDeviceParam.feestart, deviceParam[WaterDeviceParam.feestart]!!)
                     .data(WaterDeviceParam.feeUnit, deviceParam[WaterDeviceParam.feeUnit]!!)
+//                    .data(WaterDeviceParam.permit, 0)
+//                    .data(WaterDeviceParam.limitMsg,"")
                     .success())
         } catch (ex: Exception) {
             return ResponseEntity.ok(ResponseBodyBuilder.create()
@@ -174,6 +189,28 @@
             if (trans.authStatus) {
                 authStatus = 1
             }
+//            if (authStatus == 1) {
+//                val personIdentity = userDataService.getPersonIdentityByThirdUid(trans.citizenCardno)
+//                        ?: return ResponseEntity.ok(ResponseBodyBuilder.create()
+//                                .fail(WaterErrorCode.DATA_NOTFOUND_ERROR, "未查询到您的身份信息"))
+//                val notaccAmount = userDataService.subtract(personIdentity.coamount, personIdentity.accamount)
+//                if (notaccAmount > deviceParam[WaterDeviceParam.permitNotAccAmount]!!.toInt()) {
+//                    return ResponseEntity.ok(ResponseBodyBuilder.create()
+//                            .data(WaterDeviceParam.cobillNo, "")
+//                            .data(WaterDeviceParam.authStatus, "")
+//                            //2为代扣模式
+//                            .data(WaterDeviceParam.payStatus, "")
+//                            .data(WaterDeviceParam.waterLimit, "")
+//                            .data(WaterDeviceParam.feeAmount, "")
+//                            .data(WaterDeviceParam.feestart, "")
+//                            .data(WaterDeviceParam.feeUnit, "")
+//                            //  如果订单为已支付状态,支付金额多少
+//                            .data(WaterDeviceParam.paidAmount, "")
+//                            .data(WaterDeviceParam.permit, 1)
+//                            .data(WaterDeviceParam.limitMsg,"限制消费!未扣费金额过多")
+//                            .success())
+//                }
+//            }
             return ResponseEntity.ok(ResponseBodyBuilder.create()
                     .data(WaterDeviceParam.cobillNo, trans.cobillno)
                     .data(WaterDeviceParam.authStatus, authStatus)
@@ -185,6 +222,8 @@
                     .data(WaterDeviceParam.feeUnit, deviceParam[WaterDeviceParam.feeUnit]!!)
                     //  如果订单为已支付状态,支付金额多少
                     .data(WaterDeviceParam.paidAmount, 0)
+//                    .data(WaterDeviceParam.permit, 0)
+//                    .data(WaterDeviceParam.limitMsg,"")
                     .success())
         } catch (ex: Exception) {
             return ResponseEntity.ok(ResponseBodyBuilder.create()
@@ -197,32 +236,43 @@
      */
     @GetMapping("/qrcode/pretend")
     fun confirmView(@RequestParam("cobillno") cobillno: Int,
-                    @RequestParam("userid") userid: String): ModelAndView {
+                    @RequestParam("userid") userid: String?): ModelAndView {
         try {
+            if (userid == null) {
+                return ModelAndView("error/500").addObject("errorMsg","用户id不能为空")
+            }
             val userInfo = userProxy.querybycardno(QueryUserParam().apply {
                 this.userid = userid
             })
             if (userInfo.retcode != 0) {
                 logger.error { "获取用户${userid}信息失败,错误信息:${userInfo.retmsg}" }
-                return ModelAndView("/error/500").addObject("errorMsg", "用户信息异常")
+                return ModelAndView("error/500").addObject("errorMsg", "用户信息异常")
             }
             if (userInfo.cardstatus != TradeDict.STATUS_NORMAL || userInfo.transstatus != TradeDict.STATUS_NORMAL) {
-                return ModelAndView("/error/500").addObject("errorMsg", "用户消费状态异常")
+                return ModelAndView("error/500").addObject("errorMsg", "用户消费状态异常")
             }
             val collectDtl = collectdtlService.pretendAsCard(userInfo, cobillno)
+//            val deviceParam = deviceService.getParaMapByDeviceno(collectDtl.deviceno)
+//            val personIdentity = userDataService.getPersonIdentityByThirdUid(userInfo.cardno)
+//                    ?:  return ModelAndView("error/500").addObject("errorMsg", "未查询到您的身份信息")
+//            val notaccAmount = userDataService.subtract(personIdentity.coamount, personIdentity.accamount)
+//            if (notaccAmount > deviceParam[WaterDeviceParam.permitNotAccAmount]!!.toInt()) {
+//                return ModelAndView("error/500").
+//                        addObject("errorMsg", "你的未入账金额为${notaccAmount},已超过最大限额:${deviceParam[WaterDeviceParam.permitNotAccAmount]!!.toInt()}")
+//            }
             if (collectDtl.status != TradeDict.DTL_STATUS_INIT) {
-                return ModelAndView("/error/500").addObject("errorMsg", "流水状态异常")
+                return ModelAndView("error/500").addObject("errorMsg", "流水状态异常")
             }
             val device = deviceService.queryDeviceByDeviceno(collectDtl.deviceno)
-                    ?: return ModelAndView("/error/500").addObject("errorMsg", "设备信息异常")
+                    ?: return ModelAndView("error/500").addObject("errorMsg", "设备信息异常")
             val area = areaService.findByAreaNo(device.areano)
-                    ?: return ModelAndView("/error/500").addObject("errorMsg", "区域信息异常")
+                    ?: return ModelAndView("error/500").addObject("errorMsg", "区域信息异常")
             return ModelAndView("system/start/start").
                     addObject("devicename", device.devicename).
                     addObject("areaname",area.areaName)
         } catch (e: Exception) {
             logger.error { e.message }
-            return ModelAndView("/error/500")
+            return ModelAndView("error/500")
         }
     }
 
@@ -255,11 +305,13 @@
         //  流水是否重复上传
         if (!querycodtl.uploadStatus) {
             val dtl = collectdtlService.saveDeviceDtlData(param)
-            userDataService.updateCoamount(dtl.citizenCardno, param.amount / 100.0)
-            //  是否立即扣费
-            if (param.amount >= deviceService.getParaMapByDeviceno(param.deviceno)[WaterDeviceParam.imdDecThreshold]!!.toInt()) {
-                //  立即异步扣费
-                waterPayAsyncTask.waterPay(querycodtl.cobillno)
+            if (dtl.status == TradeDict.DTL_STATUS_WIP) {
+                userDataService.updateCoamount(dtl.citizenCardno, param.amount / 100.0)
+                //  是否立即扣费
+                if (param.amount >= deviceService.getParaMapByDeviceno(param.deviceno)[WaterDeviceParam.imdDecThreshold]!!.toInt()) {
+                    //  立即异步扣费
+                    waterPayAsyncTask.waterPay(querycodtl.cobillno)
+                }
             }
             return ResponseEntity.ok(ResponseBodyBuilder.create().data(WaterDeviceParam.cobillNo, dtl.cobillno)
                     .success())
@@ -267,4 +319,11 @@
         return ResponseEntity.ok(ResponseBodyBuilder.create().data(WaterDeviceParam.cobillNo, querycodtl.cobillno)
                 .success())
     }
+
+    @GetMapping("/test")
+    fun test(request:HttpRequest): ResponseEntity<Any> {
+        request.uri
+        return ResponseEntity.ok(ResponseBodyBuilder.create().data("test","test")
+                .success())
+    }
 }
\ No newline at end of file
diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql
index 079f943..0977d6a 100644
--- a/src/main/resources/data.sql
+++ b/src/main/resources/data.sql
@@ -111,6 +111,8 @@
 INSERT INTO "tb_areapara"("paraname", "groupid", "maxval", "minval", "paradesc", "paraval", "valtype") VALUES ('waterlimit', 1, '500', '1', '单次用水上限(单位:百毫升)', '300', 'N');
 INSERT INTO "tb_areapara"("paraname", "groupid", "maxval", "minval", "paradesc", "paraval", "valtype") VALUES ('validtime', 1, '240', '60', '二维码有效时间(单位:秒)', '180', 'N');
 INSERT INTO "tb_areapara"("paraname", "groupid", "maxval", "minval", "paradesc", "paraval", "valtype") VALUES ('imdDecThreshold', 1, '500', '1', '流水上传立即扣费阈值(单位:分)', '50', 'N');
+INSERT INTO "tb_areapara"("paraname", "groupid", "maxval", "minval", "paradesc", "paraval", "valtype") VALUES ('permitNotAccAmount', 1, '200', '1', '允许未入账金额(单位:元)', '50', 'N');
+