675c3b5d83b928c2bfbb84cd99a7d3f222d4432c..0a2ce614306f517929ee939c04b09df0ca4ea2c0
23 小时以前 zhang
1
0a2ce6 对比 | 目录
23 小时以前 zhang
1
aac0aa 对比 | 目录
23 小时以前 zhang
1
1994be 对比 | 目录
23 小时以前 zhang
1
7d1161 对比 | 目录
6个文件已删除
1个文件已添加
20个文件已修改
1059 ■■■■■ 已修改文件
.gitignore 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
component/component-Influxdb/target/classes/META-INF/additional-spring-configuration-metadata.json 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
component/component-Influxdb/target/classes/META-INF/spring.factories 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
component/component-Influxdb/target/classes/com/zy/component/influxdb/config/InfluxDBAutoConfiguration.class 补丁 | 查看 | 原始文档 | blame | 历史
component/component-Influxdb/target/classes/com/zy/component/influxdb/properties/InfluxDBProperties.class 补丁 | 查看 | 原始文档 | blame | 历史
component/component-Influxdb/target/classes/com/zy/component/influxdb/service/InfluxDBService.class 补丁 | 查看 | 原始文档 | blame | 历史
open-rcs/components/content/content-interface-word.html 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
open-rcs/pages/接口文档.html 483 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
version/db/cv.sql 162 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-common/src/main/java/com/zy/acs/common/domain/mq/DeviceMessage.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/java/com/zy/asrs/controller/SiteController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/java/com/zy/asrs/controller/WmsController.java 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/java/com/zy/asrs/entity/Devp.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/java/com/zy/asrs/mapper/DevpMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/java/com/zy/asrs/mapper/JobMapper.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/java/com/zy/asrs/scheduler/JobLogScheduler.java 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/java/com/zy/asrs/service/impl/DevpServiceImpl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/java/com/zy/asrs/service/impl/WrkLastnoServiceImpl.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/java/com/zy/core/model/protocol/StaProtocol.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/java/com/zy/core/operation/handler/AppleLocOperationHandler.java 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/java/com/zy/core/operation/handler/FakeUserOperationHandler.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/java/com/zy/core/operation/handler/InOperationHandler.java 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/resources/application.yml 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/resources/mapper/DevpMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/resources/mapper/JobMapper.xml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-cv/src/main/webapp/views/pipeline.html 97 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-hex/src/main/resources/application.yml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.gitignore
@@ -25,7 +25,7 @@
/nbdist/
/.nb-gradle/
*/target/
**/target/
~*.xlsx
component/component-Influxdb/target/classes/META-INF/additional-spring-configuration-metadata.json
File was deleted
component/component-Influxdb/target/classes/META-INF/spring.factories
File was deleted
component/component-Influxdb/target/classes/com/zy/component/influxdb/config/InfluxDBAutoConfiguration.class
Binary files differ
component/component-Influxdb/target/classes/com/zy/component/influxdb/properties/InfluxDBProperties.class
Binary files differ
component/component-Influxdb/target/classes/com/zy/component/influxdb/service/InfluxDBService.class
Binary files differ
open-rcs/components/content/content-interface-word.html
@@ -1029,11 +1029,14 @@
</div>
<script>
    // API配置数据
    let apiConfigs = [];
    // åŠ¨æ€åŠ è½½API配置并渲染接口内容
    function loadApiConfigs() {
        try {
            // ç›´æŽ¥å®šä¹‰API配置数据,避免CORS错误
            const apiConfigs = [
            apiConfigs = [
                {
                    "apiId": "api-task-create",
                    "name": "生成任务单",
@@ -1969,6 +1972,11 @@
            if (section) {
                section.scrollIntoView({ behavior: 'smooth' });
            }
        } else if (event.data.type === 'getApiConfigs') {
            event.source.postMessage({
                type: 'apiConfigs',
                data: apiConfigs
            }, '*');
        }
    });
</script>
open-rcs/pages/½Ó¿ÚÎĵµ.html
@@ -348,212 +348,303 @@
    // å¯¼å‡ºä¸ºWord (docx格式)
    function exportToWord() {
        const contentFrame = document.getElementById('content-frame');
        if (contentFrame && contentFrame.contentWindow) {
            try {
                console.log('开始导出Word');
        if (!contentFrame || !contentFrame.contentWindow) {
            alert('无法获取内容框架');
            return;
        }
                const contentDoc = contentFrame.contentDocument;
                const content = contentDoc.body.innerHTML;
                console.log('获取到内容,长度:', content.length);
                // æå–接口核心内容,过滤掉所有标题和元信息
                let coreContent = content;
                // ç§»é™¤æ ‡é¢˜å’Œå…ƒä¿¡æ¯
                coreContent = coreContent.replace(/RCS接口文档[\s\S]*?更新时间:[\s\S]*?\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/g, '');
                coreContent = coreContent.replace(/<h1[^>]*>.*?<\/h1>/g, '');
                coreContent = coreContent.replace(/<h2[^>]*>.*?<\/h2>/g, '');
                coreContent = coreContent.replace(/<h3[^>]*>.*?<\/h3>/g, '');
                coreContent = coreContent.replace(/<h4[^>]*>.*?<\/h4>/g, '');
                coreContent = coreContent.replace(/<h5[^>]*>.*?<\/h5>/g, '');
                coreContent = coreContent.replace(/<h6[^>]*>.*?<\/h6>/g, '');
                coreContent = coreContent.replace(/更新时间:.*?<\/p>/g, '');
                // åˆ›å»ºHTML格式的Word文档
                const htmlContent = `
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>接口文档</title>
    <style>
        body {
            font-family: 'Microsoft YaHei', Arial, sans-serif;
            margin: 40px;
            line-height: 1.6;
        }
        p {
            margin-bottom: 15px;
            text-align: justify;
        }
        pre {
            background-color: #f8f9fa;
            padding: 15px;
            border-radius: 4px;
            border: 1px solid #e9ecef;
            margin: 20px 0;
            font-family: 'Consolas', 'Monaco', monospace;
            white-space: pre-wrap;
        }
        table {
            border-collapse: collapse;
            width: 100%;
            margin: 20px 0;
            box-shadow: 0 2px 4px rgba(0,0,0,0.1);
        }
        th {
            background-color: #3498db;
            color: white;
            font-weight: bold;
            padding: 12px 15px;
            text-align: left;
        }
        td {
            border: 1px solid #ddd;
            padding: 10px 15px;
            text-align: left;
        }
        tr:nth-child(even) {
            background-color: #f8f9fa;
        }
        ul, ol {
            margin: 15px 0;
            padding-left: 30px;
        }
        li {
            margin-bottom: 8px;
        }
    </style>
</head>
<body>
    ${coreContent}
</body>
</html>
                `;
                // åˆ›å»ºBlob对象
                const blob = new Blob([htmlContent], { type: 'application/msword' });
                const url = URL.createObjectURL(blob);
                // åˆ›å»ºä¸‹è½½é“¾æŽ¥
                const link = document.createElement('a');
                link.href = url;
                link.download = '接口文档.doc';
                link.click();
                // é‡Šæ”¾URL对象
                setTimeout(() => URL.revokeObjectURL(url), 100);
                console.log('下载完成');
            } catch (e) {
                console.error('导出Word失败:', e);
                alert('导出Word失败,请重试:' + e.message);
        const handleMessage = function(event) {
            if (event.data.type === 'apiConfigs') {
                const apiConfigs = event.data.data;
                window.removeEventListener('message', handleMessage);
                generateWordDocument(apiConfigs);
            }
        } else {
            console.error('无法获取内容框架');
            alert('导出Word失败:无法获取内容框架');
        };
        window.addEventListener('message', handleMessage, { once: true });
        contentFrame.contentWindow.postMessage({ type: 'getApiConfigs' }, '*');
        setTimeout(() => {
            try {
                window.removeEventListener('message', handleMessage);
            } catch (e) {
                console.log('监听器已移除');
            }
        }, 5000);
    }
    function generateWordDocument(apiConfigs) {
        try {
            console.log('开始生成Word文档, API数量:', apiConfigs.length);
            let apiDetailsHtml = '';
            apiConfigs.forEach(function(config) {
                const methodClass = config.method.toLowerCase() === 'post' ? 'method-post' : 'method-get';
                let requestParamsHtml = '';
                if (config.request && config.request.parameters) {
                    config.request.parameters.forEach(function(param) {
                        const required = param.required ? '必填' : '选填';
                        const defaultVal = param.default !== undefined ? ' (默认值: ' + param.default + ')' : '';
                        requestParamsHtml += '<tr><td>' + param.name + '</td><td>' + param.type + '</td><td>' + required + '</td><td>' + param.description + defaultVal + '</td></tr>';
                    });
                }
                let requestExample = '';
                if (config.request && config.request.example) {
                    requestExample = JSON.stringify(config.request.example, null, 2);
                }
                let responseParamsHtml = '';
                if (config.response && config.response.parameters) {
                    config.response.parameters.forEach(function(param) {
                        responseParamsHtml += '<tr><td>' + param.name + '</td><td>' + param.type + '</td><td>' + param.description + '</td></tr>';
                    });
                }
                let responseExample = '';
                if (config.response && config.response.example) {
                    responseExample = JSON.stringify(config.response.example, null, 2);
                }
                apiDetailsHtml +=
                    '<div class="api-info">' +
                    '<h3>' + config.name + '</h3>' +
                    '<div class="api-method ' + methodClass + '">' + config.method + '</div>' +
                    '<div class="api-url">' + config.url + '</div>' +
                    '<h4>请求参数</h4>' +
                    '<table><thead><tr><th>参数名</th><th>类型</th><th>是否必填</th><th>描述</th></tr></thead><tbody>' + requestParamsHtml + '</tbody></table>' +
                    '<h4>请求示例</h4>' +
                    '<pre>' + requestExample + '</pre>' +
                    '<h4>返回参数</h4>' +
                    '<table><thead><tr><th>参数名</th><th>类型</th><th>描述</th></tr></thead><tbody>' + responseParamsHtml + '</tbody></table>' +
                    '<h4>返回示例</h4>' +
                    '<pre>' + responseExample + '</pre>' +
                    '</div>';
            });
            const apiContent = '<h1>RCS接口文档</h1>' +
                '<div class="intro">' +
                '<p>欢迎使用中扬RCS开放平台API。本文档提供了完整的接口说明,包含请求参数、返回结果以及示例代码。每个接口都提供了Mock功能,方便您快速测试和集成。</p>' +
                '</div>' +
                '<div class="note">' +
                '<div class="note-title">快速对接指南</div>' +
                '<p><strong>接口中标 * çš„为常用接口</strong>,初步对接时,只需要调通以下接口:</p>' +
                '<ul><li>1. ç”Ÿæˆä»»åŠ¡å•</li><li>2. å–消任务单</li></ul>' +
                '<p><strong>如果上层系统需要接收任务的执行状态</strong>,需要提供以下接口,供调度系统回调:</p>' +
                '<ul><li>任务执行通知接口</li></ul>' +
                '<p><strong>超时设置:</strong>中扬调度系统调用上层系统的接口,获取连接超时时间默认为 <strong>30秒</strong>,数据返回超时时间默认为 <strong>60秒</strong>,超时情况下,调度系统会返回连接失败。</p>' +
                '</div>' +
                '<div class="api-info">' +
                '<h3>对接约定</h3>' +
                '<ul><li><strong>统一格式:</strong>为接口统一并兼容,所有的参数都为字符串格式。</li><li><strong>术语约定:</strong>文本涉及到的 AGV、robot、机器人术语、CTU为同一术语,不要混淆。</li><li><strong>版本兼容:</strong>为兼容以前版本,消息上报字段会比列出的字段要多,上层平台根据业务截取需要的字段。</li><li><strong>容器定义:</strong>应用于叉车、CTU等项目中,料箱、托盘、载具都可称为容器。</li></ul>' +
                '</div>' +
                '<section class="api-section">' +
                '<h2>接口概览</h2>' +
                '<div class="api-info">' +
                '<h3>基础信息</h3>' +
                '<table><tbody><tr><td><strong>基础 URL</strong></td><td><code>http://IP:PORT</code></td></tr><tr><td><strong>请求格式</strong></td><td><code>application/json</code></td></tr><tr><td><strong>返回格式</strong></td><td><code>application/json</code></td></tr><tr><td><strong>字符编码</strong></td><td><code>UTF-8</code></td></tr></tbody></table>' +
                '</div>' +
                '<div class="api-info">' +
                '<h3>通用请求参数</h3>' +
                '<p>以下参数为所有接口的通用参数,每次调用时需要携带:</p>' +
                '<table><thead><tr><th>参数名</th><th>是否必填</th><th>描述</th></tr></thead><tbody><tr><td><code>reqTime</code></td><td>选填</td><td>请求时间戳,格式: <code>yyyy-MM-dd HH:mm:ss</code>。由上层系统设定。</td></tr><tr><td><code>tokenCode</code></td><td>选填</td><td>令牌号,由调度系统颁发。如果填写,需先在 RCS-2000 ç³»ç»Ÿé…ç½®ï¼Œä¸Šå±‚系统调用时进行填写。</td></tr></tbody></table>' +
                '</div>' +
                '<div class="api-info">' +
                '<h3>通用返回值定义</h3>' +
                '<p>所有接口的响应都遵循以下统一格式:</p>' +
                '<table><thead><tr><th>参数名</th><th>是否必填</th><th>描述</th></tr></thead><tbody><tr><td><code>code</code></td><td>必填</td><td>返回编号,<code>200</code> è¡¨ç¤ºæˆåŠŸï¼Œ<code>1~N</code> è¡¨ç¤ºå¤±è´¥</td></tr><tr><td><code>message</code></td><td>必填</td><td>返回消息,<code>请求成功</code> è¡¨ç¤ºæˆåŠŸï¼Œå†…å®¹ä¸ºè¯¦ç»†çš„é”™è¯¯æè¿°</td></tr><tr><td><code>data</code></td><td>选填</td><td>返回的数据结构,具体内容根据接口而定</td></tr></tbody></table>' +
                '</div>' +
                '</section>' +
                '<section class="api-section">' +
                '<h2>接口详情</h2>' +
                apiDetailsHtml +
                '</section>' +
                '<section class="api-section">' +
                '<h2>错误码说明</h2>' +
                '<div class="api-info">' +
                '<h3>通用错误码</h3>' +
                '<table><thead><tr><th>错误码</th><th>说明</th><th>解决方案</th></tr></thead><tbody><tr><td>200</td><td>成功</td><td>-</td></tr><tr><td>500</td><td>参数错误</td><td>检查请求参数是否完整和正确</td></tr></tbody></table>' +
                '</div>' +
                '</section>';
            const htmlContent = '<!DOCTYPE html><html><head><meta charset="UTF-8"><title>接口文档</title><style>' +
                'body { font-family: "Microsoft YaHei", Arial, sans-serif; margin: 40px; line-height: 1.6; } ' +
                'p { margin-bottom: 15px; text-align: justify; } ' +
                'pre { background-color: #f8f9fa; padding: 15px; border-radius: 4px; border: 1px solid #e9ecef; margin: 20px 0; font-family: "Consolas", "Monaco", monospace; white-space: pre-wrap; } ' +
                'table { border-collapse: collapse; width: 100%; margin: 20px 0; box-shadow: 0 2px 4px rgba(0,0,0,0.1); } ' +
                'th { background-color: #3498db; color: white; font-weight: bold; padding: 12px 15px; text-align: left; } ' +
                'td { border: 1px solid #ddd; padding: 10px 15px; text-align: left; } ' +
                'tr:nth-child(even) { background-color: #f8f9fa; } ' +
                'ul, ol { margin: 15px 0; padding-left: 30px; } ' +
                'li { margin-bottom: 8px; } ' +
                'h1, h2, h3, h4 { color: #333; margin-top: 20px; margin-bottom: 15px; } ' +
                '.api-method { display: inline-block; padding: 6px 16px; border-radius: 20px; font-weight: 700; margin-right: 12px; font-size: 13px; } ' +
                '.method-post { background: #49cc90; color: #fff; } ' +
                '.method-get { background: #61affe; color: #fff; } ' +
                '.api-url { font-family: "Courier New", "Consolas", monospace; background: #2d3748; color: #48bb78; padding: 14px 18px; margin: 15px 0; border-radius: 8px; font-size: 14px; word-break: break-all; } ' +
                '.note { background: #fff9e6; border-left: 5px solid #ffc107; padding: 20px; margin: 20px 0; border-radius: 12px; } ' +
                '.api-info { background-color: #fff; padding: 25px; margin: 20px 0; border-radius: 12px; border-left: 5px solid #0066cc; } ' +
                '</style></head><body>' + apiContent + '</body></html>';
            const blob = new Blob([htmlContent], { type: 'application/msword' });
            const url = URL.createObjectURL(blob);
            const link = document.createElement('a');
            link.href = url;
            link.download = '接口文档.doc';
            link.style.display = 'none';
            document.body.appendChild(link);
            link.click();
            document.body.removeChild(link);
            setTimeout(() => URL.revokeObjectURL(url), 100);
            console.log('Word文档下载完成');
        } catch (e) {
            console.error('生成Word文档失败:', e);
            alert('导出Word失败,请重试:' + e.message);
        }
    }
    // å¯¼å‡ºä¸ºMarkdown
    function exportToMarkdown() {
        const contentFrame = document.getElementById('content-frame');
        if (contentFrame && contentFrame.contentWindow) {
            try {
                const contentDoc = contentFrame.contentDocument;
                const content = contentDoc.body;
        if (!contentFrame || !contentFrame.contentWindow) {
            alert('无法获取内容框架');
            return;
        }
                // è½¬æ¢HTML为Markdown
                let markdown = '';
                // æŒ‰æ–‡æ¡£é¡ºåºå¤„理所有元素
                const processElement = (element) => {
                    // è¿‡æ»¤æŽ‰ä¸éœ€è¦çš„元素
                    if (element.textContent.includes('RCS接口文档') ||
                        element.textContent.includes('接口详情') ||
                        element.textContent.includes('更新时间:') ||
                        element.textContent.match(/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/)) {
                        return;
                    }
                    const tagName = element.tagName;
                    if (['H1', 'H2', 'H3', 'H4', 'H5', 'H6'].includes(tagName)) {
                        // å¤„理标题
                        const level = parseInt(tagName.substring(1));
                        const hashes = '#'.repeat(level);
                        markdown += `${hashes} ${element.textContent}\n\n`;
                    } else if (tagName === 'P') {
                        // å¤„理段落
                        markdown += `${element.textContent}\n\n`;
                    } else if (tagName === 'PRE') {
                        // å¤„理代码块
                        markdown += '```\n';
                        markdown += element.textContent;
                        markdown += '\n```\n\n';
                    } else if (tagName === 'UL' || tagName === 'OL') {
                        // å¤„理列表
                        const items = element.querySelectorAll('li');
                        items.forEach(item => {
                            const prefix = tagName === 'UL' ? '- ' : '1. ';
                            markdown += `${prefix}${item.textContent}\n`;
                        });
                        markdown += '\n';
                    } else if (tagName === 'TABLE') {
                        // å¤„理表格
                        const headers = element.querySelectorAll('th');
                        if (headers.length > 0) {
                            markdown += '| ';
                            headers.forEach(header => {
                                markdown += `${header.textContent} | `;
                            });
                            markdown += '\n';
                            // åˆ†éš”线
                            markdown += '| ';
                            headers.forEach(() => {
                                markdown += '--- | ';
                            });
                            markdown += '\n';
                        }
                        // å¤„理表格行
                        const rows = element.querySelectorAll('tr');
                        rows.forEach(row => {
                            const cells = row.querySelectorAll('td');
                            if (cells.length > 0) {
                                markdown += '| ';
                                cells.forEach(cell => {
                                    markdown += `${cell.textContent} | `;
                                });
                                markdown += '\n';
                            }
                        });
                        markdown += '\n';
                    } else if (element.children && element.children.length > 0) {
                        // å¤„理容器元素,递归处理子元素
                        Array.from(element.children).forEach(child => processElement(child));
                    }
                };
                // æŒ‰é¡ºåºå¤„理所有子元素
                Array.from(content.children).forEach(child => processElement(child));
                // åˆ›å»ºBlob对象
                const blob = new Blob([markdown], {type: 'text/markdown'});
                const url = URL.createObjectURL(blob);
                // åˆ›å»ºä¸‹è½½é“¾æŽ¥
                const link = document.createElement('a');
                link.href = url;
                link.download = '接口文档.md';
                link.click();
                // é‡Šæ”¾URL对象
                setTimeout(() => URL.revokeObjectURL(url), 100);
            } catch (e) {
                console.error('导出Markdown失败:', e);
                alert('导出Markdown失败,请重试');
        const handleMessage = function(event) {
            if (event.data.type === 'apiConfigs') {
                const apiConfigs = event.data.data;
                window.removeEventListener('message', handleMessage);
                generateMarkdownDocument(apiConfigs);
            }
        };
        window.addEventListener('message', handleMessage, { once: true });
        contentFrame.contentWindow.postMessage({ type: 'getApiConfigs' }, '*');
        setTimeout(() => {
            try {
                window.removeEventListener('message', handleMessage);
            } catch (e) {
                console.log('监听器已移除');
            }
        }, 5000);
    }
    function generateMarkdownDocument(apiConfigs) {
        try {
            console.log('开始生成Markdown文档, API数量:', apiConfigs.length);
            let apiDetailsMd = '';
            apiConfigs.forEach(function(config) {
                let requestParamsMd = '';
                if (config.request && config.request.parameters) {
                    config.request.parameters.forEach(function(param) {
                        const required = param.required ? '必填' : '选填';
                        const defaultVal = param.default !== undefined ? ' (默认值: ' + param.default + ')' : '';
                        requestParamsMd += '| ' + param.name + ' | ' + param.type + ' | ' + required + ' | ' + param.description + defaultVal + ' |\n';
                    });
                }
                let requestExample = '';
                if (config.request && config.request.example) {
                    requestExample = JSON.stringify(config.request.example, null, 2);
                }
                let responseParamsMd = '';
                if (config.response && config.response.parameters) {
                    config.response.parameters.forEach(function(param) {
                        responseParamsMd += '| ' + param.name + ' | ' + param.type + ' | ' + param.description + ' |\n';
                    });
                }
                let responseExample = '';
                if (config.response && config.response.example) {
                    responseExample = JSON.stringify(config.response.example, null, 2);
                }
                apiDetailsMd +=
                    '### ' + config.name + '\n\n' +
                    '**' + config.method + '** `' + config.url + '`\n\n' +
                    '#### è¯·æ±‚参数\n\n' +
                    '| å‚数名 | ç±»åž‹ | æ˜¯å¦å¿…å¡« | æè¿° |\n' +
                    '| --- | --- | --- | --- |\n' +
                    requestParamsMd +
                    '#### è¯·æ±‚示例\n\n' +
                    '```json\n' +
                    requestExample + '\n' +
                    '```\n\n' +
                    '#### è¿”回参数\n\n' +
                    '| å‚数名 | ç±»åž‹ | æè¿° |\n' +
                    '| --- | --- | --- |\n' +
                    responseParamsMd +
                    '#### è¿”回示例\n\n' +
                    '```json\n' +
                    responseExample + '\n' +
                    '```\n\n';
            });
            const markdown =
                '# RCS接口文档\n\n' +
                '## å¿«é€Ÿå¯¹æŽ¥æŒ‡å—\n\n' +
                '**接口中标 * çš„为常用接口**,初步对接时,只需要调通以下接口:\n\n' +
                '- 1. ç”Ÿæˆä»»åŠ¡å•\n' +
                '- 2. å–消任务单\n\n' +
                '**如果上层系统需要接收任务的执行状态**,需要提供以下接口,供调度系统回调:\n\n' +
                '- ä»»åŠ¡æ‰§è¡Œé€šçŸ¥æŽ¥å£\n\n' +
                '**超时设置:** ä¸­æ‰¬è°ƒåº¦ç³»ç»Ÿè°ƒç”¨ä¸Šå±‚系统的接口,获取连接超时时间默认为 **30秒**,数据返回超时时间默认为 **60秒**,超时情况下,调度系统会返回连接失败。\n\n' +
                '## å¯¹æŽ¥çº¦å®š\n\n' +
                '- **统一格式:** ä¸ºæŽ¥å£ç»Ÿä¸€å¹¶å…¼å®¹ï¼Œæ‰€æœ‰çš„参数都为字符串格式。\n' +
                '- **术语约定:** æ–‡æœ¬æ¶‰åŠåˆ°çš„ AGV、robot、机器人术语、CTU为同一术语,不要混淆。\n' +
                '- **版本兼容:** ä¸ºå…¼å®¹ä»¥å‰ç‰ˆæœ¬ï¼Œæ¶ˆæ¯ä¸ŠæŠ¥å­—段会比列出的字段要多,上层平台根据业务截取需要的字段。\n' +
                '- **容器定义:** åº”用于叉车、CTU等项目中,料箱、托盘、载具都可称为容器。\n\n' +
                '## æŽ¥å£æ¦‚览\n\n' +
                '### åŸºç¡€ä¿¡æ¯\n\n' +
                '| å‚æ•° | å€¼ |\n' +
                '| --- | --- |\n' +
                '| åŸºç¡€ URL | `http://IP:PORT` |\n' +
                '| è¯·æ±‚格式 | `application/json` |\n' +
                '| è¿”回格式 | `application/json` |\n' +
                '| å­—符编码 | `UTF-8` |\n\n' +
                '### é€šç”¨è¯·æ±‚参数\n\n' +
                '| å‚数名 | æ˜¯å¦å¿…å¡« | æè¿° |\n' +
                '| --- | --- | --- |\n' +
                '| `reqTime` | é€‰å¡« | è¯·æ±‚时间戳,格式: `yyyy-MM-dd HH:mm:ss`。由上层系统设定。 |\n' +
                '| `tokenCode` | é€‰å¡« | ä»¤ç‰Œå·ï¼Œç”±è°ƒåº¦ç³»ç»Ÿé¢å‘。如果填写,需先在 RCS-2000 ç³»ç»Ÿé…ç½®ï¼Œä¸Šå±‚系统调用时进行填写。 |\n\n' +
                '### é€šç”¨è¿”回值定义\n\n' +
                '| å‚数名 | æ˜¯å¦å¿…å¡« | æè¿° |\n' +
                '| --- | --- | --- |\n' +
                '| `code` | å¿…å¡« | è¿”回编号,`200` è¡¨ç¤ºæˆåŠŸï¼Œ`1~N` è¡¨ç¤ºå¤±è´¥ |\n' +
                '| `message` | å¿…å¡« | è¿”回消息,`请求成功` è¡¨ç¤ºæˆåŠŸï¼Œå†…å®¹ä¸ºè¯¦ç»†çš„é”™è¯¯æè¿° |\n' +
                '| `data` | é€‰å¡« | è¿”回的数据结构,具体内容根据接口而定 |\n\n' +
                '## æŽ¥å£è¯¦æƒ…\n\n' +
                apiDetailsMd +
                '## é”™è¯¯ç è¯´æ˜Ž\n\n' +
                '### é€šç”¨é”™è¯¯ç \n\n' +
                '| é”™è¯¯ç  | è¯´æ˜Ž | è§£å†³æ–¹æ¡ˆ |\n' +
                '| --- | --- | --- |\n' +
                '| 200 | æˆåŠŸ | - |\n' +
                '| 500 | å‚数错误 | æ£€æŸ¥è¯·æ±‚参数是否完整和正确 |\n';
            const blob = new Blob([markdown], { type: 'text/markdown;charset=utf-8' });
            const url = URL.createObjectURL(blob);
            const link = document.createElement('a');
            link.href = url;
            link.download = '接口文档.md';
            link.style.display = 'none';
            document.body.appendChild(link);
            link.click();
            document.body.removeChild(link);
            setTimeout(() => URL.revokeObjectURL(url), 100);
            console.log('Markdown文档下载完成');
        } catch (e) {
            console.error('生成Markdown文档失败:', e);
            alert('导出Markdown失败,请重试:' + e.message);
        }
    }
version/db/cv.sql
New file
@@ -0,0 +1,162 @@
/*
 Navicat Premium Data Transfer
 Source Server         : dockerMySql
 Source Server Type    : MySQL
 Source Server Version : 50744
 Source Host           : 127.0.0.1:3306
 Source Schema         : cv
 Target Server Type    : MySQL
 Target Server Version : 50744
 File Encoding         : 65001
 Date: 09/03/2026 13:09:19
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for cv_devp
-- ----------------------------
DROP TABLE IF EXISTS `cv_devp`;
CREATE TABLE `cv_devp`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `dev_no` int(11) NULL DEFAULT NULL COMMENT '编号',
  `dec_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '设备描述',
  `in_enable` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '可入',
  `out_enable` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '可出',
  `autoing` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '自动',
  `loading` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '有物',
  `canining` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '能入',
  `canouting` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '能出',
  `wrk_no` int(11) NULL DEFAULT NULL COMMENT '工作号',
  `barcode` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '条形码',
  `loc_type` smallint(6) NULL DEFAULT NULL COMMENT '库位类型',
  `status` int(11) NULL DEFAULT NULL COMMENT '状态 1:正常 0:冻结',
  `deleted` int(11) NULL DEFAULT NULL COMMENT '是否删除 1:是 0:否',
  `tenant_id` bigint(20) NULL DEFAULT NULL COMMENT '租户',
  `create_by` bigint(20) NULL DEFAULT NULL COMMENT '添加人员',
  `create_time` datetime NULL DEFAULT NULL COMMENT '添加时间',
  `update_by` bigint(20) NULL DEFAULT NULL COMMENT '修改人员',
  `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',
  `memo` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '设备表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of cv_devp
-- ----------------------------
INSERT INTO `cv_devp` VALUES (1, 1001, NULL, 'Y', 'N', 'Y', 'N', 'Y', 'Y', 0, NULL, 1, 1, 0, NULL, NULL, '2026-03-04 10:30:55', NULL, '2026-03-05 14:57:11', NULL);
INSERT INTO `cv_devp` VALUES (2, 1002, NULL, 'Y', 'N', 'Y', 'N', 'Y', 'Y', 0, NULL, 1, 1, 0, NULL, NULL, '2026-03-04 10:30:55', NULL, '2026-03-05 14:57:11', NULL);
INSERT INTO `cv_devp` VALUES (3, 1003, NULL, 'Y', 'N', 'Y', 'N', 'Y', 'Y', 0, NULL, 1, 1, 0, NULL, NULL, '2026-03-04 10:30:55', NULL, '2026-03-05 14:57:11', NULL);
INSERT INTO `cv_devp` VALUES (4, 1004, NULL, 'Y', 'N', 'Y', 'Y', 'Y', 'Y', 0, NULL, 1, 1, 0, NULL, NULL, '2026-03-04 10:30:55', NULL, '2026-03-05 14:57:11', NULL);
INSERT INTO `cv_devp` VALUES (5, 1005, NULL, 'N', 'Y', 'Y', 'Y', 'Y', 'Y', 14, NULL, 1, 1, 0, NULL, NULL, '2026-03-04 10:30:55', NULL, '2026-03-05 14:57:11', NULL);
INSERT INTO `cv_devp` VALUES (6, 1006, NULL, 'N', 'Y', 'Y', 'Y', 'Y', 'Y', 13, NULL, 1, 1, 0, NULL, NULL, '2026-03-04 10:30:55', NULL, '2026-03-05 14:57:11', NULL);
INSERT INTO `cv_devp` VALUES (7, 1007, NULL, 'N', 'Y', 'Y', 'Y', 'Y', 'Y', 9, NULL, 1, 1, 0, NULL, NULL, '2026-03-04 10:30:55', NULL, '2026-03-05 14:57:11', NULL);
INSERT INTO `cv_devp` VALUES (8, 2, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO `cv_devp` VALUES (9, 3, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-- ----------------------------
-- Table structure for cv_job
-- ----------------------------
DROP TABLE IF EXISTS `cv_job`;
CREATE TABLE `cv_job`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `task_no` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '任务号',
  `barcode` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '条形码',
  `batch_no` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '批次号',
  `sta_no` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '站点号',
  `loc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '库位号',
  `job_no` int(11) NULL DEFAULT NULL COMMENT '工作号',
  `job_sts` int(11) NULL DEFAULT NULL COMMENT '工作状态',
  `start_time` datetime NULL DEFAULT NULL COMMENT '开始时间',
  `wms_time` datetime NULL DEFAULT NULL COMMENT '入库时间',
  `rcs_time` datetime NULL DEFAULT NULL COMMENT '任务发生时间',
  `status` int(11) NULL DEFAULT NULL COMMENT '状态 1:正常 0:冻结',
  `deleted` int(11) NULL DEFAULT NULL COMMENT '是否删除 1:是 0:否',
  `tenant_id` bigint(20) NULL DEFAULT NULL COMMENT '租户',
  `create_by` bigint(20) NULL DEFAULT NULL COMMENT '添加人员',
  `create_time` datetime NULL DEFAULT NULL COMMENT '添加时间',
  `update_by` bigint(20) NULL DEFAULT NULL COMMENT '修改人员',
  `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',
  `memo` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 14 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '任务表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of cv_job
-- ----------------------------
INSERT INTO `cv_job` VALUES (7, 'TK2603054400', NULL, NULL, NULL, NULL, 8, 2, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO `cv_job` VALUES (8, 'TK2603054408', '00000011', 'TK2603054408', '1007', 'A102900101', 9, 7, '2026-03-05 13:55:03', '2026-03-05 13:55:01', '2026-03-05 13:55:09', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO `cv_job` VALUES (9, 'TK2603054404', NULL, NULL, NULL, NULL, 10, 3, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '模拟按按钮');
INSERT INTO `cv_job` VALUES (10, 'TK2603054405', NULL, NULL, NULL, NULL, 11, 3, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '模拟按按钮');
INSERT INTO `cv_job` VALUES (11, 'TK2603054406', NULL, NULL, NULL, NULL, 12, 3, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '模拟按按钮');
INSERT INTO `cv_job` VALUES (12, 'TK2603054409', '00000006', 'TK2603054409', '1007', 'A102400201', 13, 5, '2026-03-05 14:07:16', '2026-03-05 14:07:15', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO `cv_job` VALUES (13, 'TK2603054410', '00000005', 'TK2603054410', '1007', 'A102500201', 14, 5, '2026-03-05 14:14:19', '2026-03-05 14:09:20', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-- ----------------------------
-- Table structure for cv_job_log
-- ----------------------------
DROP TABLE IF EXISTS `cv_job_log`;
CREATE TABLE `cv_job_log`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `task_no` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '任务号',
  `barcode` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '条形码',
  `batch_no` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '批次号',
  `sta_no` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '站点号',
  `loc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '库位号',
  `job_no` int(11) NULL DEFAULT NULL COMMENT '工作号',
  `job_sts` int(11) NULL DEFAULT NULL COMMENT '工作状态',
  `start_time` datetime NULL DEFAULT NULL COMMENT '开始时间',
  `wms_time` datetime NULL DEFAULT NULL COMMENT '入库时间',
  `rcs_time` datetime NULL DEFAULT NULL COMMENT '任务发生时间',
  `status` int(11) NULL DEFAULT NULL COMMENT '状态 1:正常 0:冻结',
  `deleted` int(11) NULL DEFAULT NULL COMMENT '是否删除 1:是 0:否',
  `tenant_id` bigint(20) NULL DEFAULT NULL COMMENT '租户',
  `create_by` bigint(20) NULL DEFAULT NULL COMMENT '添加人员',
  `create_time` datetime NULL DEFAULT NULL COMMENT '添加时间',
  `update_by` bigint(20) NULL DEFAULT NULL COMMENT '修改人员',
  `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',
  `memo` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '任务日志表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of cv_job_log
-- ----------------------------
INSERT INTO `cv_job_log` VALUES (1, 'TK2603054397', '00000006', 'TK2603054397', '1007', 'A103200101', 2, 8, '2026-03-05 13:21:57', '2026-03-05 13:21:55', '2026-03-05 13:22:03', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO `cv_job_log` VALUES (2, 'TK2603054398', '00000011', 'TK2603054398', '1007', 'A102900101', 3, 8, '2026-03-05 13:36:45', '2026-03-05 13:36:43', '2026-03-05 13:36:50', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO `cv_job_log` VALUES (3, 'TK2603054399', '00000006', 'TK2603054399', '1007', 'A102400201', 4, 8, '2026-03-05 13:37:25', '2026-03-05 13:37:23', '2026-03-05 13:37:31', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO `cv_job_log` VALUES (4, 'TK2603054401', '00000009', 'TK2603054401', '1007', 'A102500201', 5, 8, '2026-03-05 13:43:49', '2026-03-05 13:43:47', '2026-03-05 13:43:55', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO `cv_job_log` VALUES (5, 'TK2603054402', '00000005', 'TK2603054402', '1007', 'A102600201', 6, 8, '2026-03-05 13:43:55', '2026-03-05 13:43:53', '2026-03-05 13:44:13', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO `cv_job_log` VALUES (6, 'TK2603054403', '00000012', 'TK2603054403', '1007', 'A102700201', 7, 8, '2026-03-05 13:44:14', '2026-03-05 13:44:01', '2026-03-05 13:46:10', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-- ----------------------------
-- Table structure for cv_work_lastno
-- ----------------------------
DROP TABLE IF EXISTS `cv_work_lastno`;
CREATE TABLE `cv_work_lastno`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `type` int(11) NULL DEFAULT NULL COMMENT '类型',
  `wrk_no` int(11) NULL DEFAULT NULL COMMENT '当前工作号',
  `s_no` int(11) NULL DEFAULT NULL COMMENT '起始ID',
  `e_no` int(11) NULL DEFAULT NULL COMMENT '终止ID',
  `status` int(11) NULL DEFAULT NULL COMMENT '状态 1:正常 0:冻结',
  `deleted` int(11) NULL DEFAULT NULL COMMENT '是否删除 1:是 0:否',
  `tenant_id` bigint(20) NULL DEFAULT NULL COMMENT '租户',
  `create_by` bigint(20) NULL DEFAULT NULL COMMENT '添加人员',
  `create_time` datetime NULL DEFAULT NULL COMMENT '添加时间',
  `update_by` bigint(20) NULL DEFAULT NULL COMMENT '修改人员',
  `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',
  `memo` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '工作号维护表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of cv_work_lastno
-- ----------------------------
INSERT INTO `cv_work_lastno` VALUES (1, 1, 14, 1, 8999, 1, 0, NULL, NULL, NULL, NULL, NULL, NULL);
SET FOREIGN_KEY_CHECKS = 1;
zy-acs-common/src/main/java/com/zy/acs/common/domain/mq/DeviceMessage.java
@@ -15,4 +15,7 @@
    private Long timestamp = System.currentTimeMillis();
    public DeviceMessage(String sourceHexStr) {
        this.sourceHexStr = sourceHexStr;
    }
}
zy-acs-cv/src/main/java/com/zy/asrs/controller/SiteController.java
@@ -75,7 +75,6 @@
    }
    @PostMapping("/output/site")
    @ManagerAuth(memo = "站点设备报文日志输出")
    public R siteOutput() {
zy-acs-cv/src/main/java/com/zy/asrs/controller/WmsController.java
@@ -78,98 +78,98 @@
        List<PlcErrorTableVo> list = new ArrayList<>();
        if (staProtocol.getBreakerErr()) {
            PlcErrorTableVo vo = new PlcErrorTableVo();
            vo.setStaNo(staProtocol.getSiteId());
            vo.setStaNo(staProtocol.getSiteId());
            vo.setPlcDesc("断路器故障");
            vo.setError("断路器故障");
            list.add(vo);
        }
        if (staProtocol.getInfraredErr()) {
            PlcErrorTableVo vo = new PlcErrorTableVo();
            vo.setStaNo(staProtocol.getSiteId());
            vo.setStaNo(staProtocol.getSiteId());
            vo.setPlcDesc("光电异常");
            vo.setError("光电异常");
            list.add(vo);
        }
        if (staProtocol.getOutTimeErr()) {
            PlcErrorTableVo vo = new PlcErrorTableVo();
            vo.setStaNo(staProtocol.getSiteId());
            vo.setStaNo(staProtocol.getSiteId());
            vo.setPlcDesc("运行超时");
            vo.setError("运行超时");
            list.add(vo);
        }
        if (staProtocol.getSeizeSeatErr()) {
            PlcErrorTableVo vo = new PlcErrorTableVo();
            vo.setStaNo(staProtocol.getSiteId());
            vo.setStaNo(staProtocol.getSiteId());
            vo.setPlcDesc("占位超时");
            vo.setError("占位超时");
            list.add(vo);
        }
        if (staProtocol.getWrkYgoodsN()) {
            PlcErrorTableVo vo = new PlcErrorTableVo();
            vo.setStaNo(staProtocol.getSiteId());
            vo.setStaNo(staProtocol.getSiteId());
            vo.setPlcDesc("有任务无货故障");
            vo.setError("有任务无货故障");
            list.add(vo);
        }
        if (staProtocol.getInverterErr()) {
            PlcErrorTableVo vo = new PlcErrorTableVo();
            vo.setStaNo(staProtocol.getSiteId());
            vo.setStaNo(staProtocol.getSiteId());
            vo.setPlcDesc("变频器故障");
            vo.setError("变频器故障");
            list.add(vo);
        }
        if (staProtocol.getContactErr()) {
            PlcErrorTableVo vo = new PlcErrorTableVo();
            vo.setStaNo(staProtocol.getSiteId());
            vo.setStaNo(staProtocol.getSiteId());
            vo.setPlcDesc("电机接触器故障");
            vo.setError("电机接触器故障");
            list.add(vo);
        }
        if (staProtocol.getUpcontactErr()) {
            PlcErrorTableVo vo = new PlcErrorTableVo();
            vo.setStaNo(staProtocol.getSiteId());
            vo.setStaNo(staProtocol.getSiteId());
            vo.setPlcDesc("顶升电机接触器故障");
            vo.setError("顶升电机接触器故障");
            list.add(vo);
        }
        if (staProtocol.isFrontErr()) {
            PlcErrorTableVo vo = new PlcErrorTableVo();
            vo.setStaNo(staProtocol.getSiteId());
            vo.setStaNo(staProtocol.getSiteId());
            vo.setPlcDesc("前超限");
            vo.setError("前超限");
            list.add(vo);
        }
        if (staProtocol.isBackErr()) {
            PlcErrorTableVo vo = new PlcErrorTableVo();
            vo.setStaNo(staProtocol.getSiteId());
            vo.setStaNo(staProtocol.getSiteId());
            vo.setPlcDesc("后超限");
            vo.setError("后超限");
            list.add(vo);
        }
        if (staProtocol.isHighErr()) {
            PlcErrorTableVo vo = new PlcErrorTableVo();
            vo.setStaNo(staProtocol.getSiteId());
            vo.setStaNo(staProtocol.getSiteId());
            vo.setPlcDesc("高超限");
            vo.setError("高超限");
            list.add(vo);
        }
        if (staProtocol.isLeftErr()) {
            PlcErrorTableVo vo = new PlcErrorTableVo();
            vo.setStaNo(staProtocol.getSiteId());
            vo.setStaNo(staProtocol.getSiteId());
            vo.setPlcDesc("左超限");
            vo.setError("左超限");
            list.add(vo);
        }
        if (staProtocol.isRightErr()) {
            PlcErrorTableVo vo = new PlcErrorTableVo();
            vo.setStaNo(staProtocol.getSiteId());
            vo.setStaNo(staProtocol.getSiteId());
            vo.setPlcDesc("右超限");
            vo.setError("右超限");
            list.add(vo);
        }
        if (staProtocol.isBarcodeErr()) {
            PlcErrorTableVo vo = new PlcErrorTableVo();
            vo.setStaNo(staProtocol.getSiteId());
            vo.setStaNo(staProtocol.getSiteId());
            vo.setPlcDesc("扫码失败");
            vo.setError("扫码失败");
            list.add(vo);
zy-acs-cv/src/main/java/com/zy/asrs/entity/Devp.java
@@ -136,8 +136,8 @@
    public Devp setSqlData(Devp devp) {
        this.setDevNo(devp.getDevNo());
        this.setWrkNo(devp.getWrkNo());
        this.setAutoing(devp.getAutoing() );
        this.setLoading(devp.getLoading() );
        this.setAutoing(devp.getAutoing());
        this.setLoading(devp.getLoading());
        this.setInEnable(devp.getInEnable());
        this.setOutEnable(devp.getOutEnable());
        this.setUpdateTime(new Date());
zy-acs-cv/src/main/java/com/zy/asrs/mapper/DevpMapper.java
@@ -3,10 +3,7 @@
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.zy.asrs.entity.Devp;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
@Mapper
@Repository
zy-acs-cv/src/main/java/com/zy/asrs/mapper/JobMapper.java
@@ -24,9 +24,10 @@
    Job getJobByBarcode(@Param("barcode") String barcode);
    List<Job> listJobByJobSts(@Param("jobSts") Integer jobSts);
    List<Job> listJobByJobStsAndDay(@Param("jobSts") Integer jobSts, @Param("day") Integer day);
    List<Job> listJobToLog(@Param("jobSts") Integer jobSts, @Param("day") Integer day);
zy-acs-cv/src/main/java/com/zy/asrs/scheduler/JobLogScheduler.java
@@ -4,6 +4,8 @@
import com.zy.asrs.mapper.JobMapper;
import com.zy.asrs.service.JobService;
import com.zy.core.enums.ConveyorStateType;
import com.zy.core.properties.CtuOperationConfig;
import com.zy.core.properties.CtuServiceProperties;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
@@ -24,17 +26,34 @@
    @Autowired
    private JobMapper jobMapper;
    @Autowired
    private CtuServiceProperties properties;
    //@Scheduled(cron = "0 0 2 * * ?")
    @Scheduled(cron = "*/5 * * * * ?")
    public void autoToLog() {
        List<Job> jobs = jobMapper.listJobByJobSts(ConveyorStateType.CLEARSIGNAL.getStatus());
        List<Job> jobs = jobMapper.listJobByJobStsAndDay(ConveyorStateType.CLEARSIGNAL.getStatus(),1);
        for (Job job : jobs) {
            jobService.saveJobLog(job);
        }
        jobs = jobMapper.listJobToLog(ConveyorStateType.OUTBOUND.getStatus(), 1);
        for (Job job : jobs) {
            jobService.saveJobLog(job);
        Boolean flag = true;
        List<CtuOperationConfig> operations = properties.getOperations();
        for (CtuOperationConfig config : operations) {
            if (config.getType().equals(ConveyorStateType.FAKEUSER)) {
                flag = false;
            }
        }
        if (flag) {
            jobs = jobMapper.listJobToLog(ConveyorStateType.OUTBOUND.getStatus(), 1);
            for (Job job : jobs) {
                jobService.saveJobLog(job);
            }
        } else {
            jobs = jobMapper.listJobToLog(ConveyorStateType.FAKEUSER.getStatus(), 1);
            for (Job job : jobs) {
                jobService.saveJobLog(job);
            }
        }
    }
zy-acs-cv/src/main/java/com/zy/asrs/service/impl/DevpServiceImpl.java
@@ -5,7 +5,6 @@
import com.zy.asrs.entity.Devp;
import com.zy.asrs.mapper.DevpMapper;
import com.zy.asrs.service.DevpService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import java.util.List;
@@ -23,8 +22,6 @@
            }
        }
    }
    @Override
zy-acs-cv/src/main/java/com/zy/asrs/service/impl/WrkLastnoServiceImpl.java
@@ -5,11 +5,16 @@
import com.zy.acs.framework.exception.CoolException;
import com.zy.asrs.entity.WrkLastno;
import com.zy.asrs.mapper.WrkLastnoMapper;
import com.zy.asrs.service.JobService;
import com.zy.asrs.service.WrkLastnoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service("wrkLastnoService")
public class WrkLastnoServiceImpl extends ServiceImpl<WrkLastnoMapper, WrkLastno> implements WrkLastnoService {
@Autowired
private JobService jobService;
    /**
@@ -30,18 +35,13 @@
        int sNo = wrkLastno.getSNo();
        int eNo = wrkLastno.getENo();
        workNo = workNo >= eNo ? sNo : workNo + 1;
        do {
            workNo = workNo >= eNo ? sNo : workNo + 1;
        } while (jobService.getJobByJobNo(workNo) == null);
        if (workNo > 0) {
            wrkLastno.setWrkNo(workNo);
            baseMapper.updateById(wrkLastno);
        }
        if (workNo == 0) {
            throw new CoolException("生成工作号失败,请联系管理员");
        } else {
            if (baseMapper.selectById(workNo) != null) {
                throw new CoolException("生成工作号" + workNo + "在工作档中已存在");
            }
        }
        return workNo;
    }
zy-acs-cv/src/main/java/com/zy/core/model/protocol/StaProtocol.java
@@ -111,8 +111,6 @@
    }
    @Override
    public StaProtocol clone() {
        try {
zy-acs-cv/src/main/java/com/zy/core/operation/handler/AppleLocOperationHandler.java
@@ -1,6 +1,7 @@
package com.zy.core.operation.handler;
import com.zy.acs.framework.common.Cools;
import com.zy.acs.framework.exception.CoolException;
import com.zy.asrs.controller.vo.ApplyInDto;
import com.zy.asrs.controller.vo.ApplyInRepsonseDto;
import com.zy.asrs.entity.Job;
@@ -8,10 +9,13 @@
import com.zy.asrs.service.JobService;
import com.zy.asrs.service.WmsMainService;
import com.zy.asrs.service.WrkLastnoService;
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.ConveyorStateType;
import com.zy.core.enums.SlaveType;
import com.zy.core.enums.TaskType;
import com.zy.core.model.DevpSlave;
import com.zy.core.model.Task;
import com.zy.core.model.protocol.StaProtocol;
import com.zy.core.operation.OperationHandler;
import com.zy.core.properties.CtuOperationConfig;
@@ -83,19 +87,17 @@
                        if (staProtocol.getWorkNo() >= 9991 && staProtocol.getWorkNo() <= 9992) {
                            Job job = jobService.getJobByBarcode(barcode);
                            // ç”³è¯·å…¥åº“
                            if (job == null || (job != null && job.getJobSts() == 8)) {
                            if (job == null || (job != null && job.getJobSts() == ConveyorStateType.CLEARSIGNAL.getStatus())) {
                                ApplyInRepsonseDto locOfWms = wmsMainService.getLocOfWms(applyIn(barcode, inSta.getStaNo() + "", staProtocol));
                                if (locOfWms != null) {
                                    job = new Job();
                                    job.setLoc(locOfWms.getLocNo());
                                    job.setTaskNo(locOfWms.getTaskNo());
                                    job.setBatchNo(locOfWms.getBatchNo());
                                    job.setBarcode(barcode);
                                    job.setStaNo(inSta.getTargetSta() + "");
                                    job.setJobNo(wrkLastnoService.nextWorkNo(WorkNoTypeType.WORK_NO_TYPE.type));
                                    job.setJobSts(ConveyorStateType.APPLYLOC.getStatus());
                                    job.setWmsTime(new Date());
                                    jobService.insert(job);
                                    staProtocol.setWorkNo(job.getJobNo());
                                    staProtocol.setStaNo(inSta.getTargetSta());
                                    if (MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(TaskType.WRITE, staProtocol))) {
                                        if (!jobService.insert(initJob(locOfWms, barcode, inSta.getTargetSta() + ""))) {
                                            throw new CoolException("更新输送线任务失败," + " - " + staProtocol.getWorkNo());
                                        }
                                        log.info("入库前进:{},{}", staProtocol.getWorkNo(), inSta.getTargetSta());
                                    }
                                } else {
                                    log.info("WMS未返回库位信息,条码:{},站点:{}", barcode, inSta.getStaNo());
                                }
@@ -110,6 +112,23 @@
        }
    }
    private Job initJob(ApplyInRepsonseDto locOfWms, String barcode, String staNo) {
        Job  job = new Job();
        job.setLoc(locOfWms.getLocNo());
        job.setTaskNo(locOfWms.getTaskNo());
        job.setBatchNo(locOfWms.getBatchNo());
        job.setBarcode(barcode);
        job.setStaNo(staNo);
        job.setJobNo(getWorkNo());
        job.setJobSts(ConveyorStateType.INBOUND.getStatus());
        job.setWmsTime(new Date());
        return job;
    }
    private Integer getWorkNo() {
        return wrkLastnoService.nextWorkNo(WorkNoTypeType.WORK_NO_TYPE.type);
    }
    private ApplyInDto applyIn(String barcode, String staNo, StaProtocol staProtocol) {
        ApplyInDto applyInDto = new ApplyInDto();
        applyInDto.setStaNo(staNo);
zy-acs-cv/src/main/java/com/zy/core/operation/handler/FakeUserOperationHandler.java
@@ -54,10 +54,16 @@
            if (!staProtocol.isLoading()) {
                return;
            }
            StaProtocol staProtocol5 = devpThread.getStation().get(1005);
            if (staProtocol5.isLoading()){
                log.info("1005有物,等无物之后才入库");
                return;
            }
            if (staProtocol.getWorkNo() > 0 && staProtocol.isAutoing()) {
                Job jobByWorkNo = jobService.getJobByJobNo(staProtocol.getWorkNo());
                if (jobByWorkNo != null && jobByWorkNo.getJobSts() == 1) {
                    staProtocol.setStaNo(1006);
                if (jobByWorkNo != null && jobByWorkNo.getJobSts() == ConveyorStateType.OUTBOUND.getStatus()) {
                    staProtocol.setWorkNo(9992);
                    staProtocol.setStaNo(1005);
                    boolean result = MessageQueue.offer(SlaveType.Devp, 1, new Task(TaskType.WRITE, staProtocol));
                    if (result) {
                        jobByWorkNo.setJobSts(3);
zy-acs-cv/src/main/java/com/zy/core/operation/handler/InOperationHandler.java
File was deleted
zy-acs-cv/src/main/resources/application.yml
@@ -10,11 +10,15 @@
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    #url: jdbc:mysql://127.0.0.1:3306/rcs_ctu_stable?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
    url: jdbc:mysql://127.0.0.1:3306/cv?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
    url: jdbc:mysql://192.168.133.173:3306/cv?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: xltys1995
  mvc:
    static-path-pattern: /**
logging:
  file:
    path: stock/out/cv/logs
wms:
  url: 10.10.10.220:8081
@@ -31,18 +35,18 @@
        mark: 10
        max-retries: 3
        retry-delay: 800
#      - type: FAKEUSER
#        mark: 20
#        max-retries: 2
#        retry-delay: 800
      - type: FAKEUSER
        mark: 20
        max-retries: 2
        retry-delay: 800
      - type: APPLYLOC
        mark: 30
        max-retries: 2
        retry-delay: 2000
      - type: INBOUND
        mark: 40
        max-retries: 3
        retry-delay: 500
#      - type: INBOUND
#        mark: 40
#        max-retries: 3
#        retry-delay: 500
      - type: CLEARSIGNAL
        mark: 50
        max-retries: 2
@@ -57,9 +61,7 @@
#  global-config:
#    field-strategy: 0
logging:
  file:
    path: /stock/logs
super:
  pwd: xltys1995
zy-acs-cv/src/main/resources/mapper/DevpMapper.xml
@@ -17,9 +17,10 @@
    </resultMap>
    <select id="getDevpByDevNo" resultMap="BaseResultMap">
        select * from cv_devp where dev_no = #{devNo}
        select *
        from cv_devp
        where dev_no = #{devNo}
    </select>
</mapper>
zy-acs-cv/src/main/resources/mapper/JobMapper.xml
@@ -71,10 +71,18 @@
        where job_sts = #{jobSts}
    </select>
    <select id="listJobByJobStsAndDay" resultMap="BaseResultMap">
        select *
        from cv_job
        where job_sts = #{jobSts}
          and DATEDIFF(NOW(), #{day}) > 1
    </select>
    <select id="listJobToLog" resultMap="BaseResultMap">
        select *
        from cv_job
        where job_sts = #{jobSts} and DATEDIFF(NOW(), #{day}) > 1
        where job_sts = #{jobSts}
          and DATEDIFF(NOW(), #{day}) > 1
    </select>
</mapper>
zy-acs-cv/src/main/webapp/views/pipeline.html
@@ -63,7 +63,6 @@
        }
        /* è¡¨æ ¼å®¹å™¨ */
        .table-container {
            flex: 1;
@@ -74,22 +73,22 @@
            border: 1px solid rgba(59, 130, 246, 0.3);
            backdrop-filter: blur(10px);
        }
        /* è¡¨æ ¼å®¹å™¨æ»šåŠ¨æ¡æ ·å¼ */
        .table-container::-webkit-scrollbar {
            width: 8px;
        }
        .table-container::-webkit-scrollbar-track {
            background: rgba(30, 41, 59, 0.3);
            border-radius: 4px;
        }
        .table-container::-webkit-scrollbar-thumb {
            background: #3b82f6;
            border-radius: 4px;
        }
        .table-container::-webkit-scrollbar-thumb:hover {
            background: #60a5fa;
        }
@@ -103,7 +102,7 @@
            background: transparent;
            color: #e2e8f0;
        }
        /* è®¾ç½®è¡¨æ ¼åˆ—宽,确保适应容器 */
        .modern-table th,
        .modern-table td {
@@ -117,7 +116,7 @@
            top: 0;
            z-index: 10;
        }
        /* ç¡®ä¿è¡¨æ ¼å®¹å™¨æœ‰æœ€å¤§é«˜åº¦ï¼Œä»¥ä¾¿æ»šåЍ */
        .table-container {
            max-height: calc(100vh - 200px);
@@ -256,15 +255,15 @@
        .site-card.status-normal {
            border-left: 4px solid #4ade80;
        }
        .site-card.status-warning {
            border-left: 4px solid #fbbf24;
        }
        .site-card.status-error {
            border-left: 4px solid #f87171;
        }
        .site-card.status-standby {
            border-left: 4px solid #94a3b8;
        }
@@ -685,9 +684,15 @@
        }
        @keyframes pulse {
            0% { transform: scale(1); }
            50% { transform: scale(1.2); }
            100% { transform: scale(1); }
            0% {
                transform: scale(1);
            }
            50% {
                transform: scale(1.2);
            }
            100% {
                transform: scale(1);
            }
        }
        /* IO模式按钮样式 */
@@ -735,12 +740,12 @@
                flex-direction: column;
                gap: 20px;
            }
            .dashboard-stats {
                width: 100%;
                justify-content: space-around;
            }
            .sites-grid {
                grid-template-columns: 1fr;
            }
@@ -763,29 +768,29 @@
        <main>
            <!-- ç«™ç‚¹çŠ¶æ€æ•°æ®ç›‘æŽ§ç‰ˆ -->
            <section id="site-monitor" class="main-board">
<!--                <div class="dashboard-header">-->
<!--                    <h3 class="dashboard-title">站点实时监控</h3>-->
<!--                </div>-->
                <!--                <div class="dashboard-header">-->
                <!--                    <h3 class="dashboard-title">站点实时监控</h3>-->
                <!--                </div>-->
                <!-- è¡¨æ ¼å®¹å™¨ -->
                <div class="table-container">
                    <table id="site-table" class="modern-table">
                        <thead>
                            <tr>
                                <th>站号</th>
                                <th>工作号</th>
                                <th>自动</th>
                                <th>有物</th>
                                <th>可入</th>
                                <th>可出</th>
                                <th>入库标记</th>
                                <th>空板信号</th>
                                <th>目标站</th>
                                <th>高低库位</th>
                            </tr>
                        <tr>
                            <th>站号</th>
                            <th>工作号</th>
                            <th>自动</th>
                            <th>有物</th>
                            <th>可入</th>
                            <th>可出</th>
                            <th>入库标记</th>
                            <th>空板信号</th>
                            <th>目标站</th>
                            <th>高低库位</th>
                        </tr>
                        </thead>
                        <tbody>
                            <!-- è¡¨æ ¼å†…容将在这里动态生成 -->
                        <!-- è¡¨æ ¼å†…容将在这里动态生成 -->
                        </tbody>
                    </table>
                </div>
@@ -814,22 +819,22 @@
                    <form class="detail-form" id="site-form">
                        <div class="form-group">
                            <label class="form-label" for="siteId">站号:</label>
                            <input id="siteId" name="siteId" class="form-input" type="number"
                            <input id="siteId" name="siteId" class="form-input" type="number"
                                   autocomplete="off" disabled>
                        </div>
                        <div class="form-group">
                            <label class="form-label" for="workNo">工作号:</label>
                            <input id="workNo" name="workNo" type="number" class="form-input"
                            <input id="workNo" name="workNo" type="number" class="form-input"
                                   autocomplete="off">
                        </div>
                        <div class="form-group">
                            <label class="form-label" for="staNo">目标站:</label>
                            <input id="staNo" name="staNo" type="number" class="form-input"
                            <input id="staNo" name="staNo" type="number" class="form-input"
                                   autocomplete="off">
                        </div>
                        <div class="form-group">
                            <label class="form-label" for="pakMk">入库标记:</label>
                            <input id="pakMk" name="pakMk" type="text" class="form-input"
                            <input id="pakMk" name="pakMk" type="text" class="form-input"
                                   autocomplete="off">
                        </div>
                    </form>
@@ -908,11 +913,10 @@
        }
        // èŽ·å–ç«™ç‚¹ä¿¡æ¯è¡¨
        function getSite() {
            const tableEl = $('#site-table tbody');
            ajaxRequest({
                url: `${baseUrl}/site/table/site`,
                method: 'POST',
@@ -929,7 +933,7 @@
        function renderTable(sites) {
            const tbody = $('#site-table tbody');
            tbody.empty();
            sites.forEach(site => {
                const row = createTableRow(site);
                tbody.append(row);
@@ -941,7 +945,7 @@
            const isActive = site.autoing === 'Y';
            const hasLoad = site.loading === 'Y';
            const hasWorkNo = !!site.workNo && site.workNo !== '';
            // æ ¹æ®çŠ¶æ€ç¡®å®šè¡Œæ ·å¼ç±»
            let rowClass = '';
            if (isActive) {
@@ -949,14 +953,14 @@
            } else {
                rowClass = 'row-auto-gray'; // ä¸è‡ªåŠ¨ä¸ºç°è‰²
            }
            // ç‰¹æ®ŠçŠ¶æ€è¦†ç›–
            if (hasLoad && !hasWorkNo) {
                rowClass = 'row-yellow'; // æœ‰ç‰©æ— å·¥ä½œå·ä¸ºé»„色
            } else if (!hasLoad && hasWorkNo) {
                rowClass = 'row-red'; // æ— ç‰©æœ‰å·¥ä½œå·ä¸ºçº¢è‰²
            }
            return `
                <tr data-site-id="${site.devNo}" class="${rowClass}">
                    <td>${site.devNo}</td>
@@ -991,7 +995,6 @@
        }
        // èŽ·å–è¾“é€è®¾å¤‡æ—¥å¿—è¾“å‡º
        function getSiteOutput() {
            ajaxRequest({
@@ -1023,10 +1026,10 @@
                // æ˜¾ç¤ºæ¨¡æ€æ¡†
                const modal = $('#modal-overlay');
                modal.addClass('active');
                // è®¾ç½®æ ‡é¢˜
                $('.modal-title').text(`站点 #${siteId} ç¼–辑`);
                // åŠ è½½æ•°æ®
                http.get(`${baseUrl}/site/detl/${siteId}`, null, (res) => {
                    if (res.data) {
@@ -1049,7 +1052,7 @@
        }
        // ç‚¹å‡»é®ç½©å±‚关闭
        $(document).on('click', '#modal-overlay', function(e) {
        $(document).on('click', '#modal-overlay', function (e) {
            if (e.target.id === 'modal-overlay') {
                closeModal();
            }
@@ -1065,7 +1068,7 @@
            const toast = $('#success-toast');
            $('.toast-message', toast).text(message);
            toast.addClass('show');
            // 3秒后自动隐藏
            setTimeout(() => {
                toast.removeClass('show');
zy-acs-hex/src/main/resources/application.yml
@@ -5,7 +5,7 @@
    name: rcs-hex
  # RabbitMQ配置
  rabbitmq:
    host: localhost
    host: 192.168.133.173
    port: 5672
    username: root
    password: xltys1995
@@ -26,6 +26,7 @@
#  --add-opens java.base/java.nio=ALL-UNNAMED
influxdb3:
  enabled: true
  url: http://127.0.0.1:8181
  token: apiv3_Jx1SvmBMV_kikGhc4eZJQbeGmNYN7KX1GdpoR9MClkKzMxSJ0MPKM_O2Xt3o1hVyRikMmlxZ_h9zfy6ybC5Idg
  database: rcs
  url: http://192.168.133.173:8181
  #token: apiv3_Jx1SvmBMV_kikGhc4eZJQbeGmNYN7KX1GdpoR9MClkKzMxSJ0MPKM_O2Xt3o1hVyRikMmlxZ_h9zfy6ybC5Idg
  database: rcs
  token: apiv3_116RKycNhxbf62Nys4zthC05aRD-aidzhEpEpLtsFuedhJTaCtVklNrzHs9LHxBWMuzDclBHVgToGoQuWGiIIA