增加了二维码消费扣费功能
diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/ShortURLUtil.java b/src/main/java/com/supwisdom/dlpay/framework/util/ShortURLUtil.java
index f4ed735..c2246b2 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/ShortURLUtil.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/ShortURLUtil.java
@@ -2,14 +2,16 @@
 
 import com.supwisdom.dlpay.framework.service.BusinessparaService;
 import net.sf.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import java.io.BufferedReader;
 import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
 import java.net.HttpURLConnection;
 import java.net.URL;
-import java.net.URLEncoder;
 
 @Component
 public class ShortURLUtil {
@@ -17,7 +19,87 @@
     @Autowired
     private BusinessparaService businessparaService;
 
-    public String doGetSinaShortUrl(String longUrl) {
+    private static final Logger logger = LoggerFactory.getLogger(ShortURLUtil.class);
+
+    public String doGetShortUrl(String longUrl) {
+        return doGetBaiduShortUrl(longUrl);
+    }
+
+    public String doGetBaiduShortUrl(String longUrl) {
+        String shortUrlService = businessparaService.findByParakey(WaterBudinessConstants.WATER_SHORTURL_BAIDU).getParaval(); //https://dwz.cn/admin/v2/create
+        String baiduToken = businessparaService.findByParakey(WaterBudinessConstants.WATER_SHORTURL_BAIDU_TOKEN).getParaval(); //由数字和字母组成的32位字符,注册申请
+        if (StringUtil.isEmpty(shortUrlService) || StringUtil.isEmpty(baiduToken)) {
+            logger.error("百度水控短地址生成服务器参数未配置!");
+            return null;
+        }
+
+        String termOfValidity = "1-year";
+        String params = "{\"Url\":\"" + longUrl + "\",\"TermOfValidity\":\"" + termOfValidity + "\"}";
+
+        BufferedReader reader = null;
+        try {
+            // 创建连接
+            URL url = new URL(shortUrlService);
+            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+            connection.setDoOutput(true);
+            connection.setDoInput(true);
+            connection.setUseCaches(false);
+            connection.setInstanceFollowRedirects(true);
+            connection.setRequestMethod("POST"); // 设置请求方式
+            connection.setRequestProperty("Content-Type", "application/json"); // 设置发送数据的格式
+            connection.setRequestProperty("Token", baiduToken); // 设置发送数据的格式");
+            connection.setConnectTimeout(3000);
+            connection.setReadTimeout(3000);
+
+            // 发起请求
+            connection.connect();
+            OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(), "UTF-8"); // utf-8编码
+            out.append(params);
+            out.flush();
+            out.close();
+
+            // 读取响应
+            reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
+            String line;
+            String result = "";
+            while ((line = reader.readLine()) != null) {
+                result += line;
+            }
+            reader.close();
+            //      {
+            //          "Code": 0,
+            //          "ShortUrl": "https://dwz.cn/de3rp2Fl",
+            //          "LongUrl": "http://www.baidu.com",
+            //          "ErrMsg": ""
+            //      }
+            logger.info("Baidu shortUrl origin LongUrl=[" + longUrl + "], return=[" + result + "]");
+            if (StringUtil.isEmpty(result)) {
+                logger.error("百度短网址返回为空!!!");
+                return null;
+            }
+            JSONObject json = JSONObject.fromObject(result);
+            if (json.has("Code") && json.getInt("Code") == 0) {
+                logger.info("百度短地址生成成功!LongUrl=[" + longUrl + "],ShortUrl=[" + json.getString("ShortUrl") + "]");
+                return json.getString("ShortUrl");
+            } else {
+                logger.error("短地址生成失败!!!" + json.getString("ErrMsg"));
+                return null;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        } finally {
+            try {
+                if (null != reader) {
+                    reader.close();
+                }
+            } catch (Exception ex) {
+                ex.printStackTrace();
+            }
+        }
+    }
+
+    /*private String doGetSinaShortUrl(String longUrl) {
         String result = "";
         BufferedReader in = null;
         try {
@@ -50,5 +132,5 @@
                 e.printStackTrace();
             }
         }
-    }
+    }*/
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/WaterBudinessConstants.java b/src/main/java/com/supwisdom/dlpay/framework/util/WaterBudinessConstants.java
index ea2a198..df2419d 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/WaterBudinessConstants.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/WaterBudinessConstants.java
@@ -2,7 +2,8 @@
 
 public class WaterBudinessConstants {
     public final static String waterAuthUrl = "water_auth_url";
-    public final static String waterSinaShortUrl = "water_sina_shorturl";
+    public final static String WATER_SHORTURL_BAIDU = "water_shorturl_baidu";
+    public final static String WATER_SHORTURL_BAIDU_TOKEN = "water_shorturl_baidu_token";
     public final static String WATER_SHOP_ACCNO = "water_shopaccno";
     public final static String WATER_APPID = "water_appid";
     public final static String WATER_SECRET = "water_secret";
diff --git a/src/main/java/com/supwisdom/dlpay/water/pay/WaterPayAsyncTask.java b/src/main/java/com/supwisdom/dlpay/water/pay/WaterPayAsyncTask.java
index 73d8e69..d5f60d1 100644
--- a/src/main/java/com/supwisdom/dlpay/water/pay/WaterPayAsyncTask.java
+++ b/src/main/java/com/supwisdom/dlpay/water/pay/WaterPayAsyncTask.java
@@ -57,7 +57,7 @@
         if (TradeDict.PAY_MODE_CARD.equals(collectdtl.getMode())) {
             waterCardPay(collectdtl);
         } else if (TradeDict.PAY_MODE_QRCODE.equals(collectdtl.getMode())) {
-
+            waterCardPay(collectdtl);   //刷码暂时使用刷卡扣费模式
         } else {
             logger.error("暂不支持的消费类型");
         }
diff --git a/src/main/java/com/supwisdom/dlpay/water/service/AreaService.java b/src/main/java/com/supwisdom/dlpay/water/service/AreaService.java
index 680b94b..d2b7c2f 100644
--- a/src/main/java/com/supwisdom/dlpay/water/service/AreaService.java
+++ b/src/main/java/com/supwisdom/dlpay/water/service/AreaService.java
@@ -41,4 +41,7 @@
 
   @Transactional(rollbackFor = Exception.class,readOnly = true)
   PageResult<TArea> queryAreaByAreaNo(Integer areano);
+
+  @Transactional(rollbackFor = Exception.class,readOnly = true)
+  TArea findByAreaNo(Integer areano);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/water/service/CollectdtlService.java b/src/main/java/com/supwisdom/dlpay/water/service/CollectdtlService.java
index 58bfa28..47c7398 100644
--- a/src/main/java/com/supwisdom/dlpay/water/service/CollectdtlService.java
+++ b/src/main/java/com/supwisdom/dlpay/water/service/CollectdtlService.java
@@ -1,8 +1,9 @@
 package com.supwisdom.dlpay.water.service;
 
+import com.supwisdom.dlpay.api.bean.UserInforResponse;
 import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.water.StartWaterRequest;
 import com.supwisdom.dlpay.water.UploadRecordRequest;
-import com.supwisdom.dlpay.water.UserAuthRequest;
 import com.supwisdom.dlpay.water.bean.TransdtlCountSearchBean;
 import com.supwisdom.dlpay.water.domain.TCollectdtl;
 import com.supwisdom.dlpay.water.pojo.TCollectdtlDTO;
@@ -24,7 +25,10 @@
     TCollectdtl queryTrans(Integer cobillno);
 
     @Transactional(rollbackFor = Exception.class)
-    TCollectdtl userAuth(UserAuthRequest param);
+    TCollectdtl startWater(StartWaterRequest param);
+
+    @Transactional(rollbackFor = Exception.class)
+    TCollectdtl pretendAsCard(UserInforResponse param, Integer cobillno);
 
     @Transactional(rollbackFor = Exception.class)
     PageResult<TCollectdtlDTO> queryTransdtlDTOByParam(TransdtlSearchBean param);
diff --git a/src/main/java/com/supwisdom/dlpay/water/service/DeviceService.java b/src/main/java/com/supwisdom/dlpay/water/service/DeviceService.java
index 7d73588..21e6eaf 100644
--- a/src/main/java/com/supwisdom/dlpay/water/service/DeviceService.java
+++ b/src/main/java/com/supwisdom/dlpay/water/service/DeviceService.java
@@ -23,6 +23,9 @@
     @Transactional(rollbackFor = Exception.class)
     TDevice queryDeviceById(Integer deviceid);
 
+    @Transactional(rollbackFor = Exception.class,readOnly = true)
+    TDevice queryDeviceByDeviceno(String deviceno);
+
     @Transactional(rollbackFor = Exception.class)
     boolean updateDevice(TDevice device);
 
diff --git a/src/main/java/com/supwisdom/dlpay/water/service/impl/AreaServiceImpl.java b/src/main/java/com/supwisdom/dlpay/water/service/impl/AreaServiceImpl.java
index b80df68..ba1abf4 100644
--- a/src/main/java/com/supwisdom/dlpay/water/service/impl/AreaServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/water/service/impl/AreaServiceImpl.java
@@ -152,6 +152,11 @@
         return new PageResult<>(page);
     }
 
+    @Override
+    public TArea findByAreaNo(Integer areano) {
+        return regionDao.findByAvailableAndAreano(1, areano).orElse(null);
+    }
+
     private void setParentArea(Page<TArea> page) {
         page.get().forEach(area -> {
             Optional<TArea> optional = regionDao.findByAvailableAndAreano(1, area.getParentId());
diff --git a/src/main/java/com/supwisdom/dlpay/water/service/impl/DeviceServiceImpl.java b/src/main/java/com/supwisdom/dlpay/water/service/impl/DeviceServiceImpl.java
index 043e561..bc9269c 100644
--- a/src/main/java/com/supwisdom/dlpay/water/service/impl/DeviceServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/water/service/impl/DeviceServiceImpl.java
@@ -1,11 +1,10 @@
 package com.supwisdom.dlpay.water.service.impl;
 
+import com.supwisdom.dlpay.exception.TransactionProcessException;
 import com.supwisdom.dlpay.framework.dao.DictionaryDao;
 import com.supwisdom.dlpay.framework.domain.TDictionary;
+import com.supwisdom.dlpay.framework.util.*;
 import com.supwisdom.dlpay.framework.util.Dictionary;
-import com.supwisdom.dlpay.framework.util.PageResult;
-import com.supwisdom.dlpay.framework.util.StringUtil;
-import com.supwisdom.dlpay.framework.util.WaterDeviceParam;
 import com.supwisdom.dlpay.water.DeviceLineCheckParam;
 import com.supwisdom.dlpay.water.DeviceLoginParam;
 import com.supwisdom.dlpay.water.dao.AreaDao;
@@ -77,6 +76,11 @@
     }
 
     @Override
+    public TDevice queryDeviceByDeviceno(String deviceno) {
+        return deviceDao.findByDeviceno(deviceno);
+    }
+
+    @Override
     public boolean updateDevice(TDevice device) {
         Optional<TDevice> deviOption = deviceDao.findById(device.getDeviceid());
         Optional<TArea> regiOption = areaDao.findByAvailableAndAreano(1, device.getAreano());
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
index ef6476c..f8bfaad 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/water/api_request_param.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/water/api_request_param.kt
@@ -172,14 +172,11 @@
     }
 }
 
-class UserAuthRequest : APIRequestParam() {
+class StartWaterRequest : APIRequestParam() {
 
     @Sign
     var cobillno: Int = 0
 
-    @Sign
-    var userid: String = ""
-
     override fun checkParam(): Boolean {
         return true
     }
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 91651f9..78fb586 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
@@ -1,16 +1,19 @@
 package com.supwisdom.dlpay.water.controller
 
+import com.supwisdom.dlpay.api.bean.QueryUserParam
 import com.supwisdom.dlpay.framework.ResponseBodyBuilder
 import com.supwisdom.dlpay.framework.service.BusinessparaService
 import com.supwisdom.dlpay.framework.service.SystemUtilService
 import com.supwisdom.dlpay.framework.util.*
+import com.supwisdom.dlpay.paysdk.proxy.UserProxy
 import com.supwisdom.dlpay.system.service.UserDataService
 import com.supwisdom.dlpay.water.*
 import com.supwisdom.dlpay.water.domain.TCollectdtl
 import com.supwisdom.dlpay.water.pay.WaterPayAsyncTask
-import com.supwisdom.dlpay.water.service.AccdtlService
+import com.supwisdom.dlpay.water.service.AreaService
 import com.supwisdom.dlpay.water.service.DeviceService
 import com.supwisdom.dlpay.water.service.CollectdtlService
+import mu.KotlinLogging
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.http.ResponseEntity
 import org.springframework.web.bind.annotation.*
@@ -43,7 +46,12 @@
     private lateinit var waterPayAsyncTask: WaterPayAsyncTask
 
     @Autowired
-    private lateinit var accdtlService: AccdtlService
+    private lateinit var areaService: AreaService
+
+    @Autowired
+    private lateinit var userProxy: UserProxy
+
+    private val logger = KotlinLogging.logger { }
 
     @PostMapping("/devicelogin")
     fun deviceLogin(param: DeviceLoginParam): ResponseEntity<Any> {
@@ -144,7 +152,7 @@
             val savedTrans = collectdtlService.createNewTransdtl(trans)
             //2.将流水号及认证地址返回给终端
             //将认证url转为短码
-            val url = shortURLUtil.doGetSinaShortUrl(
+            val url = shortURLUtil.doGetShortUrl(
                     businessparaService.findByParakey(WaterBudinessConstants.waterAuthUrl).paraval + savedTrans.cobillno)
             return ResponseEntity.ok(ResponseBodyBuilder.create()
                     .data(WaterDeviceParam.cobillNo, savedTrans.cobillno)
@@ -171,6 +179,7 @@
                     .data(WaterDeviceParam.authStatus, authStatus)
                     //2为代扣模式
                     .data(WaterDeviceParam.payStatus, 2)
+                    .data(WaterDeviceParam.waterLimit, deviceParam[WaterDeviceParam.waterLimit]!!)
                     .data(WaterDeviceParam.feeAmount, deviceParam[WaterDeviceParam.feeAmount]!!)
                     .data(WaterDeviceParam.feestart, deviceParam[WaterDeviceParam.feestart]!!)
                     .data(WaterDeviceParam.feeUnit, deviceParam[WaterDeviceParam.feeUnit]!!)
@@ -183,32 +192,65 @@
         }
     }
 
-    @GetMapping("/confirm")
-    fun confirmView(): ModelAndView {
-        return ModelAndView("/system/confirm/confirm")
+    /**
+     * 通过userid查询用户卡片信息并记录在流水中
+     */
+    @GetMapping("/qrcode/pretend")
+    fun confirmView(@RequestParam("cobillno") cobillno: Int,
+                    @RequestParam("userid") userid: String): ModelAndView {
+        try {
+            val userInfo = userProxy.querybycardno(QueryUserParam().apply {
+                this.userid = userid
+            })
+            if (userInfo.retcode != 0) {
+                logger.error { "获取用户${userid}信息失败,错误信息:${userInfo.retmsg}" }
+                return ModelAndView("/error/500").addObject("errorMsg", "用户信息异常")
+            }
+            if (userInfo.cardstatus != TradeDict.STATUS_NORMAL || userInfo.transstatus != TradeDict.STATUS_NORMAL) {
+                return ModelAndView("/error/500").addObject("errorMsg", "用户消费状态异常")
+            }
+            val collectDtl = collectdtlService.pretendAsCard(userInfo, cobillno)
+            if (collectDtl.status != TradeDict.DTL_STATUS_INIT) {
+                return ModelAndView("/error/500").addObject("errorMsg", "流水状态异常")
+            }
+            val device = deviceService.queryDeviceByDeviceno(collectDtl.deviceno)
+                    ?: return ModelAndView("/error/500").addObject("errorMsg", "设备信息异常")
+            val area = areaService.findByAreaNo(device.areano)
+                    ?: 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")
+        }
     }
 
-    @PostMapping("/auth")
+    /**
+     * 手机控制开始出水
+     */
+    @PostMapping("/qrcode/start")
     @ResponseBody
-    fun auth(@RequestBody param: UserAuthRequest): ResponseEntity<Any> {
+    fun qrcodeStart(@RequestBody param: StartWaterRequest): ResponseEntity<Any> {
         return try {
-            collectdtlService.userAuth(param)
+            collectdtlService.startWater(param)
             ResponseEntity.ok(ResponseBodyBuilder.create().success())
         } catch (ex: Exception) {
             ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .exception(WaterErrorCode.PROCESS_ERROR, ex, "系统出错,认证失败"))
+                    .exception(WaterErrorCode.PROCESS_ERROR, ex, "出水失败,请稍后重试或联系管理员!"))
         }
     }
 
+
     @PostMapping("/uploadrecord")
     fun transdtlUpload(param: UploadRecordRequest): ResponseEntity<Any> {
         // 1. 根据 cobillno 查询 collectdtl , 并加锁
         val querycodtl = collectdtlService.queryTrans(param.cobillno)
                 ?: return ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(WaterErrorCode.DATA_NOTFOUND_ERROR, "采集流水号"+param.cobillno+"未找到"))
+                        .fail(WaterErrorCode.DATA_NOTFOUND_ERROR, "采集流水号" + param.cobillno + "未找到"))
         if (param.deviceno != querycodtl.deviceno) {
             return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .fail(WaterErrorCode.REQUEST_DATA_ERROR, "设备号"+param.deviceno+"与采集流水号"+param.cobillno+"不匹配"))
+                    .fail(WaterErrorCode.REQUEST_DATA_ERROR, "设备号" + param.deviceno + "与采集流水号" + param.cobillno + "不匹配"))
         }
         //  流水是否重复上传
         if (!querycodtl.uploadStatus) {
@@ -216,11 +258,8 @@
             userDataService.updateCoamount(dtl.citizenCardno, param.amount / 100.0)
             //  是否立即扣费
             if (param.amount >= deviceService.getParaMapByDeviceno(param.deviceno)[WaterDeviceParam.imdDecThreshold]!!.toInt()) {
-                //  刷卡消费
-                if (TradeDict.PAY_MODE_CARD == dtl.mode) {
-                    //  立即异步扣费
-                    waterPayAsyncTask.waterPay(querycodtl.cobillno)
-                }
+                //  立即异步扣费
+                waterPayAsyncTask.waterPay(querycodtl.cobillno)
             }
             return ResponseEntity.ok(ResponseBodyBuilder.create().data(WaterDeviceParam.cobillNo, dtl.cobillno)
                     .success())
diff --git a/src/main/kotlin/com/supwisdom/dlpay/water/service/collectdtl_service.kt b/src/main/kotlin/com/supwisdom/dlpay/water/service/collectdtl_service.kt
index 21682dc..3ed389a 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/water/service/collectdtl_service.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/water/service/collectdtl_service.kt
@@ -1,13 +1,14 @@
 package com.supwisdom.dlpay.water.service
 
+import com.supwisdom.dlpay.api.bean.UserInforResponse
 import com.supwisdom.dlpay.exception.TransactionProcessException
 import com.supwisdom.dlpay.framework.service.SystemUtilService
 import com.supwisdom.dlpay.framework.util.PageResult
 import com.supwisdom.dlpay.framework.util.StringUtil
 import com.supwisdom.dlpay.framework.util.TradeDict
 import com.supwisdom.dlpay.framework.util.WaterErrorCode
+import com.supwisdom.dlpay.water.StartWaterRequest
 import com.supwisdom.dlpay.water.UploadRecordRequest
-import com.supwisdom.dlpay.water.UserAuthRequest
 import com.supwisdom.dlpay.water.bean.TransdtlCountSearchBean
 import com.supwisdom.dlpay.water.dao.CollectdtlDao
 import com.supwisdom.dlpay.water.domain.TCollectdtl
@@ -83,16 +84,26 @@
         }
     }
 
-    override fun userAuth(param: UserAuthRequest): TCollectdtl {
+    override fun startWater(param: StartWaterRequest): TCollectdtl {
         val dtl = collectdtlDao.findByCobillnoForUpdate(param.cobillno)
                 ?: throw TransactionProcessException(WaterErrorCode.DATA_NOTFOUND_ERROR,
                         "交易订单号不存在")
-        dtl.userid = param.userid
         dtl.authStatus = true
         collectdtlDao.save(dtl)
         return dtl
     }
 
+    override fun pretendAsCard(param: UserInforResponse, cobillno: Int?): TCollectdtl {
+        val dtl = collectdtlDao.findByCobillnoForUpdate(cobillno)
+                ?: throw TransactionProcessException(WaterErrorCode.DATA_NOTFOUND_ERROR,
+                        "交易订单号不存在")
+        dtl.userid = param.userid
+        dtl.citizenCardno = param.cardno
+        dtl.cardPhyId = param.cardphyid
+        collectdtlDao.save(dtl)
+        return dtl
+    }
+
     override fun queryTransdtlDTOByParam(param: TransdtlSearchBean): PageResult<TCollectdtlDTO>? {
         val sql = StringBuffer("select t1.cobillno,t1.amount,t1.citizencardno,t1.cardphyid,t1.deviceno,t1.mode,t1.status,t1.transdate,t1.entryno,t1.transtime,t1.accdate,t1.water_in_100ml water_sum_hundred_litre,t1.name username,t2.devicename,t2.areaname,t2.areano  " +
                 "from (select dtl.*,person.name from tb_collectdtl dtl left join tb_person person on dtl.userid = person.userid) t1," +
diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql
index 296df08..079f943 100644
--- a/src/main/resources/data.sql
+++ b/src/main/resources/data.sql
@@ -76,13 +76,14 @@
 INSERT INTO "tb_devicefeeconfig"("areano", "feecfgversion", "feeconfig") VALUES (1, NULL, 1);
 INSERT INTO "tb_feeconfig"("id", "amount", "max_water_litre", "cfg_version") VALUES (1, 1, 50, NULL);
 INSERT INTO "tb_person_identity"("third_uid", "accamount", "cardphyid", "coamount", "createtime", "lockflag", "lossflag", "status", "userid") VALUES ('25002882', 0, '6655ec27', 0, NULL, 0, 0, 'normal', 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs');
-INSERT INTO "tb_person_identity"("third_uid", "accamount", "cardphyid", "coamount", "createtime", "lockflag", "lossflag", "status", "userid") VALUES ('25002885', 0, '6655ec27', 0, NULL, 0, 0, 'normal', 'f3yctKs5+bs1iMU4m8JUvPOus7SbDbrd');
+INSERT INTO "tb_person_identity"("third_uid", "accamount", "cardphyid", "coamount", "createtime", "lockflag", "lossflag", "status", "userid") VALUES ('25002885', 0, '6655ec27', 0, NULL, 0, 0, 'normal', '2c9380836c6b91e9016c6ec7c0020005');
 INSERT INTO "tb_person"("userid", "addr", "country", "email", "idno", "idtype", "lastsaved", "mobile", "name", "nation", "sex", "status", "tel", "zipcode") VALUES ('d1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '王富贵', NULL, NULL, '1', NULL, NULL);
-INSERT INTO "tb_person"("userid", "addr", "country", "email", "idno", "idtype", "lastsaved", "mobile", "name", "nation", "sex", "status", "tel", "zipcode") VALUES ('f3yctKs5+bs1iMU4m8JUvPOus7SbDbrd', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '蔡程应', NULL, NULL, '1', NULL, NULL);
+INSERT INTO "tb_person"("userid", "addr", "country", "email", "idno", "idtype", "lastsaved", "mobile", "name", "nation", "sex", "status", "tel", "zipcode") VALUES ('2c9380836c6b91e9016c6ec7c0020005', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '蔡程应', NULL, NULL, '1', NULL, NULL);
 
 
-INSERT INTO "tb_businesspara"("parakey", "paraval") VALUES ('water_auth_url', 'http://172.28.43.20:8080/water/api/device/confirm?cobillno=');
-INSERT INTO "tb_businesspara"("parakey", "paraval") VALUES ('water_sina_shorturl', 'http://api.t.sina.com.cn/short_url/shorten.json?source=2223392143');
+INSERT INTO "tb_businesspara"("parakey", "paraval") VALUES ('water_auth_url', 'https://yy.dlsmk.cn/water/api/device/qrcode/pretend?cobillno=');
+INSERT INTO "tb_businesspara"("parakey", "paraval") VALUES ('water_shorturl_baidu', 'https://dwz.cn/admin/v2/create');
+INSERT INTO "tb_businesspara"("parakey", "paraval") VALUES ('water_shorturl_baidu_token', 'ee9dc7c65a2b0598106a5930dd774971');
 INSERT INTO "tb_businesspara"("parakey", "paraval") VALUES ('water_shopaccno', '2000000010');
 INSERT INTO "tb_businesspara"("parakey", "paraval") VALUES ('water_appid', '700001');
 INSERT INTO "tb_businesspara"("parakey", "paraval") VALUES ('water_secret', '5f788ce433ec44f299351cdf7f137e81');
diff --git a/src/main/resources/templates/error/500.html b/src/main/resources/templates/error/500.html
index c46acd2..8e2bbea 100755
--- a/src/main/resources/templates/error/500.html
+++ b/src/main/resources/templates/error/500.html
@@ -16,6 +16,7 @@
     <i class="layui-icon" face>&#xe664;</i>

     <div class="layui-text">

       <p>服务器出错了</p>

+      <p>[[${errorMsg}]]</p>

       <h1>

         <span class="layui-anim layui-anim-loop layui-anim-">5</span>

         <span class="layui-anim layui-anim-loop layui-anim-rotate">0</span> 

diff --git a/src/main/resources/templates/system/confirm/confirm.html b/src/main/resources/templates/system/confirm/confirm.html
deleted file mode 100644
index 5e66269..0000000
--- a/src/main/resources/templates/system/confirm/confirm.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<!DOCTYPE html>
-<html xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
-<head>
-    <meta charset="UTF-8">
-    <title>Title</title>
-</head>
-<body>
-<button id="button-auth" style="margin:100px 100px auto;text-align: center;color: green;width: 200px;height: 80px;">确认</button>
-</body>
-<script type="text/javascript" th:src="@{/static/libs/jquery/jquery-3.2.1.min.js}"></script>
-<script>
-    /**
-     * @return {string}
-     */
-    function GetUrlRefnoPara() {
-        var url = document.location.toString();
-        var arrUrl = url.split("?");
-        var para = arrUrl[1].split("=");
-        return para[1]
-    }
-
-    /**
-     * @return {string}
-     */
-    function GetUserid() {
-        return "d1yctWs5+ks0iQN3m9bUvRHus6HbKbrs"
-    }
-    var allData = {
-        cobillno:GetUrlRefnoPara(),
-        userid:GetUserid()
-    }
-    $("#button-auth").click(function () {
-        $.ajax({
-            url: "[[@{/api/device/auth}]]",
-            type:"POST",
-            contentType:"application/json;charset=UTF-8",
-            data:JSON.stringify(allData),
-            success:function (data) {
-                if (data.retcode == 0) {
-                    alert("认证成功")
-                }else {
-                    alert(data.retmsg)
-                }
-            },
-            fail: function (data) {
-                alert(data.retmsg)
-            },
-            error:function (xhr) {
-                console.log(xhr)
-            }
-        })
-    })
-</script>
-</html>
-
diff --git a/src/main/resources/templates/system/start/start.html b/src/main/resources/templates/system/start/start.html
new file mode 100644
index 0000000..79888d7
--- /dev/null
+++ b/src/main/resources/templates/system/start/start.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
+<head>
+    <meta charset="utf-8">
+    <title>扫码成功</title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport"
+          content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
+    <link rel="stylesheet" th:href="@{/static/libs/layui/css/layui.css}" media="all"/>
+    <link rel="stylesheet" th:href="@{/static/custom/css/admin.css}" media="all"/>
+</head>
+<body>
+<div class="layui-fluid">
+    <h2 style="margin-top: 10px">
+        设备区域:<span class="layui-anim layui-anim-loop layui-anim-">[[${areaname}]]</span>
+    </h2>
+    <h2 style="margin-top: 10px">
+        设备名称:<span class="layui-anim layui-anim-loop layui-anim-">[[${devicename}]]</span>
+    </h2>
+    <h2 id="qrcode-success" style="margin-top: 70px;text-align: center">
+        扫码成功!
+    </h2>
+    <div style="margin-top:25px;text-align:center">
+        <button id="button-start-water" class="layui-btn icon-btn" style="width: 120px;height: 45px">
+            <div style="font-size: 20px">开始出水</div>
+        </button>
+        <span><h2 id="msg-area"></h2></span>
+    </div>
+</div>
+</body>
+<script type="text/javascript" th:src="@{/static/libs/jquery/jquery-3.2.1.min.js}"></script>
+<script>
+    function GetUrlCobillnoPara() {
+        var url = document.location.toString();
+        var arrUrl = url.split("?");
+        var para = arrUrl[1].split("&")[0].split("=");
+        return para[1]
+    }
+
+    var allData = {
+        cobillno: GetUrlCobillnoPara(),
+    }
+
+    $("#button-start-water").click(function () {
+        $.ajax({
+            url: "[[@{/api/device/qrcode/start}]]",
+            type: "POST",
+            contentType: "application/json;charset=UTF-8",
+            data: JSON.stringify(allData),
+            success: function (data) {
+                if (data.retcode == 0) {
+                    $("#button-start-water").hide()
+                    $("#msg-area").html("正在控制设备出水,请稍后!")
+                } else {
+                    $("#qrcode-success").html(" ")
+                    $("#button-start-water").hide()
+                    $("#msg-area").html(data.retmsg)
+                }
+            },
+            fail: function (data) {
+                alert(data.retmsg)
+            },
+            error: function (xhr) {
+                console.log(xhr)
+            }
+        })
+    })
+</script>
+</html>
+