From 09632e6b15189bf87f649c2bf057aeb405edd084 Mon Sep 17 00:00:00 2001
From: Junjie <540245094@qq.com>
Date: 星期三, 03 一月 2024 13:12:39 +0800
Subject: [PATCH] #

---
 zy-asrs-openapi/src/main/webapp/views/md/generatePakIn.md                                         |   68 ++
 zy-asrs-openapi/src/main/webapp/views/generatePakIn.html                                          |  218 ++++++++
 zy-asrs-openapi/src/main/webapp/views/md/introduce.md                                             |  359 +-------------
 zy-asrs-openapi/src/main/webapp/views/reportCompleted.html                                        |  218 ++++++++
 zy-asrs-openapi/src/main/java/com/zy/asrs/openapi/controller/ApiController.java                   |   77 +++
 zy-asrs-openapi/src/main/webapp/views/index.html                                                  |  112 ---
 zy-asrs-openapi/src/main/webapp/views/reportApiManage.html                                        |  146 +++++
 zy-asrs-common/src/main/java/com/zy/asrs/common/openapi/entity/param/GenerateOrderPakInParam.java |   19 
 zy-asrs-openapi/src/main/webapp/views/apiManage.html                                              |  146 +++++
 zy-asrs-openapi/src/main/webapp/static/css/common.css                                             |   95 +++
 10 files changed, 1,030 insertions(+), 428 deletions(-)

diff --git a/zy-asrs-common/src/main/java/com/zy/asrs/common/openapi/entity/param/GenerateOrderPakInParam.java b/zy-asrs-common/src/main/java/com/zy/asrs/common/openapi/entity/param/GenerateOrderPakInParam.java
new file mode 100644
index 0000000..7cc2b05
--- /dev/null
+++ b/zy-asrs-common/src/main/java/com/zy/asrs/common/openapi/entity/param/GenerateOrderPakInParam.java
@@ -0,0 +1,19 @@
+package com.zy.asrs.common.openapi.entity.param;
+
+import com.zy.asrs.common.domain.dto.DetlDto;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class GenerateOrderPakInParam {
+
+    private String orderNo;
+
+    private Integer orderType;
+
+    private List<DetlDto> orderDetails;
+
+    private String sign;
+
+}
diff --git a/zy-asrs-openapi/src/main/java/com/zy/asrs/openapi/controller/ApiController.java b/zy-asrs-openapi/src/main/java/com/zy/asrs/openapi/controller/ApiController.java
new file mode 100644
index 0000000..c2e9ada
--- /dev/null
+++ b/zy-asrs-openapi/src/main/java/com/zy/asrs/openapi/controller/ApiController.java
@@ -0,0 +1,77 @@
+package com.zy.asrs.openapi.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zy.asrs.common.openapi.entity.HostKey;
+import com.zy.asrs.common.openapi.entity.param.GenerateOrderPakInParam;
+import com.zy.asrs.common.openapi.service.HostKeyService;
+import com.zy.asrs.common.web.BaseController;
+import com.zy.asrs.framework.common.BaseRes;
+import com.zy.asrs.framework.common.Cools;
+import com.zy.asrs.framework.common.R;
+import com.zy.asrs.framework.exception.CoolException;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+@Slf4j
+@RestController
+@RequestMapping("/api")
+public class ApiController extends BaseController {
+
+    @Autowired
+    private HostKeyService hostKeyService;
+
+    @PostMapping("/generateOrderPakIn")
+    public synchronized R pakinOrderCreate(@RequestHeader(required = false) String appkey,
+                                           @RequestBody GenerateOrderPakInParam param) {
+        auth(appkey, param);
+        if (Cools.isEmpty(param)) {
+            return R.parse(BaseRes.PARAM);
+        }
+        if (Cools.isEmpty(param.getOrderNo())) {
+            return R.error("鍗曟嵁缂栧彿[orderNo]涓嶈兘涓虹┖");
+        }
+        if (Cools.isEmpty(param.getOrderType())) {
+            return R.error("鍗曟嵁绫诲瀷[orderType]涓嶈兘涓虹┖");
+        }
+        if (Cools.isEmpty(param.getOrderDetails())) {
+            return R.error("鍗曟嵁鏄庣粏[orderDetails]涓嶈兘涓虹┖");
+        }
+//        openService.pakinOrderCreate(param);
+        return R.ok();
+    }
+
+    private void auth(String appkey, Object obj) {
+        if (Cools.isEmpty(appkey)) {
+            throw new CoolException("璁よ瘉澶辫触锛岃纭appKey鏃犺锛�");
+        }
+
+        HostKey hostKey = hostKeyService.getOne(new LambdaQueryWrapper<HostKey>().eq(HostKey::getAppKey, appkey));
+        if (hostKey == null) {
+            throw new CoolException("璁よ瘉澶辫触锛岃纭appKey鏃犺锛�");
+        }
+
+        if (hostKey.getSignStatus() == 1) {
+            //闇�瑕佽繘琛岀鍚嶆牎楠�
+            //鍒涘缓鑷劧鎺掑簭map
+            JSONObject param = new JSONObject(true);
+            JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(obj));
+            for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
+                if (!entry.getKey().equals("sign")) {//鍓旈櫎sign
+                    param.put(entry.getKey(), entry.getValue());
+                }
+            }
+            param.put("signKey", hostKey.getSignKey());
+            String md5Hex = DigestUtils.md5Hex(param.toJSONString());
+            if (!jsonObject.get("sign").toString().equals(md5Hex)) {
+                throw new CoolException("绛惧悕鏍¢獙澶辫触");
+            }
+        }
+    }
+
+}
diff --git a/zy-asrs-openapi/src/main/webapp/static/css/common.css b/zy-asrs-openapi/src/main/webapp/static/css/common.css
new file mode 100644
index 0000000..57ea2cb
--- /dev/null
+++ b/zy-asrs-openapi/src/main/webapp/static/css/common.css
@@ -0,0 +1,95 @@
+#content {
+    width: 80%;
+    margin-left: 10%;
+}
+
+#content table {
+    background: #fff;
+    border: solid 1px #ddd;
+    margin-bottom: 1.25rem;
+    table-layout: auto
+}
+
+#content table caption {
+    background: transparent;
+    color: #222;
+    font-size: 1rem;
+    font-weight: bold
+}
+
+#content table thead {
+    background: #F5F5F5
+}
+
+#content table thead tr th,#content table thead tr td {
+    color: #222;
+    font-size: 0.875rem;
+    font-weight: bold;
+    padding: 0.5rem 0.625rem 0.625rem
+}
+
+#content table tfoot {
+    background: #F5F5F5
+}
+
+#content table tfoot tr th,#content table tfoot tr td {
+    color: #222;
+    font-size: 0.875rem;
+    font-weight: bold;
+    padding: 0.5rem 0.625rem 0.625rem
+}
+
+#content table tr th,#content table tr td {
+    color: #222;
+    font-size: 0.875rem;
+    padding: 0.5625rem 0.625rem;
+    text-align: left
+}
+
+#content table tr.even,#content table tr.alt,#content table tr:nth-of-type(even) {
+    background: #F9F9F9
+}
+
+#content table thead tr th,#content table tfoot tr th,#content table tfoot tr td,#content table tbody tr th,#content table tbody tr td,#content table tr td {
+    display: table-cell;
+    line-height: 1.125rem
+}
+
+#content pre {
+    white-space: pre-wrap;       /* css-3 */
+    white-space: -moz-pre-wrap;  /* Mozilla, since 1999 */
+    white-space: -o-pre-wrap;    /* Opera 7 */
+    word-wrap: break-word;       /* Internet Explorer 5.5+ */
+    background-color: #f8f8f8;
+    border: 1px solid #dfdfdf;
+    margin-top: 1.5em;
+    margin-bottom: 1.5em;
+    padding: 0.125rem 0.3125rem 0.0625rem;
+}
+
+#content pre code {
+    background-color: transparent;
+    border: 0;
+    padding: 0;
+}
+
+.el-dropdown-link {
+    cursor: pointer;
+    color: #409EFF;
+}
+.el-icon-arrow-down {
+    font-size: 12px;
+}
+
+.slider {
+    position: fixed;
+    top: 20px;
+    right: 20px;
+    width: 130px;
+    border-left: 3px solid #f0f0f0;
+    padding-left: 15px;
+}
+
+.slider > .el-divider {
+    margin: 5px 0;
+}
diff --git a/zy-asrs-openapi/src/main/webapp/views/apiManage.html b/zy-asrs-openapi/src/main/webapp/views/apiManage.html
new file mode 100644
index 0000000..4918caf
--- /dev/null
+++ b/zy-asrs-openapi/src/main/webapp/views/apiManage.html
@@ -0,0 +1,146 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>API寮�鏀惧钩鍙� - API绠$悊</title>
+    <link rel="stylesheet" href="../static/css/element.css">
+    <link rel="stylesheet" href="../static/css/common.css">
+    <script type="text/javascript" src="../static/js/jquery/jquery-3.3.1.min.js"></script>
+    <script type="text/javascript" src="../static/js/vue.min.js"></script>
+    <script type="text/javascript" src="../static/js/showdown.min.js"></script>
+    <script type="text/javascript" src="../static/js/common.js"></script>
+    <script type="text/javascript" src="../static/js/element.js"></script>
+</head>
+<body>
+    <div id="app" style="display: flex;justify-content: center;flex-wrap: wrap;">
+        <div style="width: 80%;">
+            <el-card class="box-card">
+                <el-form :inline="true" :model="tableSearchParam" class="demo-form-inline">
+                    <el-form-item label="">
+                        <el-input v-model="tableSearchParam.task_no" placeholder="浠诲姟鍙�"></el-input>
+                    </el-form-item>
+                    <el-form-item>
+                        <el-button type="primary" @click="getTableData">鏌ヨ</el-button>
+                        <el-button type="primary" @click="resetParam">閲嶇疆</el-button>
+                    </el-form-item>
+                </el-form>
+                <el-table ref="singleTable" :data="tableData" style="width: 100%;">
+                    <el-table-column property="id" label="#ID">
+                    </el-table-column>
+                    <el-table-column property="wrkNo" label="宸ヤ綔鍙�">
+                    </el-table-column>
+                    <el-table-column property="taskNo" label="浠诲姟鍙�">
+                    </el-table-column>
+                    <el-table-column property="commandStatus$" label="鎸囦护鐘舵��">
+                    </el-table-column>
+                    <el-table-column show-overflow-tooltip property="durationTime" label="鎸佺画鏃堕暱">
+                    </el-table-column>
+                    <el-table-column property="commandType" label="鎸囦护绫诲瀷">
+                    </el-table-column>
+                    <el-table-column property="device" label="璁惧">
+                    </el-table-column>
+                    <el-table-column property="deviceLog" label="璁惧鎵ц淇℃伅">
+                    </el-table-column>
+                    <el-table-column property="commandDesc" label="鍛戒护鎻忚堪">
+                    </el-table-column>
+                    <el-table-column show-overflow-tooltip property="startTime$" label="寮�濮嬫椂闂�">
+                    </el-table-column>
+                    <el-table-column show-overflow-tooltip property="executeTime$" label="鎵ц鏃堕棿">
+                    </el-table-column>
+                    <el-table-column show-overflow-tooltip property="completeTime$" label="瀹屾垚鏃堕棿">
+                    </el-table-column>
+                    <el-table-column show-overflow-tooltip property="command" label="鍛戒护鎶ユ枃" width="250">
+                    </el-table-column>
+                </el-table>
+
+                <div style="margin-top: 10px;">
+                    <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
+                                   :current-page="currentPage" :page-sizes="pageSizes" :page-size="pageSize"
+                                   layout="total, sizes, prev, pager, next, jumper" :total="pageTotal">
+                    </el-pagination>
+                </div>
+            </el-card>
+        </div>
+
+        <div style="position: fixed;top: 20px;right: 20px;width: 150px;border-left: 3px solid #f0f0f0;padding-left: 15px;">
+            <div><el-button type="text" @click="switchPage('index.html')">瑙勮寖璇存槑</el-button></div>
+            <div><el-button type="text" @click="switchPage('reportCompleted.html')">浠诲姟瀹屾垚涓婃姤</el-button></div>
+            <div><el-button type="text" @click="switchPage('reportCompleted.html')">浠诲姟鍙栨秷涓婃姤</el-button></div>
+            <div><el-button type="text" @click="switchPage('reportCompleted.html')">搴撳瓨涓婃姤</el-button></div>
+            <div><el-button type="text" @click="switchPage('reportApiManage.html')">涓婃姤API绠$悊</el-button></div>
+        </div>
+    </div>
+
+    <script>
+        var app = new Vue({
+            el: '#app',
+            data: {
+                tableData: [],
+                currentPage: 1,
+                pageSizes: [16, 30, 50, 100, 150, 200],
+                pageSize: 16,
+                pageTotal: 0,
+                tableSearchParam: {
+                    task_no: null,
+                },
+            },
+            created() {
+                this.init()
+            },
+            methods: {
+                init() {
+                    this.getTableData()
+                },
+                getTableData() {
+                    let that = this;
+                    let data = this.tableSearchParam
+                    data.curr = this.currentPage
+                    data.limit = this.pageSize
+                    $.ajax({
+                        url: baseUrl + "/commandInfoLog/list/auth",
+                        headers: {
+                            'token': localStorage.getItem('token')
+                        },
+                        data: data,
+                        dataType: 'json',
+                        contentType: 'application/json;charset=UTF-8',
+                        method: 'GET',
+                        success: function(res) {
+                            if (res.code == 200) {
+                                that.tableData = res.data.records
+                                that.pageTotal = res.data.total
+                            } else {
+                                that.$message({
+                                    message: res.msg,
+                                    type: 'error'
+                                });
+                            }
+                        }
+                    });
+                },
+                handleSizeChange(val) {
+                    console.log(`姣忛〉 ${val} 鏉);
+                    this.pageSize = val
+                    this.getTableData()
+                },
+                handleCurrentChange(val) {
+                    console.log(`褰撳墠椤�: ${val}`);
+                    this.currentPage = val
+                    this.getTableData()
+                },
+                resetParam() {
+                    this.tableSearchParam = {
+                        task_no: null,
+                        status: null,
+                        wrk_no: null
+                    }
+                    this.getTableData()
+                },
+                switchPage(url) {
+                    location.href = url
+                }
+            }
+        })
+    </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/zy-asrs-openapi/src/main/webapp/views/generatePakIn.html b/zy-asrs-openapi/src/main/webapp/views/generatePakIn.html
new file mode 100644
index 0000000..4cc6ce9
--- /dev/null
+++ b/zy-asrs-openapi/src/main/webapp/views/generatePakIn.html
@@ -0,0 +1,218 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>API寮�鏀惧钩鍙� - 鐢熸垚鍏ュ簱</title>
+    <link rel="stylesheet" href="../static/css/element.css">
+    <link rel="stylesheet" href="../static/css/common.css">
+    <script type="text/javascript" src="../static/js/jquery/jquery-3.3.1.min.js"></script>
+    <script type="text/javascript" src="../static/js/vue.min.js"></script>
+    <script type="text/javascript" src="../static/js/showdown.min.js"></script>
+    <script type="text/javascript" src="../static/js/common.js"></script>
+    <script type="text/javascript" src="../static/js/element.js"></script>
+</head>
+<body>
+    <div id="app">
+        <div id="content"></div>
+        <div class="slider">
+            <div><el-button type="text" @click="switchPage('index.html')">瑙勮寖璇存槑</el-button></div>
+            <el-divider></el-divider>
+            <div><el-button type="text" @click="switchPage('reportCompleted.html')">浠诲姟瀹屾垚涓婃姤</el-button></div>
+            <div><el-button type="text" @click="switchPage('reportCompleted.html')">浠诲姟鍙栨秷涓婃姤</el-button></div>
+            <div><el-button type="text" @click="switchPage('reportCompleted.html')">搴撳瓨涓婃姤</el-button></div>
+            <div><el-button type="text" @click="switchPage('reportApiManage.html')">涓婃姤API绠$悊</el-button></div>
+            <el-divider></el-divider>
+            <div><el-button type="text" @click="switchPage('generatePakIn.html')">鐢熸垚鍏ュ簱璁㈠崟</el-button></div>
+            <el-divider></el-divider>
+            <div><el-button type="text" @click="keyList()">瀵嗛挜绠$悊</el-button></div>
+        </div>
+
+        <el-dialog title="瀵嗛挜绠$悊" :visible.sync="keyTableVisible">
+            <el-table :data="keyTableData" v-loading="loading">
+                <el-table-column property="hostId$" label="浠撳簱"></el-table-column>
+                <el-table-column property="signKey" label="绛惧悕瀵嗛挜" width="150"></el-table-column>
+                <el-table-column property="appKey" label="鎺ュ彛璇锋眰瀵嗛挜" width="250"></el-table-column>
+                <el-table-column property="createTime$" label="鏃堕棿" width="200"></el-table-column>
+                <el-table-column label="鎿嶄綔" width="400">
+                    <template slot-scope="scope">
+                        <el-button size="mini" @click="generateSignKey(scope.row.hostId)">绛惧悕瀵嗛挜</el-button>
+                        <el-button size="mini" @click="generateAppKey(scope.row.hostId)">鎺ュ彛瀵嗛挜</el-button>
+                        <el-switch
+                                v-model="scope.row.signStatus"
+                                @change="switchChange(scope.row.hostId,scope.row.signStatus)"
+                                active-text="寮�鍚鍚�"
+                                inactive-text="鍏抽棴绛惧悕">
+                        </el-switch>
+                    </template>
+                </el-table-column>
+            </el-table>
+        </el-dialog>
+    </div>
+
+    <script>
+        showdown.setOption('tables', true);
+        var converter = new showdown.Converter()
+
+        var app = new Vue({
+            el: '#app',
+            data: {
+                keyTableVisible: false,
+                keyTableData: [],
+                loading: true,
+            },
+            created() {
+                this.init()
+            },
+            methods: {
+                init() {
+                    this.introduceClick()
+                },
+                introduceClick() {
+                    $.ajax({
+                        url: "md/generatePakIn.md",
+                        headers: {'token': localStorage.getItem('token')},
+                        method: 'GET',
+                        success: function (res) {
+                            // $("#content").html(marked.parse(res))
+                            // console.log(converter.makeHtml(res))
+                            $("#content").html(converter.makeHtml(res))
+                        }
+                    });
+                },
+                keyList() {
+                    let that = this
+                    this.keyTableVisible = true
+                    $.ajax({
+                        url: baseUrl + "/hostKey/list/auth",
+                        headers: {'token': localStorage.getItem('token')},
+                        data: {},
+                        dataType:'json',
+                        contentType:'application/json;charset=UTF-8',
+                        method: 'POST',
+                        success: function (res) {
+                            let tmp = []
+                            res.data.forEach((item, index) => {
+                                item.signStatus = item.signStatus == 1 ? true : false;
+                                tmp.push(item)
+                            });
+                            that.keyTableData = tmp
+                            that.loading = false
+                        }
+                    });
+                },
+                generateSignKey(hostId) {
+                    let that = this
+                    this.$confirm('姝ゆ搷浣滃皢瑕嗙洊鍘熺鍚嶅瘑閽�, 鏄惁缁х画?', '鎻愮ず', {
+                        confirmButtonText: '纭畾',
+                        cancelButtonText: '鍙栨秷',
+                        type: 'warning'
+                    }).then(() => {
+                        $.ajax({
+                            url: baseUrl + "/hostKey/generateSignKey/auth",
+                            headers: {'token': localStorage.getItem('token')},
+                            data: {
+                                hostId: hostId
+                            },
+                            dataType: 'json',
+                            contentType: 'application/json;charset=UTF-8',
+                            method: 'GET',
+                            success: function (res) {
+                                if (res.code === 200) {
+                                    that.$message({
+                                        type: 'success',
+                                        message: '鐢熸垚鎴愬姛'
+                                    });
+
+                                    that.keyTableData.forEach((item, index) => {
+                                        if (item.hostId == hostId) {
+                                            item.signKey = res.data.signKey
+                                        }
+                                    });
+                                } else {
+                                    that.$message({
+                                        type: 'error',
+                                        message: res.msg
+                                    });
+                                }
+                            }
+                        });
+                    }).catch(() => {
+                        //鍙栨秷
+                    });
+                },
+                generateAppKey(hostId) {
+                    let that = this
+                    this.$confirm('姝ゆ搷浣滃皢瑕嗙洊鍘熸帴鍙e瘑閽�, 鏄惁缁х画?', '鎻愮ず', {
+                        confirmButtonText: '纭畾',
+                        cancelButtonText: '鍙栨秷',
+                        type: 'warning'
+                    }).then(() => {
+                        $.ajax({
+                            url: baseUrl + "/hostKey/generateAppKey/auth",
+                            headers: {'token': localStorage.getItem('token')},
+                            data: {
+                                hostId: hostId
+                            },
+                            dataType: 'json',
+                            contentType: 'application/json;charset=UTF-8',
+                            method: 'GET',
+                            success: function (res) {
+                                if (res.code === 200) {
+                                    that.$message({
+                                        type: 'success',
+                                        message: '鐢熸垚鎴愬姛'
+                                    });
+
+                                    that.keyTableData.forEach((item, index) => {
+                                        if (item.hostId == hostId) {
+                                            item.appKey = res.data.appKey
+                                        }
+                                    });
+                                } else {
+                                    that.$message({
+                                        type: 'error',
+                                        message: res.msg
+                                    });
+                                }
+                            }
+                        });
+                    }).catch(() => {
+                        //鍙栨秷
+                    });
+                },
+                switchChange(hostId, signStatus) {
+                    let that = this
+                    //绛惧悕鏍¢獙寮�鍏�
+                    $.ajax({
+                        url: baseUrl + "/hostKey/switchSign/auth",
+                        headers: {'token': localStorage.getItem('token')},
+                        data: {
+                            hostId: hostId,
+                            signStatus: signStatus ? 1 : 0,
+                        },
+                        dataType: 'json',
+                        contentType: 'application/json;charset=UTF-8',
+                        method: 'GET',
+                        success: function (res) {
+                            if (res.code === 200) {
+                                that.$message({
+                                    type: 'success',
+                                    message: '鍒囨崲鎴愬姛'
+                                });
+                            } else {
+                                that.$message({
+                                    type: 'error',
+                                    message: res.msg
+                                });
+                            }
+                        }
+                    });
+                },
+                switchPage(url) {
+                    location.href = url
+                },
+            }
+        })
+    </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/zy-asrs-openapi/src/main/webapp/views/index.html b/zy-asrs-openapi/src/main/webapp/views/index.html
index 6281b1f..ad90b99 100644
--- a/zy-asrs-openapi/src/main/webapp/views/index.html
+++ b/zy-asrs-openapi/src/main/webapp/views/index.html
@@ -4,108 +4,27 @@
     <meta charset="UTF-8">
     <title>API寮�鏀惧钩鍙�</title>
     <link rel="stylesheet" href="../static/css/element.css">
+    <link rel="stylesheet" href="../static/css/common.css">
     <script type="text/javascript" src="../static/js/jquery/jquery-3.3.1.min.js"></script>
     <script type="text/javascript" src="../static/js/vue.min.js"></script>
     <script type="text/javascript" src="../static/js/showdown.min.js"></script>
     <script type="text/javascript" src="../static/js/common.js"></script>
     <script type="text/javascript" src="../static/js/element.js"></script>
-    <style>
-        #content {
-            width: 80%;
-            margin-left: 10%;
-        }
-
-        #content table {
-            background: #fff;
-            border: solid 1px #ddd;
-            margin-bottom: 1.25rem;
-            table-layout: auto
-        }
-
-        #content table caption {
-            background: transparent;
-            color: #222;
-            font-size: 1rem;
-            font-weight: bold
-        }
-
-        #content table thead {
-            background: #F5F5F5
-        }
-
-        #content table thead tr th,#content table thead tr td {
-            color: #222;
-            font-size: 0.875rem;
-            font-weight: bold;
-            padding: 0.5rem 0.625rem 0.625rem
-        }
-
-        #content table tfoot {
-            background: #F5F5F5
-        }
-
-        #content table tfoot tr th,#content table tfoot tr td {
-            color: #222;
-            font-size: 0.875rem;
-            font-weight: bold;
-            padding: 0.5rem 0.625rem 0.625rem
-        }
-
-        #content table tr th,#content table tr td {
-            color: #222;
-            font-size: 0.875rem;
-            padding: 0.5625rem 0.625rem;
-            text-align: left
-        }
-
-        #content table tr.even,#content table tr.alt,#content table tr:nth-of-type(even) {
-            background: #F9F9F9
-        }
-
-        #content table thead tr th,#content table tfoot tr th,#content table tfoot tr td,#content table tbody tr th,#content table tbody tr td,#content table tr td {
-            display: table-cell;
-            line-height: 1.125rem
-        }
-
-        #content pre {
-            white-space: pre-wrap;       /* css-3 */
-            white-space: -moz-pre-wrap;  /* Mozilla, since 1999 */
-            white-space: -o-pre-wrap;    /* Opera 7 */
-            word-wrap: break-word;       /* Internet Explorer 5.5+ */
-            background-color: #f8f8f8;
-            border: 1px solid #dfdfdf;
-            margin-top: 1.5em;
-            margin-bottom: 1.5em;
-            padding: 0.125rem 0.3125rem 0.0625rem;
-        }
-
-        #content pre code {
-            background-color: transparent;
-            border: 0;
-            padding: 0;
-        }
-
-        .el-dropdown-link {
-            cursor: pointer;
-            color: #409EFF;
-        }
-        .el-icon-arrow-down {
-            font-size: 12px;
-        }
-    </style>
 </head>
 <body>
     <div id="app">
         <div id="content"></div>
-        <div style="position: fixed;top: 20px;right: 20px;width: 100px;">
-            <el-menu default-active="1">
-                <el-menu-item index="1">
-                    <span slot="title" @click="introduceClick()">瑙勮寖璇存槑</span>
-                </el-menu-item>
-                <el-menu-item index="2">
-                    <span slot="title" @click="keyList()">瀵嗛挜绠$悊</span>
-                </el-menu-item>
-            </el-menu>
+        <div class="slider">
+            <div><el-button type="text" @click="switchPage('index.html')">瑙勮寖璇存槑</el-button></div>
+            <el-divider></el-divider>
+            <div><el-button type="text" @click="switchPage('reportCompleted.html')">浠诲姟瀹屾垚涓婃姤</el-button></div>
+            <div><el-button type="text" @click="switchPage('reportCompleted.html')">浠诲姟鍙栨秷涓婃姤</el-button></div>
+            <div><el-button type="text" @click="switchPage('reportCompleted.html')">搴撳瓨涓婃姤</el-button></div>
+            <div><el-button type="text" @click="switchPage('reportApiManage.html')">涓婃姤API绠$悊</el-button></div>
+            <el-divider></el-divider>
+            <div><el-button type="text" @click="switchPage('generatePakIn.html')">鐢熸垚鍏ュ簱璁㈠崟</el-button></div>
+            <el-divider></el-divider>
+            <div><el-button type="text" @click="keyList()">瀵嗛挜绠$悊</el-button></div>
         </div>
 
         <el-dialog title="瀵嗛挜绠$悊" :visible.sync="keyTableVisible">
@@ -139,7 +58,7 @@
             data: {
                 keyTableVisible: false,
                 keyTableData: [],
-                loading: true
+                loading: true,
             },
             created() {
                 this.init()
@@ -288,7 +207,10 @@
                             }
                         }
                     });
-                }
+                },
+                switchPage(url) {
+                    location.href = url
+                },
             }
         })
     </script>
diff --git a/zy-asrs-openapi/src/main/webapp/views/md/generatePakIn.md b/zy-asrs-openapi/src/main/webapp/views/md/generatePakIn.md
new file mode 100644
index 0000000..b2cafe7
--- /dev/null
+++ b/zy-asrs-openapi/src/main/webapp/views/md/generatePakIn.md
@@ -0,0 +1,68 @@
+## 鐢熸垚鍏ュ簱璁㈠崟
+
+- **鎺ュ彛璇存槑锛�** 鐢熸垚鍏ュ簱璁㈠崟
+- **鎺ュ彛鍦板潃锛�** /api/generatePakIn
+
+#### 璇锋眰鍙傛暟
+
+鍙傛暟鍚嶇О						|绫诲瀷		|鍑虹幇瑕佹眰	|鎻忚堪  
+:----						|:---		|:------	|:---	
+Header						|&nbsp;		|蹇呭~			|璇锋眰鎶ユ枃澶�
+&emsp;appkey					|string		|蹇呭~			|瀵嗛挜绠$悊涓敓鎴恆ppkey
+Body						|&nbsp;		|蹇呭~			|&nbsp;
+&emsp;orderNo				|string		|蹇呭~			|璁㈠崟鍙�
+&emsp;orderType				|int		|蹇呭~			|璁㈠崟绫诲瀷(閫氳繃璁㈠崟绫诲瀷鏌ヨ鎺ュ彛鑾峰彇)
+&emsp;orderDetails				|object		|蹇呭~			|鐗╂枡璇︽儏
+&emsp;&emsp;orderNo				|string		|蹇呭~			|璁㈠崟鍙�
+&emsp;&emsp;matnr				|string		|蹇呭~			|鐗╂枡鍙�
+&emsp;&emsp;anfme				|double		|蹇呭~			|鏁伴噺
+&emsp;sign				|string		|鍙��			|绛惧悕
+
+
+璇锋眰绀轰緥锛�
+
+```
+{
+    "Header":{
+        "appkey":"6cfb9f11935b4d0e1740f41598970c97",
+    },
+    "Body":{
+		"orderNo": 2024010311062541,
+		"orderType": 1,
+		"orderDetails": [
+			{
+				"orderNo": 2024010311062541,
+				"matnr": "test001",
+				"anfme": 10
+			}
+		],
+		"sign": "8a7036cfe218e12f50f9107e9eb4a437"
+    }
+}
+
+```
+
+
+#### 杩斿洖缁撴灉
+
+鍙傛暟鍚嶇О						|绫诲瀷		|鍑虹幇瑕佹眰	|鎻忚堪  
+:----						|:---		|:------	|:---	
+code						|int		|蹇呭~			|鍝嶅簲鐮侊紝浠g爜瀹氫箟璇疯鈥滈檮褰旳 鍝嶅簲鍚楄鏄庘��
+msg							|string		|蹇呭~			|&nbsp;
+data						|object		|鍙��			|&nbsp;
+
+绀轰緥锛�
+
+```
+{
+    "msg": "鎿嶄綔鎴愬姛",
+    "code": 200
+}
+```
+
+## 闄勫綍A 鍝嶅簲鐮佽鏄�
+
+鍝嶅簲鐮�	|璇存槑  
+:----	|:---
+200		|澶勭悊鎴愬姛
+500		|绯荤粺鍐呴儴閿欒
\ No newline at end of file
diff --git a/zy-asrs-openapi/src/main/webapp/views/md/introduce.md b/zy-asrs-openapi/src/main/webapp/views/md/introduce.md
index c975f05..a9e1b03 100644
--- a/zy-asrs-openapi/src/main/webapp/views/md/introduce.md
+++ b/zy-asrs-openapi/src/main/webapp/views/md/introduce.md
@@ -1,44 +1,14 @@
+# API骞冲彴鎺ュ彛鏂囨。 v1.0
 
-# AA鍏徃BC骞冲彴鎺ュ彛鏂囨。 v3.2.0
+## 瑙勮寖璇存槑
 
-## 1 瑙勮寖璇存槑
+### 閫氫俊鍗忚
+HTTP鍗忚
 
-### 1.1 閫氫俊鍗忚
+### 璇锋眰鏂规硶
+鎺ュ彛鏀寔POST鏂规硶鍙戣捣璇锋眰銆�
 
-HTTPS鍗忚[HTTPS鍗忚](generateSign.html)
-
-### 1.2 璇锋眰鏂规硶
-鎵�鏈夋帴鍙e彧鏀寔POST鏂规硶鍙戣捣璇锋眰銆�
-
-### 1.3 瀛楃缂栫爜
-HTTP閫氳鍙婃姤鏂嘊ASE64缂栫爜鍧囬噰鐢║TF-8瀛楃闆嗙紪鐮佹牸寮忋��
-
-### 1.4 鏍煎紡璇存槑
-鍏冪礌鍑虹幇瑕佹眰璇存槑锛�
-
-绗﹀彿				|璇存槑
-:----:			|:---
-R				|鎶ユ枃涓鍏冪礌蹇呴』鍑虹幇锛圧equired锛�
-O				|鎶ユ枃涓鍏冪礌鍙�夊嚭鐜帮紙Optional锛�
-C				|鎶ユ枃涓鍏冪礌鍦ㄤ竴瀹氭潯浠朵笅鍑虹幇锛圕onditional锛�
-
-### 1.5 鎶ユ枃瑙勮寖璇存槑
-
-1. 鎶ユ枃瑙勮寖浠呴拡瀵逛氦鏄撹姹傛暟鎹繘琛屾弿杩帮紱
-
-2. 鎶ユ枃瑙勮寖涓姹傛姤鏂囩殑鍐呭涓篐ttps璇锋眰鎶ユ枃涓璕equestData鍊肩殑鏄庢枃鍐呭锛�
-
-3. 鎶ユ枃瑙勮寖鍒嗕负璇锋眰鎶ユ枃鍜屽搷搴旀姤鏂囥�傝姹傛姤鏂囨弿杩扮敱鍙戣捣鏂癸紝鍝嶅簲鎶ユ枃鐢辨姤鏂囨帴鏀舵柟鍝嶅簲銆�
-
-### 1.6 璇锋眰鎶ユ枃缁撴瀯
-鎺ュ彛鍙帴鏀朵袱涓弬鏁� **RequestData** 鍜� **SignData** 锛屽叾涓璕equestData鐨勫�间负璇锋眰鍐呭锛孲ignData鐨勫�间负绛惧悕鍐呭銆�
-
-#### 1.6.1 鍙傛暟璇存槑
-**RequestData锛堣姹傚唴瀹癸級锛�** 鍏舵槑鏂囦负姣忔璇锋眰鐨勫叿浣撳弬鏁帮紝閲囩敤 JSON 鏍煎紡锛屼緷娆$粡杩� DES 鍔犲瘑锛堜互UTF-8缂栫爜銆丅ASE64缂栫爜杈撳嚭缁撴灉锛夊拰 URLEncode 鍚庯紝浣滀负 RequestData 鐨勫�笺��
-
-**SignData锛堢鍚嶅唴瀹癸級锛�** 璇锋眰鍙傛暟锛堟槑鏂囷級鐨凪D5鍔犲瘑瀛楃涓诧紝鐢ㄤ簬鏍¢獙RequestData鏄惁鍚堟硶銆�
-
-#### 1.6.2 璇锋眰鍐呭锛圧equestData锛夋槑鏂囩粨鏋勮鏄�
+### 璇锋眰鍐呭缁撴瀯璇存槑
 
 閲囩敤JSON鏍煎紡锛屽叾涓寘鍚獺eader锛堝叕鏈夊弬鏁帮級銆丅ody锛堢鏈夊弬鏁帮級鑺傜偣锛�
 
@@ -51,313 +21,36 @@
 
 鍏叡鍙傛暟锛圚eader锛夋槸鐢ㄤ簬鏍囪瘑浜у搧鍙婃帴鍙i壌鏉冪殑鍙傛暟锛屾瘡娆¤姹傚潎闇�瑕佹惡甯﹁繖浜涘弬鏁帮細
 
-鍙傛暟鍚嶇О				|绫诲瀷		|鍑虹幇瑕佹眰	|鎻忚堪  
+鍙傛暟鍚嶇О				|绫诲瀷		|鍙傛暟瑕佹眰	|鎻忚堪  
 :----				|:---		|:------	|:---	
-Token				|string		|R			|鐢ㄦ埛鐧诲綍鍚巘oken锛屾病鏈夌櫥褰曞垯涓虹┖瀛楃涓�
-Version				|string		|R			|鎺ュ彛鐗堟湰鍙�
-SystemId			|int		|R			|鏈烘瀯鍙凤紝璇锋眰鐨勭郴缁烮d
-Timestamp			|long		|R			|褰撳墠UNIX鏃堕棿鎴�
+appkey				|string		|		蹇呭~	|瀵嗛挜绠$悊涓敓鎴恆ppkey
 
 
-#### 1.6.3 鏍¢獙娴佺▼锛�
-鏈嶅姟绔帴鏀跺埌璇锋眰鍚庨鍏堝RequestData杩涜DES瑙e瘑鍑篔SON瀛楃涓诧紝鐒跺悗瀵笿SON瀛楃涓茶繘琛孧D5鍔犲瘑锛屽姞瀵嗗悗鐨勫�间笌璇锋眰涓殑SignData鍊艰繘琛屽姣旓紝濡傚姣旈�氳繃锛岃涓哄悎娉曡姹傦紝鍚﹀垯瑙嗕负闈炴硶璇锋眰銆�
+### 绛惧悕鏍¢獙娴佺▼锛�
+鏈嶅姟绔帴鏀跺埌璇锋眰鍚庨鍏堝Body鍓旈櫎sign鍙傛暟锛屽苟娣诲姞signKey鍊硷紝鍐嶅Bode鐨刱ey鍊艰繘琛岃嚜鐒舵帓搴忋�傜劧鍚庡JSON瀛楃涓茶繘琛孧D5鍔犲瘑锛屽姞瀵嗗悗鐨勫�间笌Body涓殑sign鍊艰繘琛屽姣旓紝濡傚姣旈�氳繃锛岃涓哄悎娉曡姹傦紝鍚﹀垯瑙嗕负闈炴硶璇锋眰銆�
 
-**DES鍔犲瘑/瑙e瘑鍑芥暟绀轰緥锛�**
-
-C#鐗堬細
-
-```
-/// <summary>
-/// 杩涜DES鍔犲瘑銆�
-/// </summary>
-/// <param name="decryptString">瑕佸姞瀵嗙殑瀛楃涓层��</param>
-/// <param name="secretKey">瀵嗛挜锛屼笖蹇呴』涓�8浣嶃��</param>
-/// <returns>浠ase64鏍煎紡杩斿洖鐨勫姞瀵嗗瓧绗︿覆銆�</returns>
-public static string DesEncrypt(string decryptString, string secretKey)
-{
-    using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
-    {
-        byte[] inputByteArray = Encoding.UTF8.GetBytes(decryptString);
-        des.Key = Encoding.ASCII.GetBytes(secretKey);
-        des.IV = Encoding.ASCII.GetBytes(secretKey);
-        MemoryStream ms = new MemoryStream();
-        using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write))
-        {
-            cs.Write(inputByteArray, 0, inputByteArray.Length);
-            cs.FlushFinalBlock();
-            cs.Close();
-        }
-        string str = Convert.ToBase64String(ms.ToArray());
-        ms.Close();
-        return str;
-    }
-}
-
-/// <summary>
-/// 杩涜DES瑙e瘑銆�
-/// </summary>
-/// <param name="encryptedString">瑕佽В瀵嗙殑浠ase64</param>
-/// <param name="secretKey">瀵嗛挜锛屼笖蹇呴』涓�8浣嶃��</param>
-/// <returns>宸茶В瀵嗙殑瀛楃涓层��</returns>
-public static string DesDecrypt(string encryptedString, string secretKey)
-{
-    byte[] inputByteArray = Convert.FromBase64String(encryptedString);
-    using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
-    {
-        des.Key = Encoding.ASCII.GetBytes(secretKey);
-        des.IV = Encoding.ASCII.GetBytes(secretKey);
-        MemoryStream ms = new MemoryStream();
-        using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write))
-        {
-            cs.Write(inputByteArray, 0, inputByteArray.Length);
-            cs.FlushFinalBlock();
-            cs.Close();
-        }
-        string str = Encoding.UTF8.GetString(ms.ToArray());
-        ms.Close();
-        return str;
-    }
-}
-```
-
-JAVA鐗堬細
-
-```
-/* DES瑙e瘑 */
-public static String decrypt(String message, String key) throws Exception {
-
-    byte[] bytesrc = Base64.decode(message);
-    //convertHexString(message);
-    Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
-    DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));
-    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
-    SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
-    IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));
-    cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
-    byte[] retByte = cipher.doFinal(bytesrc);
-    return new String(retByte);
-}
-
-
-/* DES鍔犲瘑 */
-public static byte[] encrypt(String message, String key) throws Exception {
-    Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
-    DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));
-    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
-    SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
-    IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));
-    cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
-    return cipher.doFinal(message.getBytes("UTF-8"));
-}
-```
-
-#### 1.6.4 DES瀵嗛挜
-
-娴嬭瘯鐜锛歛z2ih1uY
-
-鐢熶骇鐜锛氬彟澶栨彁渚涖��
-
-#### 1.6.5 璇锋眰鎶ユ枃绀轰緥
+### 璇锋眰鎶ユ枃绀轰緥
 璇锋眰鍐呭鏄庢枃锛�
 
 ```
 {
-    "Header":{
-        "Token":"2366CF921FAD44CCBB07FF9CD02FC90E",
-        "Version":"3.2.0",
-        "SystemId":100,
-        "Timestamp":1502870664
-    },
-    "Body":{
-        "Mobile":"18520322032",
-        "Password":"acb000000"
-    }
-}
-
-```
-
-璇锋眰鎶ユ枃绀轰緥锛�
-
-```
-url?RequestData=UFAYIRF21XzGoaAaEU54qoDBYaFkT2KbRpWxKZuqqltApdIneF7AjlEArPLsg3%2Fo1Pu7FHFmsKZn%0A9KJb%2BGuwx0P%2F3jzv2TgwUpVtgwEdfd0vIRfqEF4jCouldaxxVBjbHvd%2F08pUoYJDNZJLvNrJ%2BsK4%0A79de92T0Cyu4hKNMUPtVI7Tp0IC%2BBw%3D%3D&SignData=0865c7d625f90d3bb5457f5d9ac3725d
-```
-
-### 1.7 鍝嶅簲鎶ユ枃缁撴瀯
-#### 1.7.1 缁撴瀯璇存槑
-鎵�鏈夋帴鍙e搷搴斿潎閲囩敤JSON鏍煎紡锛屽鏃犵壒娈婅鏄庯紝姣忔璇锋眰鐨勮繑鍥炲�间腑锛岄兘鍖呭惈涓嬪垪瀛楁锛�
-
-鍙傛暟鍚嶇О						|绫诲瀷		|鍑虹幇瑕佹眰	|鎻忚堪  
-:----						|:---		|:------	|:---	
-Code						|int		|R			|鍝嶅簲鐮侊紝浠g爜瀹氫箟璇疯鈥滈檮褰旳 鍝嶅簲鍚楄鏄庘��
-Msg							|string		|R			|鍝嶅簲鎻忚堪
-Data						|object		|R			|姣忎釜鎺ュ彛鐗规湁鐨勫弬鏁帮紝璇﹁姣忎釜鎺ュ彛瀹氫箟
-
-
-#### 1.7.2 鍝嶅簲鎶ユ枃绀轰緥
-
-```
-{
-    "Code":200,
-    "Msg":"璋冪敤鎴愬姛",
-    "Data":{
-        "Channel":"A10086",
-        "Type":7004
-    }
+    "orderNo": 2024010311062541,
+    "orderType": 1,
+    "orderDetails": [
+        {
+            "orderNo": 2024010311062541,
+            "matnr": "test001",
+            "anfme": 10
+        }
+    ],
+    "sign": "8a7036cfe218e12f50f9107e9eb4a437"
 }
 ```
 
-
-## 2. 鎺ュ彛瀹氫箟
-
-### 2.1 瀵嗙爜鐧诲綍
-- **鎺ュ彛璇存槑锛�** 瀵嗙爜鐧诲綍
-- **鎺ュ彛鍦板潃锛�** /account/signin
-
-#### 2.1.1 璇锋眰鍙傛暟
-
-鍙傛暟鍚嶇О						|绫诲瀷		|鍑虹幇瑕佹眰	|鎻忚堪  
-:----						|:---		|:------	|:---	
-Header						|&nbsp;		|R			|璇锋眰鎶ユ枃澶�
-&emsp;Token					|string		|R			|鐢ㄦ埛鐧诲綍鍚巘oken锛屾病鏈夌櫥褰曞垯涓虹┖瀛楃涓�
-&emsp;Version				|string		|R			|鎺ュ彛鐗堟湰鍙�
-&emsp;SystemId				|int		|R			|鏈烘瀯鍙凤紝璇锋眰鐨勭郴缁烮d
-&emsp;Timestamp				|long		|R			|褰撳墠UNIX鏃堕棿鎴�
-Body						|&nbsp;		|R			|&nbsp;
-&emsp;Mobile				|string		|R			|鎵嬫満鍙�
-&emsp;Password				|string		|R			|瀵嗙爜
-
-
-璇锋眰绀轰緥锛�
+### 绛夊緟绛惧悕鎶ユ枃绀轰緥
+绛夊緟绛惧悕鎶ユ枃(宸插墧闄ign鍊笺�佸凡娣诲姞signKey鍊煎苟瀵筴ey杩涜鑷劧鎺掑簭)锛�
 
 ```
-{
-    "Header":{
-        "Token":"",
-        "Version":"3.2.0",
-        "SystemId":100,
-        "Timestamp":1502870664
-    },
-    "Body":{
-        "Mobile":"18520322032",
-        "Password":"acb000000"
-    }
-}
-
+{"orderDetails":[{"orderNo":"2024010311062541","matnr":"test001","anfme":10.0}],"orderType":1,"orderNo":"2024010311062541","signKey":"29823ebbfbc2f04a5fbb407ea926832f"}
 ```
-
-
-#### 2.1.2 杩斿洖缁撴灉
-
-鍙傛暟鍚嶇О						|绫诲瀷		|鍑虹幇瑕佹眰	|鎻忚堪  
-:----						|:---		|:------	|:---	
-Code						|int		|R			|鍝嶅簲鐮侊紝浠g爜瀹氫箟璇疯鈥滈檮褰旳 鍝嶅簲鍚楄鏄庘��
-Msg							|string		|R			|&nbsp;
-Data						|object		|R			|&nbsp;
-&emsp;UserId				|string		|R			|鐢ㄦ埛Id
-
-绀轰緥锛�
-
-```
-{
-    "Code":200,
-    "Msg":"鐧诲綍鎴愬姛",
-    "Data":{
-        "UserId":"7D916C7283434955A235C17DD9B71C64"
-    }
-}
-```
-
-
-
-### 2.2 鑾峰彇鐧诲綍鐢ㄦ埛淇℃伅
-- **鎺ュ彛璇存槑锛�** 鑾峰彇鐧诲綍鐢ㄦ埛淇℃伅
-- **鎺ュ彛鍦板潃锛�** /account/profile
-
-#### 2.2.1 璇锋眰鍙傛暟
-
-鍙傛暟鍚嶇О						|绫诲瀷		|鍑虹幇瑕佹眰	|鎻忚堪  
-:----						|:---		|:------	|:---	
-Header						|&nbsp;		|R			|璇锋眰鎶ユ枃澶�
-&emsp;Token					|string		|R			|鐢ㄦ埛鐧诲綍鍚巘oken锛屾病鏈夌櫥褰曞垯涓虹┖瀛楃涓�
-&emsp;Version				|string		|R			|鎺ュ彛鐗堟湰鍙�
-&emsp;SystemId				|int		|R			|鏈烘瀯鍙凤紝璇锋眰鐨勭郴缁烮d
-&emsp;Timestamp				|long		|R			|褰撳墠UNIX鏃堕棿鎴�
-Body						|&nbsp;		|R			|&nbsp;
-
-
-
-璇锋眰绀轰緥锛�
-
-```
-
-{
-    "Header":{
-        "Token":"CA64A439E7C344B0BA7F5C825E17C7AB",
-        "Version":"3.2.0",
-        "SystemId":100,
-        "Timestamp":1502870664
-    },
-    "Body":null
-}
-
-```
-
-
-#### 2.2.2 杩斿洖缁撴灉
-
-鍙傛暟鍚嶇О						|绫诲瀷		|鍑虹幇瑕佹眰	|鎻忚堪  
-:----						|:---		|:------	|:---	
-Code						|int		|R			|鍝嶅簲鐮侊紝浠g爜瀹氫箟璇疯鈥滈檮褰旳 鍝嶅簲鍚楄鏄庘��
-Msg							|string		|R			|&nbsp;
-Data						|object		|R			|&nbsp;
-&emsp;UserId				|string		|R			|鐢ㄦ埛Id
-&emsp;RealName				|string		|R			|濮撳悕
-&emsp;ImageUrl				|string		|R			|澶村儚
-&emsp;Score					|int		|R			|绉垎
-&emsp;Nickname				|string		|R			|鏄电О
-&emsp;Sex					|int		|R			|鎬у埆锛�0-鏈煡銆�1-鐢枫��2-濂�
-&emsp;Title					|string		|R			|澶磋
-
-
-绀轰緥锛�
-
-```
-{
-    "Code":200,
-    "Msg":"澶勭悊鎴愬姛",
-    "Data":{
-        "UserId":"7D916C7283434955A235C17DD9B71C64",
-        "RealName":"寮犱笁",
-        "ImageUrl":"https://img.xx.net/afdicew8751.png",
-        "Score":4732,
-        "Nickname":"寮犲啝鏉庢埓",
-        "Sex":1,
-        "Title":"渚犲Lv4"
-    }
-}
-```
-
-
-## 3 闄勫綍A 鍝嶅簲鐮佽鏄�
-
-鍝嶅簲鐮�	|璇存槑  
-:----	|:---
-200		|澶勭悊鎴愬姛
-301		|瑙f瀽鎶ユ枃閿欒
-302		|鏃犳晥璋冪敤鍑瘉
-303		|鍙傛暟涓嶆纭�
-500		|绯荤粺鍐呴儴閿欒
-999		|澶勭悊澶辫触
-
-
-## 4 闄勫綍B 甯佺
-
-甯佺		|璇存槑  
-:----	|:---
-RMB		|浜烘皯甯�
-HKD		|娓竵
-JPY		|鏃ュ厓
-TWD		|鏂板彴甯�
-USD		|缇庡厓
-VND		|瓒婂崡鐩�
-THB		|娉伴摙
\ No newline at end of file
+灏嗕笂闈㈢殑鎶ユ枃杩涜md5鍔犲瘑寰楀嚭鍊间负锛歚``8a7036cfe218e12f50f9107e9eb4a437```
\ No newline at end of file
diff --git a/zy-asrs-openapi/src/main/webapp/views/reportApiManage.html b/zy-asrs-openapi/src/main/webapp/views/reportApiManage.html
new file mode 100644
index 0000000..b92c9a4
--- /dev/null
+++ b/zy-asrs-openapi/src/main/webapp/views/reportApiManage.html
@@ -0,0 +1,146 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>API寮�鏀惧钩鍙� - 涓婃姤鎺ュ彛绠$悊</title>
+    <link rel="stylesheet" href="../static/css/element.css">
+    <link rel="stylesheet" href="../static/css/common.css">
+    <script type="text/javascript" src="../static/js/jquery/jquery-3.3.1.min.js"></script>
+    <script type="text/javascript" src="../static/js/vue.min.js"></script>
+    <script type="text/javascript" src="../static/js/showdown.min.js"></script>
+    <script type="text/javascript" src="../static/js/common.js"></script>
+    <script type="text/javascript" src="../static/js/element.js"></script>
+</head>
+<body>
+    <div id="app" style="display: flex;justify-content: center;flex-wrap: wrap;">
+        <div style="width: 80%;">
+            <el-card class="box-card">
+                <el-form :inline="true" :model="tableSearchParam" class="demo-form-inline">
+                    <el-form-item label="">
+                        <el-input v-model="tableSearchParam.task_no" placeholder="浠诲姟鍙�"></el-input>
+                    </el-form-item>
+                    <el-form-item>
+                        <el-button type="primary" @click="getTableData">鏌ヨ</el-button>
+                        <el-button type="primary" @click="resetParam">閲嶇疆</el-button>
+                    </el-form-item>
+                </el-form>
+                <el-table ref="singleTable" :data="tableData" style="width: 100%;">
+                    <el-table-column property="id" label="#ID">
+                    </el-table-column>
+                    <el-table-column property="wrkNo" label="宸ヤ綔鍙�">
+                    </el-table-column>
+                    <el-table-column property="taskNo" label="浠诲姟鍙�">
+                    </el-table-column>
+                    <el-table-column property="commandStatus$" label="鎸囦护鐘舵��">
+                    </el-table-column>
+                    <el-table-column show-overflow-tooltip property="durationTime" label="鎸佺画鏃堕暱">
+                    </el-table-column>
+                    <el-table-column property="commandType" label="鎸囦护绫诲瀷">
+                    </el-table-column>
+                    <el-table-column property="device" label="璁惧">
+                    </el-table-column>
+                    <el-table-column property="deviceLog" label="璁惧鎵ц淇℃伅">
+                    </el-table-column>
+                    <el-table-column property="commandDesc" label="鍛戒护鎻忚堪">
+                    </el-table-column>
+                    <el-table-column show-overflow-tooltip property="startTime$" label="寮�濮嬫椂闂�">
+                    </el-table-column>
+                    <el-table-column show-overflow-tooltip property="executeTime$" label="鎵ц鏃堕棿">
+                    </el-table-column>
+                    <el-table-column show-overflow-tooltip property="completeTime$" label="瀹屾垚鏃堕棿">
+                    </el-table-column>
+                    <el-table-column show-overflow-tooltip property="command" label="鍛戒护鎶ユ枃" width="250">
+                    </el-table-column>
+                </el-table>
+
+                <div style="margin-top: 10px;">
+                    <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
+                                   :current-page="currentPage" :page-sizes="pageSizes" :page-size="pageSize"
+                                   layout="total, sizes, prev, pager, next, jumper" :total="pageTotal">
+                    </el-pagination>
+                </div>
+            </el-card>
+        </div>
+
+        <div style="position: fixed;top: 20px;right: 20px;width: 150px;border-left: 3px solid #f0f0f0;padding-left: 15px;">
+            <div><el-button type="text" @click="switchPage('index.html')">瑙勮寖璇存槑</el-button></div>
+            <div><el-button type="text" @click="switchPage('reportCompleted.html')">浠诲姟瀹屾垚涓婃姤</el-button></div>
+            <div><el-button type="text" @click="switchPage('reportCompleted.html')">浠诲姟鍙栨秷涓婃姤</el-button></div>
+            <div><el-button type="text" @click="switchPage('reportCompleted.html')">搴撳瓨涓婃姤</el-button></div>
+            <div><el-button type="text" @click="switchPage('reportApiManage.html')">涓婃姤API绠$悊</el-button></div>
+        </div>
+    </div>
+
+    <script>
+        var app = new Vue({
+            el: '#app',
+            data: {
+                tableData: [],
+                currentPage: 1,
+                pageSizes: [16, 30, 50, 100, 150, 200],
+                pageSize: 16,
+                pageTotal: 0,
+                tableSearchParam: {
+                    task_no: null,
+                },
+            },
+            created() {
+                this.init()
+            },
+            methods: {
+                init() {
+                    this.getTableData()
+                },
+                getTableData() {
+                    let that = this;
+                    let data = this.tableSearchParam
+                    data.curr = this.currentPage
+                    data.limit = this.pageSize
+                    $.ajax({
+                        url: baseUrl + "/commandInfoLog/list/auth",
+                        headers: {
+                            'token': localStorage.getItem('token')
+                        },
+                        data: data,
+                        dataType: 'json',
+                        contentType: 'application/json;charset=UTF-8',
+                        method: 'GET',
+                        success: function(res) {
+                            if (res.code == 200) {
+                                that.tableData = res.data.records
+                                that.pageTotal = res.data.total
+                            } else {
+                                that.$message({
+                                    message: res.msg,
+                                    type: 'error'
+                                });
+                            }
+                        }
+                    });
+                },
+                handleSizeChange(val) {
+                    console.log(`姣忛〉 ${val} 鏉);
+                    this.pageSize = val
+                    this.getTableData()
+                },
+                handleCurrentChange(val) {
+                    console.log(`褰撳墠椤�: ${val}`);
+                    this.currentPage = val
+                    this.getTableData()
+                },
+                resetParam() {
+                    this.tableSearchParam = {
+                        task_no: null,
+                        status: null,
+                        wrk_no: null
+                    }
+                    this.getTableData()
+                },
+                switchPage(url) {
+                    location.href = url
+                }
+            }
+        })
+    </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/zy-asrs-openapi/src/main/webapp/views/reportCompleted.html b/zy-asrs-openapi/src/main/webapp/views/reportCompleted.html
new file mode 100644
index 0000000..abd61bf
--- /dev/null
+++ b/zy-asrs-openapi/src/main/webapp/views/reportCompleted.html
@@ -0,0 +1,218 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>API寮�鏀惧钩鍙�</title>
+    <link rel="stylesheet" href="../static/css/element.css">
+    <link rel="stylesheet" href="../static/css/common.css">
+    <script type="text/javascript" src="../static/js/jquery/jquery-3.3.1.min.js"></script>
+    <script type="text/javascript" src="../static/js/vue.min.js"></script>
+    <script type="text/javascript" src="../static/js/showdown.min.js"></script>
+    <script type="text/javascript" src="../static/js/common.js"></script>
+    <script type="text/javascript" src="../static/js/element.js"></script>
+</head>
+<body>
+    <div id="app">
+        <div id="content"></div>
+        <div style="position: fixed;top: 20px;right: 20px;width: 100px;">
+            <div style="position: fixed;top: 20px;right: 20px;width: 150px;border-left: 3px solid #f0f0f0;padding-left: 15px;">
+                <div><el-button type="text" @click="switchPage('index.html')">瑙勮寖璇存槑</el-button></div>
+                <div><el-button type="text" @click="switchPage('reportCompleted.html')">浠诲姟瀹屾垚涓婃姤</el-button></div>
+                <div><el-button type="text" @click="switchPage('reportCompleted.html')">浠诲姟鍙栨秷涓婃姤</el-button></div>
+                <div><el-button type="text" @click="switchPage('reportCompleted.html')">搴撳瓨涓婃姤</el-button></div>
+                <div><el-button type="text" @click="reportApiManage()">涓婃姤鎺ュ彛绠$悊</el-button></div>
+
+
+                <div><el-button type="text" @click="keyList()">瀵嗛挜绠$悊</el-button></div>
+            </div>
+        </div>
+
+        <el-dialog title="瀵嗛挜绠$悊" :visible.sync="keyTableVisible">
+            <el-table :data="keyTableData" v-loading="loading">
+                <el-table-column property="hostId$" label="浠撳簱"></el-table-column>
+                <el-table-column property="signKey" label="绛惧悕瀵嗛挜" width="150"></el-table-column>
+                <el-table-column property="appKey" label="鎺ュ彛璇锋眰瀵嗛挜" width="250"></el-table-column>
+                <el-table-column property="createTime$" label="鏃堕棿" width="200"></el-table-column>
+                <el-table-column label="鎿嶄綔" width="400">
+                    <template slot-scope="scope">
+                        <el-button size="mini" @click="generateSignKey(scope.row.hostId)">绛惧悕瀵嗛挜</el-button>
+                        <el-button size="mini" @click="generateAppKey(scope.row.hostId)">鎺ュ彛瀵嗛挜</el-button>
+                        <el-switch
+                                v-model="scope.row.signStatus"
+                                @change="switchChange(scope.row.hostId,scope.row.signStatus)"
+                                active-text="寮�鍚鍚�"
+                                inactive-text="鍏抽棴绛惧悕">
+                        </el-switch>
+                    </template>
+                </el-table-column>
+            </el-table>
+        </el-dialog>
+    </div>
+
+    <script>
+        showdown.setOption('tables', true);
+        var converter = new showdown.Converter()
+
+        var app = new Vue({
+            el: '#app',
+            data: {
+                keyTableVisible: false,
+                keyTableData: [],
+                loading: true
+            },
+            created() {
+                this.init()
+            },
+            methods: {
+                init() {
+                    this.introduceClick()
+                },
+                introduceClick() {
+                    $.ajax({
+                        url: "md/introduce.md",
+                        headers: {'token': localStorage.getItem('token')},
+                        method: 'GET',
+                        success: function (res) {
+                            // $("#content").html(marked.parse(res))
+                            // console.log(converter.makeHtml(res))
+                            $("#content").html(converter.makeHtml(res))
+                        }
+                    });
+                },
+                keyList() {
+                    let that = this
+                    this.keyTableVisible = true
+                    $.ajax({
+                        url: baseUrl + "/hostKey/list/auth",
+                        headers: {'token': localStorage.getItem('token')},
+                        data: {},
+                        dataType:'json',
+                        contentType:'application/json;charset=UTF-8',
+                        method: 'POST',
+                        success: function (res) {
+                            let tmp = []
+                            res.data.forEach((item, index) => {
+                                item.signStatus = item.signStatus == 1 ? true : false;
+                                tmp.push(item)
+                            });
+                            that.keyTableData = tmp
+                            that.loading = false
+                        }
+                    });
+                },
+                generateSignKey(hostId) {
+                    let that = this
+                    this.$confirm('姝ゆ搷浣滃皢瑕嗙洊鍘熺鍚嶅瘑閽�, 鏄惁缁х画?', '鎻愮ず', {
+                        confirmButtonText: '纭畾',
+                        cancelButtonText: '鍙栨秷',
+                        type: 'warning'
+                    }).then(() => {
+                        $.ajax({
+                            url: baseUrl + "/hostKey/generateSignKey/auth",
+                            headers: {'token': localStorage.getItem('token')},
+                            data: {
+                                hostId: hostId
+                            },
+                            dataType: 'json',
+                            contentType: 'application/json;charset=UTF-8',
+                            method: 'GET',
+                            success: function (res) {
+                                if (res.code === 200) {
+                                    that.$message({
+                                        type: 'success',
+                                        message: '鐢熸垚鎴愬姛'
+                                    });
+
+                                    that.keyTableData.forEach((item, index) => {
+                                        if (item.hostId == hostId) {
+                                            item.signKey = res.data.signKey
+                                        }
+                                    });
+                                } else {
+                                    that.$message({
+                                        type: 'error',
+                                        message: res.msg
+                                    });
+                                }
+                            }
+                        });
+                    }).catch(() => {
+                        //鍙栨秷
+                    });
+                },
+                generateAppKey(hostId) {
+                    let that = this
+                    this.$confirm('姝ゆ搷浣滃皢瑕嗙洊鍘熸帴鍙e瘑閽�, 鏄惁缁х画?', '鎻愮ず', {
+                        confirmButtonText: '纭畾',
+                        cancelButtonText: '鍙栨秷',
+                        type: 'warning'
+                    }).then(() => {
+                        $.ajax({
+                            url: baseUrl + "/hostKey/generateAppKey/auth",
+                            headers: {'token': localStorage.getItem('token')},
+                            data: {
+                                hostId: hostId
+                            },
+                            dataType: 'json',
+                            contentType: 'application/json;charset=UTF-8',
+                            method: 'GET',
+                            success: function (res) {
+                                if (res.code === 200) {
+                                    that.$message({
+                                        type: 'success',
+                                        message: '鐢熸垚鎴愬姛'
+                                    });
+
+                                    that.keyTableData.forEach((item, index) => {
+                                        if (item.hostId == hostId) {
+                                            item.appKey = res.data.appKey
+                                        }
+                                    });
+                                } else {
+                                    that.$message({
+                                        type: 'error',
+                                        message: res.msg
+                                    });
+                                }
+                            }
+                        });
+                    }).catch(() => {
+                        //鍙栨秷
+                    });
+                },
+                switchChange(hostId, signStatus) {
+                    let that = this
+                    //绛惧悕鏍¢獙寮�鍏�
+                    $.ajax({
+                        url: baseUrl + "/hostKey/switchSign/auth",
+                        headers: {'token': localStorage.getItem('token')},
+                        data: {
+                            hostId: hostId,
+                            signStatus: signStatus ? 1 : 0,
+                        },
+                        dataType: 'json',
+                        contentType: 'application/json;charset=UTF-8',
+                        method: 'GET',
+                        success: function (res) {
+                            if (res.code === 200) {
+                                that.$message({
+                                    type: 'success',
+                                    message: '鍒囨崲鎴愬姛'
+                                });
+                            } else {
+                                that.$message({
+                                    type: 'error',
+                                    message: res.msg
+                                });
+                            }
+                        }
+                    });
+                },
+                switchPage(url) {
+                    location.href = url
+                }
+            }
+        })
+    </script>
+</body>
+</html>
\ No newline at end of file

--
Gitblit v1.9.1