增加了设备请求API接口
diff --git a/src/main/kotlin/com/supwisdom/dlpay/water/api_request_param.kt b/src/main/kotlin/com/supwisdom/dlpay/water/api_request_param.kt
new file mode 100644
index 0000000..9ac3ca6
--- /dev/null
+++ b/src/main/kotlin/com/supwisdom/dlpay/water/api_request_param.kt
@@ -0,0 +1,136 @@
+package com.supwisdom.dlpay.water
+
+import com.supwisdom.dlpay.exception.RequestParamCheckException
+import com.supwisdom.dlpay.framework.util.APIRequestParam
+import com.supwisdom.dlpay.framework.util.DateUtil
+import com.supwisdom.dlpay.framework.util.Sign
+import com.supwisdom.dlpay.framework.util.TradeErrorCode
+
+class DeviceLoginParam : APIRequestParam() {
+    @Sign
+    var deviceNo: String = ""
+
+    @Sign
+    var deviceDate: String = ""
+
+    @Sign
+    var deviceTime: String = ""
+
+    override fun checkParam(): Boolean {
+        if (deviceNo.length != 8 || deviceNo.any { it !in '0'..'9' }) {
+            throw RequestParamCheckException(TradeErrorCode.INPUT_DATA_ERROR, "设备ID号长度不符")
+        }
+
+        if (!DateUtil.checkDatetimeValid(deviceDate, DateUtil.DATE_FMT)
+                || !DateUtil.checkDatetimeValid(deviceTime, DateUtil.TIME_FMT)) {
+            throw RequestParamCheckException(TradeErrorCode.INPUT_DATA_ERROR, "设备日期时间错误")
+        }
+        return true
+    }
+}
+
+class DeviceLineCheckParam : APIRequestParam() {
+    @Sign
+    var deviceNo: String = ""
+
+    @Sign
+    var deviceDate: String = ""
+
+    @Sign
+    var deviceTime: String = ""
+
+    @Sign
+    var offlineRecordCount: Int = 0
+
+    override fun checkParam(): Boolean {
+        if (deviceNo.length != 8 || deviceNo.any { it !in '0'..'9' }) {
+            throw RequestParamCheckException(TradeErrorCode.INPUT_DATA_ERROR, "设备ID号长度不符")
+        }
+
+        if (!DateUtil.checkDatetimeValid(deviceDate, DateUtil.DATE_FMT)
+                || !DateUtil.checkDatetimeValid(deviceTime, DateUtil.TIME_FMT)) {
+            throw RequestParamCheckException(TradeErrorCode.INPUT_DATA_ERROR, "设备日期时间错误")
+        }
+        return true
+    }
+
+}
+
+class CardPayRequest : APIRequestParam() {
+    @Sign
+    var deviceNo: String = ""
+
+    @Sign
+    var deviceDate: String = ""
+
+    @Sign
+    var deviceTime: String = ""
+
+    @Sign
+    var cardNo: String = ""
+
+    override fun checkParam(): Boolean {
+        if (deviceNo.length != 8 || deviceNo.any { it !in '0'..'9' }) {
+            throw RequestParamCheckException(TradeErrorCode.INPUT_DATA_ERROR, "设备ID号长度不符")
+        }
+
+        if (!DateUtil.checkDatetimeValid(deviceDate, DateUtil.DATE_FMT)
+                || !DateUtil.checkDatetimeValid(deviceTime, DateUtil.TIME_FMT)) {
+            throw RequestParamCheckException(TradeErrorCode.INPUT_DATA_ERROR, "设备日期时间错误")
+        }
+
+        if (cardNo.isEmpty()) {
+            throw RequestParamCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+                    "卡号长度错误")
+        }
+        return true
+    }
+}
+
+class QrcodePayRequest : APIRequestParam() {
+    @Sign
+    var deviceNo: String = ""
+
+    @Sign
+    var deviceDate: String = ""
+
+    @Sign
+    var deviceTime: String = ""
+
+    override fun checkParam(): Boolean {
+        if (deviceNo.length != 8 || deviceNo.any { it !in '0'..'9' }) {
+            throw RequestParamCheckException(TradeErrorCode.INPUT_DATA_ERROR, "设备ID号长度不符")
+        }
+
+        if (!DateUtil.checkDatetimeValid(deviceDate, DateUtil.DATE_FMT)
+                || !DateUtil.checkDatetimeValid(deviceTime, DateUtil.TIME_FMT)) {
+            throw RequestParamCheckException(TradeErrorCode.INPUT_DATA_ERROR, "设备日期时间错误")
+        }
+
+        return true
+    }
+}
+
+class UploadRecordRequest : APIRequestParam() {
+    @Sign
+    var deviceNo: String = ""
+
+    @Sign
+    var deviceDate: String = ""
+
+    @Sign
+    var deviceTime: String = ""
+
+    override fun checkParam(): Boolean {
+        if (deviceNo.length != 8 || deviceNo.any { it !in '0'..'9' }) {
+            throw RequestParamCheckException(TradeErrorCode.INPUT_DATA_ERROR, "设备ID号长度不符")
+        }
+
+        if (!DateUtil.checkDatetimeValid(deviceDate, DateUtil.DATE_FMT)
+                || !DateUtil.checkDatetimeValid(deviceTime, DateUtil.TIME_FMT)) {
+            throw RequestParamCheckException(TradeErrorCode.INPUT_DATA_ERROR, "设备日期时间错误")
+        }
+
+        return true
+    }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..d3988f4
--- /dev/null
+++ b/src/main/kotlin/com/supwisdom/dlpay/water/controller/api_controller.kt
@@ -0,0 +1,33 @@
+package com.supwisdom.dlpay.water.controller
+
+import com.supwisdom.dlpay.water.*
+import org.springframework.http.ResponseEntity
+import org.springframework.web.bind.annotation.*
+
+@RestController("/api")
+class WaterApiController {
+    @GetMapping("/login")
+    fun deviceLogin(@RequestBody param: DeviceLoginParam): ResponseEntity<Any> {
+        TODO("")
+    }
+
+    @RequestMapping("/linecheck", method = [RequestMethod.GET, RequestMethod.POST])
+    fun deviceLineCheck(@RequestBody param: DeviceLineCheckParam): ResponseEntity<Any> {
+        TODO("")
+    }
+
+    @PostMapping("/card/purseinit")
+    fun cardPurseInit(@RequestBody param: CardPayRequest): ResponseEntity<Any> {
+        TODO("")
+    }
+
+    @PostMapping("/qrcode/init")
+    fun qrcodePayInit(@RequestBody param: QrcodePayRequest): ResponseEntity<Any> {
+        TODO("")
+    }
+
+    @PostMapping("/uploadrecord")
+    fun transdtlUpload(@RequestBody param: UploadRecordRequest): ResponseEntity<Any> {
+        TODO("")
+    }
+}
\ No newline at end of file