From 88880cf067bf4d3aacdf9ba70353b731888cf9fe Mon Sep 17 00:00:00 2001
From: baoshiwei <baoshiwei@shlanbao.cn>
Date: 星期一, 27 三月 2023 10:57:30 +0800
Subject: [PATCH] 实时数据接口与移动端接口

---
 jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/entity/DryResult.java                        |   99 +++
 jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/IDryOrderService.java                |    4 
 jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryRealTimeDataServiceImpl.java |  214 ++++++
 jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/DrySocketConst.java                                       |   33 +
 jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/DryOrderTrendVo.java                      |   43 +
 jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/MybatisPlusSaasConfig.java                                 |    8 
 jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryOrderTrendController.java      |  344 +++++-----
 jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/IDryRealTimeDataService.java         |   10 
 jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/DryOrderVo.java                           |   83 ++
 jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/RealTimeDataVo.java                       |   66 ++
 jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryOrderServiceImpl.java        |    8 
 jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryOrderTrendServiceImpl.java   |   18 
 jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryHelloController.java           |   37 +
 jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/IDryResultService.java               |   14 
 jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/entity/DryHerb.java                          |   60 +
 jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryResultController.java          |  178 +++++
 jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryResultServiceImpl.java       |   19 
 db/nginx/nginx.pem                                                                                                     |   76 ++
 jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/websocket/DrySocket.java                     |  214 ++++++
 jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryRealTimeDataController.java    |   47 +
 jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java                                             |   12 
 jeecg-boot-base-core/src/main/java/org/jeecg/config/WebSocketConfig.java                                               |    1 
 jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/entity/DryEquipment.java                     |    8 
 jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/entity/DryOrderTrend.java                    |   47 +
 jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/common/CacheConstants.java                   |   21 
 db/nginx/nginx.key                                                                                                     |   27 
 jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryOrderController.java           |   23 
 jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mapper/DryOrderMapper.java                   |    4 
 jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/IDryOrderTrendService.java           |    4 
 db/herb.sql                                                                                                            |    2 
 jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mapper/xml/DryResultMapper.xml               |    5 
 jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mapper/DryResultMapper.java                  |   17 
 jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/entity/DryOrder.java                         |   41 +
 jeecg-module-dry/jeecg-module-dry-start/src/main/resources/logback-spring.xml                                          |   77 ++
 jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mapper/xml/DryOrderMapper.xml                |    6 
 35 files changed, 1,651 insertions(+), 219 deletions(-)

diff --git a/db/herb.sql b/db/herb.sql
index 62a14c1..20dbb03 100644
--- a/db/herb.sql
+++ b/db/herb.sql
@@ -1,5 +1,5 @@
 CREATE database if NOT EXISTS `herb` default character set utf8mb4 collate utf8mb4_general_ci;
-USE `hreb`;
+USE `herb`;
 
 
 /*
diff --git a/db/nginx/nginx.key b/db/nginx/nginx.key
new file mode 100644
index 0000000..7bd913f
--- /dev/null
+++ b/db/nginx/nginx.key
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpAIBAAKCAQEAsd7TtPzeC0RKlIt0CeBej7JauxxBWnKFSQNP0jVPp0bzANlE
+OW8j22s8lJshGogSiyAQcS4+uecnz/uoyIsujXhgvgUO+Mp2Q4/WC2fMhIKCSYk5
+7LbARM7870XIy+9GLAapvrMwUG4vipJnQbwH0x49RtxFjsaOE6ZfmGtfU0NY+1dZ
+yS9Xe8AXveEQLGxB1JPwI/ocR9bxFTalp7AL1tD1UFpS5BOeShx2dKEtVnI/YMGT
+DeAOjcd8HjXwP6H/rGTYaW+p0yM9McLh4B2Z0eHRFblvLfKoWh8E+EBGPmn0ntuR
+ZKHV87i3FKO4cepuAE0Ie2ZEJPE0kmSGuG1ZYwIDAQABAoIBAA0d8pzZPQK1sY5M
+zmzgB/ku3PQJfGRQJ7YfsWY+Gjaqy8bXPunBYXKP8PLAketj94IdBjligKuy+UOk
+Omk3omI6a1/3/YepXplS5SUILZPkD/meThA/1eP9I7f9fHZVmeYrQ59VlY2I4qak
+b0rws98Ezt4H5nVF/TpDva7+1BPOtuO6lUa04XBPsFajKJWjYvOFa4VfgsRt3w18
+AxiCfE4DRRKH+ybc2zUwtOH2C+w9E/qgpDhAWTfqvAnapz7IF9Qx+9H2jmCPe8ya
+pDq5hdEMYrf0a1czRLN5DxtPTSbtw3l47PdeWkKvGlfB30ZO+j4lFoW9q2lnceTi
+fR4Au+ECgYEA87ypudeyvFf+Ax0mlyQoLQUXeUXtN9mkaQbrSifLq7u3N/snQcKP
+fORD6OiqXmaGTHsxiZZ4bmGPLrR6F4JT2mgAt2AT3vza+NGp7WARKBpm7hSyN5lP
+/g3qw5RLXkAou+eExbg3iG1nfJBzIovc2O0gM8u4QNWJmNGidSFIUHECgYEAutHN
+MbL5jXal62aKvF3rKvTc3bEGXqIt5crcdlPKe7q4HOZVCXVrOzD8uhyFTTNZ9Eoe
+RG1B8JDdJRKCh1sVHlAbdFwhIy71xmj5E5LdpM09WVGxZDNnnB2anTguuV49R8zF
+Noy5CN/sAMmRaVeNeUJ1hapR1qc8NftSW0wl8RMCgYEA8lPS02h21fcOHv5ujbpv
+D0OOsQ4q6WpDogA1Eoc6YcXCRbA4uZK8okk4k2ovaKe6QnQBLnAh0GzCtIbPFGyI
+/g6FF8w4NW1kMBoUPmNS63JEf9Sn08tj0oz3qffYbx6O4TMvuHyNCeDsENZ1AhXY
+PvyTFawnxp4HrZ5PTPEIOqECgYBiIQGfMVtTqxbL5zjIaKy2C5hX+jxWSOnC4iOb
+I7gf9Zvv0iyoozyIAts9Bu4d9vMxFh1/48PXEMCYUHivkHAvU/SX0iy1xlzisxDh
+7yrs/cFTwU1kTHwHzKUCIBiq1Y1qwWx1ksU+nB/i6f2vT4XIQ9hnNWd3ULCXykMg
+IYdscQKBgQCb4TcSFmZ1FiJEcRhe4Hi1jj3Q7gpW8fx7QH6c0Re9+FTeMnFFkNvd
+PWY1LL+NDphoPDBeifyxj15X6j0+wtn2mb7X2r5D8i/mEAKExKE6t9TZiqzrC3sp
+FOAC3sSQlfDoq2pFr9njQ0Ib3EC3DNoNbfLRM0Nb93vBhoHtYfEmpg==
+-----END RSA PRIVATE KEY-----
diff --git a/db/nginx/nginx.pem b/db/nginx/nginx.pem
new file mode 100644
index 0000000..7b4d6e9
--- /dev/null
+++ b/db/nginx/nginx.pem
@@ -0,0 +1,76 @@
+-----BEGIN CERTIFICATE-----
+MIIHkjCCBXqgAwIBAgIQBJQUPEv6WylvZlJzpb+N6DANBgkqhkiG9w0BAQsFADBc
+MQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xNDAyBgNVBAMT
+K1JhcGlkU1NMIEdsb2JhbCBUTFMgUlNBNDA5NiBTSEEyNTYgMjAyMiBDQTEwHhcN
+MjMwMjEwMDAwMDAwWhcNMjQwMjEyMjM1OTU5WjAYMRYwFAYDVQQDDA0qLnNobGFu
+YmFvLmNuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsd7TtPzeC0RK
+lIt0CeBej7JauxxBWnKFSQNP0jVPp0bzANlEOW8j22s8lJshGogSiyAQcS4+uecn
+z/uoyIsujXhgvgUO+Mp2Q4/WC2fMhIKCSYk57LbARM7870XIy+9GLAapvrMwUG4v
+ipJnQbwH0x49RtxFjsaOE6ZfmGtfU0NY+1dZyS9Xe8AXveEQLGxB1JPwI/ocR9bx
+FTalp7AL1tD1UFpS5BOeShx2dKEtVnI/YMGTDeAOjcd8HjXwP6H/rGTYaW+p0yM9
+McLh4B2Z0eHRFblvLfKoWh8E+EBGPmn0ntuRZKHV87i3FKO4cepuAE0Ie2ZEJPE0
+kmSGuG1ZYwIDAQABo4IDkjCCA44wHwYDVR0jBBgwFoAU8JyF/aKffY/JaLvV1IlN
+Hb7TkP8wHQYDVR0OBBYEFJzhNUzeA/nCFFHZ5w00mCEnr377MCUGA1UdEQQeMByC
+DSouc2hsYW5iYW8uY26CC3NobGFuYmFvLmNuMA4GA1UdDwEB/wQEAwIFoDAdBgNV
+HSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwgZ8GA1UdHwSBlzCBlDBIoEagRIZC
+aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL1JhcGlkU1NMR2xvYmFsVExTUlNBNDA5
+NlNIQTI1NjIwMjJDQTEuY3JsMEigRqBEhkJodHRwOi8vY3JsNC5kaWdpY2VydC5j
+b20vUmFwaWRTU0xHbG9iYWxUTFNSU0E0MDk2U0hBMjU2MjAyMkNBMS5jcmwwPgYD
+VR0gBDcwNTAzBgZngQwBAgEwKTAnBggrBgEFBQcCARYbaHR0cDovL3d3dy5kaWdp
+Y2VydC5jb20vQ1BTMIGHBggrBgEFBQcBAQR7MHkwJAYIKwYBBQUHMAGGGGh0dHA6
+Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBRBggrBgEFBQcwAoZFaHR0cDovL2NhY2VydHMu
+ZGlnaWNlcnQuY29tL1JhcGlkU1NMR2xvYmFsVExTUlNBNDA5NlNIQTI1NjIwMjJD
+QTEuY3J0MAkGA1UdEwQCMAAwggF9BgorBgEEAdZ5AgQCBIIBbQSCAWkBZwB1AHb/
+iD8KtvuVUcJhzPWHujS0pM27KdxoQgqf5mdMWjp0AAABhjkEJJgAAAQDAEYwRAIg
+D6c8bJcNM1KcgxIWSxUiB8k/iymyBFiiFKmuiiYwYZUCIGQIVF39gA3sx5l6Xb+D
+VdRaqfZ1weRkc2WW38DqB9oXAHYAc9meiRtMlnigIH1HneayxhzQUV5xGSqMa4AQ
+esF3crUAAAGGOQQkwwAABAMARzBFAiAjebSFq6by4qwW89fwpE3+Z2j37jMQRAJd
+fLBNqMZu/QIhAL0o9lF8nPS/Tv516LUt/yV8k3TjDiGG/SNqKIGJ5uQUAHYASLDj
+a9qmRzQP5WoC+p0w6xxSActW3SyB2bu/qznYhHMAAAGGOQQkiAAABAMARzBFAiAO
+zy7LipK499miZzKIqcU+QC8GdoUXTm3MlrWTbg+0hQIhANdOpLBwy/GfHD4i9u2O
+hMikx80LPL0cg7qAdJiZFVQUMA0GCSqGSIb3DQEBCwUAA4ICAQCGlBraan8PbxhV
+hZW0bOPxVBUx72M37mA4A3NAu0KEaboBgG1qrK835/Jp/vYZpptd4Z7maKzixCXT
+OL7J9+D7raN02oct6MDXb+uc+BWgYwnmwj9YgmS01Xs6UQLEAMRKaDENmt30OUXp
+n/ZghLRAliyGtEcyn4yJFODkUBJbi9m2VrRD+XdCZJYEStxmM2DuEVGpIAEDc+aC
+DoSUe/wuLJf3iUOSVQKLfYC/zNuB7FzSVSv/FphVt1EwlWD2RqSEoDgdzCwbD/pH
+p+8yjMDUHQZW6bSYDrwdYllq/NL/5PlDPdOiUUvmKNeOrJ1nY6vu0wkvHq55Agsl
+juWfyj8m2oCzURN78ONIJaEs3CR+9URM1xh+3ZjFWnzkmrc7WjGXTLDxX6tWDbcU
+qSBwLf4KDBwfWVcIGbXkoH/dvdF/boGJAx2ho9Sv/pMRQZ3xHjSI2MFAvGNocRBm
+tRN+TZXxhpQ7LSJdDyNKHvr9iV5sNTjPLpkpm2AXs3e520wXmtQyT5Hn3FmFFmt9
+srERXJL9VsQj20cKQth92N0ZKwVyiPKJo0PKDDwmSzAEsFgxHHE4y4itPY/nFN7y
+FYrtkhSCFwUHuwFZFyv9ZWAMF5Ikv2ivk2ujIykEGTGqlinup+rJTJwb078/Psjp
+ndWKtX0hCd4Vscz+L5Nz68duMQXobg==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFyzCCBLOgAwIBAgIQCgWbJfVLPYeUzGYxR3U4ozANBgkqhkiG9w0BAQsFADBh
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
+QTAeFw0yMjA1MDQwMDAwMDBaFw0zMTExMDkyMzU5NTlaMFwxCzAJBgNVBAYTAlVT
+MRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE0MDIGA1UEAxMrUmFwaWRTU0wgR2xv
+YmFsIFRMUyBSU0E0MDk2IFNIQTI1NiAyMDIyIENBMTCCAiIwDQYJKoZIhvcNAQEB
+BQADggIPADCCAgoCggIBAKY5PJhwCX2UyBb1nelu9APen53D5+C40T+BOZfSFaB0
+v0WJM3BGMsuiHZX2IHtwnjUhLL25d8tgLASaUNHCBNKKUlUGRXGztuDIeXb48d64
+k7Gk7u7mMRSrj+yuLSWOKnK6OGKe9+s6oaVIjHXY+QX8p2I2S3uew0bW3BFpkeAr
+LBCU25iqeaoLEOGIa09DVojd3qc/RKqr4P11173R+7Ub05YYhuIcSv8e0d7qN1sO
+1+lfoNMVfV9WcqPABmOasNJ+ol0hAC2PTgRLy/VZo1L0HRMr6j8cbR7q0nKwdbn4
+Ar+ZMgCgCcG9zCMFsuXYl/rqobiyV+8U37dDScAebZTIF/xPEvHcmGi3xxH6g+dT
+CjetOjJx8sdXUHKXGXC9ka33q7EzQIYlZISF7EkbT5dZHsO2DOMVLBdP1N1oUp0/
+1f6fc8uTDduELoKBRzTTZ6OOBVHeZyFZMMdi6tA5s/jxmb74lqH1+jQ6nTU2/Mma
+hGNxUuJpyhUHezgBA6sto5lNeyqc+3Cr5ehFQzUuwNsJaWbDdQk1v7lqRaqOlYjn
+iomOl36J5txTs0wL7etCeMRfyPsmc+8HmH77IYVMUOcPJb+0gNuSmAkvf5QXbgPI
+Zursn/UYnP9obhNbHc/9LYdQkB7CXyX9mPexnDNO7pggNA2jpbEarLmZGi4grMmf
+AgMBAAGjggGCMIIBfjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBTwnIX9
+op99j8lou9XUiU0dvtOQ/zAfBgNVHSMEGDAWgBQD3lA1VtFMu2bwo+IbG8OXsj3R
+VTAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC
+MHYGCCsGAQUFBwEBBGowaDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNl
+cnQuY29tMEAGCCsGAQUFBzAChjRodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20v
+RGlnaUNlcnRHbG9iYWxSb290Q0EuY3J0MEIGA1UdHwQ7MDkwN6A1oDOGMWh0dHA6
+Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RDQS5jcmwwPQYD
+VR0gBDYwNDALBglghkgBhv1sAgEwBwYFZ4EMAQEwCAYGZ4EMAQIBMAgGBmeBDAEC
+AjAIBgZngQwBAgMwDQYJKoZIhvcNAQELBQADggEBAAfjh/s1f5dDdfm0sNm74/dW
+MbbsxfYV1LoTpFt+3MSUWvSbiPQfUkoV57b5rutRJvnPP9mSlpFwcZ3e1nSUbi2o
+ITGA7RCOj23I1F4zk0YJm42qAwJIqOVenR3XtyQ2VR82qhC6xslxtNf7f2Ndx2G7
+Mem4wpFhyPDT2P6UJ2MnrD+FC//ZKH5/ERo96ghz8VqNlmL5RXo8Ks9rMr/Ad9xw
+Y4hyRvAz5920myUffwdUqc0SvPlFnahsZg15uT5HkK48tHR0TLuLH8aRpzh4KJ/Y
+p0sARNb+9i1R4Fg5zPNvHs2BbIve0vkwxAy+R4727qYzl3027w9jEFC6HMXRaDc=
+-----END CERTIFICATE-----
diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/DrySocketConst.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/DrySocketConst.java
new file mode 100644
index 0000000..31e0610
--- /dev/null
+++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/DrySocketConst.java
@@ -0,0 +1,33 @@
+package org.jeecg.common.constant;
+
+/**
+ * VXESocket 甯搁噺
+ * @author: jeecg-boot
+ */
+public class DrySocketConst {
+
+    /**
+     * 娑堟伅绫诲瀷
+     */
+    public static final String TYPE = "type";
+
+    /**
+     * 娑堟伅鏁版嵁
+     */
+    public static final String DATA = "data";
+
+    /**
+     * 娑堟伅绫诲瀷锛氬績璺虫娴�
+     */
+    public static final String TYPE_HB = "heart_beat";
+    /**
+     * 娑堟伅绫诲瀷锛氶�氱敤鏁版嵁浼犻��
+     */
+    public static final String TYPE_CSD = "common_send_date";
+
+    /**
+     * 娑堟伅绫诲瀷锛氬疄鏃舵暟鎹笂浼�
+     */
+    public static final String TYPE_RDT = "real_time_data";
+
+}
diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/config/WebSocketConfig.java b/jeecg-boot-base-core/src/main/java/org/jeecg/config/WebSocketConfig.java
index af51cb9..fdbb48b 100644
--- a/jeecg-boot-base-core/src/main/java/org/jeecg/config/WebSocketConfig.java
+++ b/jeecg-boot-base-core/src/main/java/org/jeecg/config/WebSocketConfig.java
@@ -12,6 +12,7 @@
  */
 @Configuration
 public class WebSocketConfig {
+
     /**
      * 	娉ㄥ叆ServerEndpointExporter锛�
      * 	杩欎釜bean浼氳嚜鍔ㄦ敞鍐屼娇鐢ㄤ簡@ServerEndpoint娉ㄨВ澹版槑鐨刉ebsocket endpoint
diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/MybatisPlusSaasConfig.java b/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/MybatisPlusSaasConfig.java
index 653818a..6ed3ba1 100644
--- a/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/MybatisPlusSaasConfig.java
+++ b/jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/MybatisPlusSaasConfig.java
@@ -67,6 +67,14 @@
         //TENANT_TABLE.add("demo");
         //3.online绉熸埛闅旂娴嬭瘯
         //TENANT_TABLE.add("ceapp_issue");
+
+        TENANT_TABLE.add("dry_eqp_type");
+        TENANT_TABLE.add("dry_equipment");
+        TENANT_TABLE.add("dry_eqp_type");
+        TENANT_TABLE.add("dry_herb");
+        TENANT_TABLE.add("dry_herb_type");
+        TENANT_TABLE.add("dry_order");
+        TENANT_TABLE.add("dry_shop");
     }
 
 
diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java b/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java
index 57a0186..198ddd0 100644
--- a/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java
+++ b/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java
@@ -120,14 +120,14 @@
         filterChainDefinitionMap.put("/swagger**/**", "anon");
         filterChainDefinitionMap.put("/webjars/**", "anon");
         filterChainDefinitionMap.put("/v2/**", "anon");
-        
+
         filterChainDefinitionMap.put("/sys/annountCement/show/**", "anon");
 
         //绉湪鎶ヨ〃鎺掗櫎
         filterChainDefinitionMap.put("/jmreport/**", "anon");
         filterChainDefinitionMap.put("/**/*.js.map", "anon");
         filterChainDefinitionMap.put("/**/*.css.map", "anon");
-        
+
         //澶у睆妯℃澘渚嬪瓙
         filterChainDefinitionMap.put("/test/bigScreen/**", "anon");
         filterChainDefinitionMap.put("/bigscreen/template1/**", "anon");
@@ -140,6 +140,7 @@
         filterChainDefinitionMap.put("/websocket/**", "anon");//绯荤粺閫氱煡鍜屽叕鍛�
         filterChainDefinitionMap.put("/newsWebsocket/**", "anon");//CMS妯″潡
         filterChainDefinitionMap.put("/vxeSocket/**", "anon");//JVxeTable鏃犵棔鍒锋柊绀轰緥
+        filterChainDefinitionMap.put("/drySocket/**", "anon");//骞茬嚗鏈洪�氫俊
 
         //鎬ц兘鐩戞帶鈥斺�斿畨鍏ㄩ殣鎮f硠闇睺OEKN锛坉urid杩炴帴姹犱篃鏈夛級
         //filterChainDefinitionMap.put("/actuator/**", "anon");
@@ -147,7 +148,12 @@
         filterChainDefinitionMap.put("/test/seata/**", "anon");
 
         // 骞茬嚗璁惧瀹炴椂鏁版嵁涓婁紶
-        filterChainDefinitionMap.put("/dry/dryOrder/sendRealTimeData", "anon");
+        //filterChainDefinitionMap.put("/dry/dryOrder/**", "anon");
+
+        // 骞茬嚗娴嬭瘯
+        filterChainDefinitionMap.put("/dry/dryResult/**", "anon");
+        filterChainDefinitionMap.put("/dry/real/**", "anon");
+
 
         // 娣诲姞鑷繁鐨勮繃婊ゅ櫒骞朵笖鍙栧悕涓簀wt
         Map<String, Filter> filterMap = new HashMap<String, Filter>(1);
diff --git a/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/common/CacheConstants.java b/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/common/CacheConstants.java
new file mode 100644
index 0000000..b241dc3
--- /dev/null
+++ b/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/common/CacheConstants.java
@@ -0,0 +1,21 @@
+package org.jeecg.modules.dry.common;
+
+public interface CacheConstants {
+    enum RedisKeyEnum{
+        WORK_ORDER("workOrder","宸ュ崟MAP");
+        private String code;
+        private String text;
+        RedisKeyEnum(String code, String text) {
+            this.code = code;
+            this.text = text;
+        }
+
+        public String getCode() {
+            return code;
+        }
+
+        public String getText() {
+            return text;
+        }
+    }
+}
diff --git a/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/entity/DryEquipment.java b/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/entity/DryEquipment.java
index 7b318b9..3c1f6b6 100644
--- a/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/entity/DryEquipment.java
+++ b/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/entity/DryEquipment.java
@@ -10,6 +10,7 @@
 import com.baomidou.mybatisplus.annotation.TableLogic;
 import lombok.Data;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import org.jeecg.modules.dry.vo.RealTimeDataVo;
 import org.springframework.format.annotation.DateTimeFormat;
 import org.jeecgframework.poi.excel.annotation.Excel;
 import org.jeecg.common.aspect.annotation.Dict;
@@ -82,4 +83,11 @@
 	@Excel(name = "绉熸埛id", width = 15)
     @ApiModelProperty(value = "绉熸埛id")
     private Integer tenantId;
+
+    public DryEquipment() {
+    }
+    public DryEquipment(RealTimeDataVo realTimeDataVo) {
+        this.code = realTimeDataVo.getMachineid();
+        this.tenantId = realTimeDataVo.getTenantid();
+    }
 }
diff --git a/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/entity/DryHerb.java b/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/entity/DryHerb.java
index 07452be..673734b 100644
--- a/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/entity/DryHerb.java
+++ b/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/entity/DryHerb.java
@@ -10,6 +10,7 @@
 import com.baomidou.mybatisplus.annotation.TableLogic;
 import lombok.Data;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import org.jeecg.modules.dry.vo.RealTimeDataVo;
 import org.springframework.format.annotation.DateTimeFormat;
 import org.jeecgframework.poi.excel.annotation.Excel;
 import org.jeecg.common.aspect.annotation.Dict;
@@ -61,14 +62,14 @@
 	@Excel(name = "骞茬嚗鏂规硶", width = 15)
     @ApiModelProperty(value = "骞茬嚗鏂规硶")
     private String dryMethod;
-	/**骞茬嚗鏃堕棿*/
-	@Excel(name = "骞茬嚗鏃堕棿", width = 15)
-    @ApiModelProperty(value = "骞茬嚗鏃堕棿")
-    private Integer dryTime;
-	/**骞茬嚗娓╁害*/
-	@Excel(name = "骞茬嚗娓╁害", width = 15)
-    @ApiModelProperty(value = "骞茬嚗娓╁害")
-    private String dryTemp;
+//	/**骞茬嚗鏃堕棿*/
+//	@Excel(name = "骞茬嚗鏃堕棿", width = 15)
+//    @ApiModelProperty(value = "骞茬嚗鏃堕棿")
+//    private Integer dryTime;
+//	/**骞茬嚗娓╁害*/
+//	@Excel(name = "骞茬嚗娓╁害", width = 15)
+//    @ApiModelProperty(value = "骞茬嚗娓╁害")
+//    private String dryTemp;
 	/**娉ㄦ剰浜嬮」*/
 	@Excel(name = "娉ㄦ剰浜嬮」", width = 15)
     @ApiModelProperty(value = "娉ㄦ剰浜嬮」")
@@ -105,4 +106,47 @@
     @Excel(name = "鐩爣鍚按鐜�", width = 15)
     @ApiModelProperty(value = "鐩爣鍚按鐜�")
     private Double target;
+    /**鎶曟枡閲�*/
+    @Excel(name = "鎶曟枡閲�", width = 15)
+    @ApiModelProperty(value = "鎶曟枡閲�")
+    private Integer feed;
+    /**棰勮骞茬嚗鏃堕棿*/
+    @Excel(name = "棰勮骞茬嚗鏃堕棿", width = 15)
+    @ApiModelProperty(value = "棰勮骞茬嚗鏃堕棿")
+    private Integer et;
+    /**鐑娓╁害*/
+    @Excel(name = "鐑娓╁害", width = 15)
+    @ApiModelProperty(value = "鐑娓╁害")
+    private Double windTemp;
+    /**鐜娓╁害*/
+    @Excel(name = "鐜娓╁害", width = 15)
+    @ApiModelProperty(value = "鐜娓╁害")
+    private Double envTemp;
+    /**鐜婀垮害*/
+    @Excel(name = "鐜婀垮害", width = 15)
+    @ApiModelProperty(value = "鐜婀垮害")
+    private Double envHum;
+    /**鑽℃枡寤舵椂ms*/
+    @Excel(name = "鑽℃枡寤舵椂ms", width = 15)
+    @ApiModelProperty(value = "鑽℃枡寤舵椂ms")
+    private Integer delay;
+    /**缈绘枡娆℃暟*/
+    @Excel(name = "缈绘枡娆℃暟", width = 15)
+    @ApiModelProperty(value = "缈绘枡娆℃暟")
+    private Integer turn;
+
+    public DryHerb(){}
+    public DryHerb(RealTimeDataVo realTimeDataVo) {
+        this.code = realTimeDataVo.getIndex() + "";
+        this.delay = realTimeDataVo.getDelay();
+        this.name = realTimeDataVo.getName();
+        this.delay = realTimeDataVo.getDelay();
+        this.turn = realTimeDataVo.getTurntime();
+        this.feed = realTimeDataVo.getWeight1();
+        this.initial = realTimeDataVo.getMoisture1();
+        this.target = realTimeDataVo.getMoisture3();
+        this.windTemp = realTimeDataVo.getTemp3();
+        this.et = realTimeDataVo.getTime1();
+        this.tenantId = realTimeDataVo.getTenantid();
+    }
 }
diff --git a/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/entity/DryOrder.java b/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/entity/DryOrder.java
index 527fc59..29c3e0b 100644
--- a/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/entity/DryOrder.java
+++ b/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/entity/DryOrder.java
@@ -8,6 +8,7 @@
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.ToString;
 import org.springframework.format.annotation.DateTimeFormat;
 import org.jeecgframework.poi.excel.annotation.Excel;
 import org.jeecg.common.aspect.annotation.Dict;
@@ -23,6 +24,7 @@
  * @Version: V1.0
  */
 @Data
+@ToString
 @TableName("dry_order")
 @Accessors(chain = true)
 @EqualsAndHashCode(callSuper = false)
@@ -35,9 +37,9 @@
     @ApiModelProperty(value = "id")
     private String id;
 	/**宸ュ崟鏃堕棿*/
-	@Excel(name = "宸ュ崟鏃堕棿", width = 15, format = "yyyy-MM-dd")
-	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
-    @DateTimeFormat(pattern="yyyy-MM-dd")
+	@Excel(name = "宸ュ崟鏃堕棿", width = 15, format = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
     @ApiModelProperty(value = "宸ュ崟鏃堕棿")
     private Date orderTime;
 	/**宸ュ崟鍙�*/
@@ -49,6 +51,9 @@
 	@Dict(dictTable = "dry_herb", dicText = "name", dicCode = "id")
     @ApiModelProperty(value = "鑽潗")
     private String herbId;
+    /**鑽潗*/
+    @ApiModelProperty(value = "鑽潗鍚嶇О")
+    private String herbName;
 	/**鍒濆鍚按鐜�*/
 	@Excel(name = "鍒濆鍚按鐜�", width = 15)
     @ApiModelProperty(value = "鍒濆鍚按鐜�")
@@ -60,7 +65,11 @@
 	/**鎶曟枡閲�*/
 	@Excel(name = "鎶曟枡閲�", width = 15)
     @ApiModelProperty(value = "鎶曟枡閲�")
-    private Double feed;
+    private Integer feed;
+    /**鍒濆閲嶉噺*/
+    @Excel(name = "鍒濆閲嶉噺", width = 15)
+    @ApiModelProperty(value = "鍒濆閲嶉噺")
+    private Double originWeight;
 	/**棰勮骞茬嚗鏃堕棿*/
 	@Excel(name = "棰勮骞茬嚗鏃堕棿", width = 15)
     @ApiModelProperty(value = "棰勮骞茬嚗鏃堕棿")
@@ -72,7 +81,27 @@
 	/**骞茬嚗鏃堕棿*/
 	@Excel(name = "骞茬嚗鏃堕棿", width = 15)
     @ApiModelProperty(value = "骞茬嚗鏃堕棿")
-    private Integer drying;
+    private Integer dryTime;
+    /**鐑娓╁害*/
+    @Excel(name = "鐑娓╁害", width = 15)
+    @ApiModelProperty(value = "鐑娓╁害")
+    private Double windTemp;
+    /**鐜娓╁害*/
+    @Excel(name = "鐜娓╁害", width = 15)
+    @ApiModelProperty(value = "鐜娓╁害")
+    private Double envTemp;
+    /**鐜婀垮害*/
+    @Excel(name = "鐜婀垮害", width = 15)
+    @ApiModelProperty(value = "鐜婀垮害")
+    private Double envHum;
+    /**鑽℃枡寤舵椂ms*/
+    @Excel(name = "鑽℃枡寤舵椂ms", width = 15)
+    @ApiModelProperty(value = "鑽℃枡寤舵椂ms")
+    private Integer delay;
+    /**缈绘枡娆℃暟*/
+    @Excel(name = "缈绘枡娆℃暟", width = 15)
+    @ApiModelProperty(value = "缈绘枡娆℃暟")
+    private Integer turn;
 	/**棰勮鍓╀綑鏃堕棿*/
 	@Excel(name = "棰勮鍓╀綑鏃堕棿", width = 15)
     @ApiModelProperty(value = "棰勮鍓╀綑鏃堕棿")
@@ -116,4 +145,6 @@
 	@Dict(dictTable = "sys_user", dicText = "realname", dicCode = "id")
     @ApiModelProperty(value = "鎿嶄綔浜�")
     private String operator;
+
+    private String temps;
 }
diff --git a/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/entity/DryOrderTrend.java b/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/entity/DryOrderTrend.java
index bb711a0..bac31a2 100644
--- a/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/entity/DryOrderTrend.java
+++ b/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/entity/DryOrderTrend.java
@@ -41,18 +41,47 @@
 	@Excel(name = "鍚按鐜�", width = 15)
     @ApiModelProperty(value = "鍚按鐜�")
     private Double moisture;
-	/**娓╁害*/
-	@Excel(name = "娓╁害", width = 15)
-    @ApiModelProperty(value = "娓╁害")
-    private Double temp;
+	/**椋庢満娓╁害*/
+	@Excel(name = "椋庢満娓╁害", width = 15)
+    @ApiModelProperty(value = "椋庢満娓╁害")
+    private Double fanTemp;
+    /**椋庣娓╁害*/
+    @Excel(name = "椋庣娓╁害", width = 15)
+    @ApiModelProperty(value = "椋庣娓╁害")
+    private Double bellowsTemp;
 	/**鏃堕棿*/
-	@Excel(name = "鏃堕棿", width = 15, format = "yyyy-MM-dd")
-	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
-    @DateTimeFormat(pattern="yyyy-MM-dd")
+	@Excel(name = "鏃堕棿", width = 15, format = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
     @ApiModelProperty(value = "鏃堕棿")
     private Date tim;
-	/**绉熸埛id*/
-	@Excel(name = "绉熸埛id", width = 15)
+
+    /**鎬绘椂闂�*/
+    @Excel(name = "鎬绘椂闂�", width = 15)
+    @ApiModelProperty(value = "鎬绘椂闂�")
+    private Integer totalTime;
+    /**骞茬嚗鏃堕棿s*/
+    @Excel(name = "骞茬嚗鏃堕棿s", width = 15)
+    @ApiModelProperty(value = "骞茬嚗鏃堕棿s")
+    private Integer dryTime;
+    /**缈绘枡娆℃暟*/
+    @Excel(name = "缈绘枡娆℃暟", width = 15)
+    @ApiModelProperty(value = "缈绘枡娆℃暟")
+    private Integer turn;
+    /**椋庢満棰戠巼*/
+    @Excel(name = "椋庢満棰戠巼", width = 15)
+    @ApiModelProperty(value = "椋庢満棰戠巼")
+    private Double fanFrequency;
+    /**瀹炴椂閲嶉噺*/
+    @Excel(name = "瀹炴椂閲嶉噺", width = 15)
+    @ApiModelProperty(value = "瀹炴椂閲嶉噺")
+    private Double weight;
+	/**鐑1/鍐烽0*/
+	@Excel(name = "鐑1/鍐烽0", width = 15)
+    @ApiModelProperty(value = "鐑1/鍐烽0")
+    private Boolean wind;
+    /**绉熸埛id*/
+    @Excel(name = "绉熸埛id", width = 15)
     @ApiModelProperty(value = "绉熸埛id")
     private Integer tenantId;
 }
diff --git a/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/entity/DryResult.java b/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/entity/DryResult.java
new file mode 100644
index 0000000..03dfabc
--- /dev/null
+++ b/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/entity/DryResult.java
@@ -0,0 +1,99 @@
+package org.jeecg.modules.dry.entity;
+
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+import java.util.Date;
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.jeecg.common.aspect.annotation.Dict;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @Description: 娴嬭瘯缁撴灉
+ * @Author: jeecg-boot
+ * @Date:   2023-03-19
+ * @Version: V1.0
+ */
+@Data
+@TableName("dry_result")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="dry_result瀵硅薄", description="娴嬭瘯缁撴灉")
+public class DryResult implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	/**id*/
+	@TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "id")
+    private String id;
+	/**鑽潗鍚嶇О*/
+	@Excel(name = "鑽潗鍚嶇О", width = 15)
+    @ApiModelProperty(value = "鑽潗鍚嶇О")
+    private String herbName;
+	/**瑁呮枡閲�*/
+	@Excel(name = "瑁呮枡閲�", width = 15)
+    @ApiModelProperty(value = "瑁呮枡閲�")
+    private Integer feed;
+	/**鍒濆閲嶉噺*/
+	@Excel(name = "鍒濆閲嶉噺", width = 15)
+    @ApiModelProperty(value = "鍒濆閲嶉噺")
+    private Double weight;
+	/**鐩爣姘村垎*/
+	@Excel(name = "鐩爣姘村垎", width = 15)
+    @ApiModelProperty(value = "鐩爣姘村垎")
+    private Double target;
+	/**宸ュ崟鍙�*/
+	@Excel(name = "宸ュ崟鍙�", width = 15)
+    @ApiModelProperty(value = "宸ュ崟鍙�")
+    private String orderNo;
+	/**宸ュ崟id*/
+	@Excel(name = "宸ュ崟id", width = 15)
+    @ApiModelProperty(value = "宸ュ崟id")
+    private String orderId;
+	/**鍓嶅乏*/
+	@Excel(name = "鍓嶅乏", width = 15)
+    @ApiModelProperty(value = "鍓嶅乏")
+    private Double frontLeft;
+	/**鍓嶅乏*/
+	@Excel(name = "鍓嶅乏", width = 15)
+    @ApiModelProperty(value = "鍓嶅乏")
+    private Double frontRight;
+	/**涓乏*/
+	@Excel(name = "涓乏", width = 15)
+    @ApiModelProperty(value = "涓乏")
+    private Double middleLeft;
+	/**涓彸*/
+	@Excel(name = "涓彸", width = 15)
+    @ApiModelProperty(value = "涓彸")
+    private Double middleRight;
+	/**鍚庡乏*/
+	@Excel(name = "鍚庡乏", width = 15)
+    @ApiModelProperty(value = "鍚庡乏")
+    private Double backLeft;
+	/**鍚庡彸*/
+	@Excel(name = "鍚庡彸", width = 15)
+    @ApiModelProperty(value = "鍚庡彸")
+    private Double backRight;
+	/**骞冲潎*/
+	@Excel(name = "骞冲潎", width = 15)
+    @ApiModelProperty(value = "骞冲潎")
+    private Double avg;
+	/**鏃堕暱*/
+	@Excel(name = "鏃堕暱", width = 15)
+    @ApiModelProperty(value = "鏃堕暱")
+    private Double dryTime;
+	/**钂告苯锛堢珛鏂癸級*/
+	@Excel(name = "钂告苯锛堢珛鏂癸級", width = 15)
+    @ApiModelProperty(value = "钂告苯锛堢珛鏂癸級")
+    private Double steam;
+}
diff --git a/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/DryOrderTrendVo.java b/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/DryOrderTrendVo.java
index 1c4e4a9..4e611ac 100644
--- a/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/DryOrderTrendVo.java
+++ b/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/DryOrderTrendVo.java
@@ -5,6 +5,7 @@
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 import lombok.ToString;
 import org.jeecgframework.poi.excel.annotation.Excel;
 import org.springframework.format.annotation.DateTimeFormat;
@@ -13,6 +14,7 @@
 
 @Data
 @ToString
+@NoArgsConstructor
 public class DryOrderTrendVo {
 
     /**id*/
@@ -25,8 +27,30 @@
     @ApiModelProperty(value = "鍚按鐜�", example = "33")
     private Double moisture;
     /**娓╁害*/
-    @ApiModelProperty(value = "娓╁害", example = "70")
-    private Double temp;
+    @ApiModelProperty(value = "椋庢満娓╁害", example = "70")
+    private Double fanTemp;
+    /**椋庣娓╁害*/
+    @ApiModelProperty(value = "椋庣娓╁害")
+    private Double bellowsTemp;
+
+    /**鎬绘椂闂�*/
+    @ApiModelProperty(value = "鎬绘椂闂�")
+    private Integer totalTime;
+    /**骞茬嚗鏃堕棿s*/
+    @ApiModelProperty(value = "骞茬嚗鏃堕棿s")
+    private Integer dryTime;
+    /**缈绘枡娆℃暟*/
+    @ApiModelProperty(value = "缈绘枡娆℃暟")
+    private Integer turn;
+    /**椋庢満棰戠巼*/
+    @ApiModelProperty(value = "椋庢満棰戠巼")
+    private Double fanFrequency;
+    /**瀹炴椂閲嶉噺*/
+    @ApiModelProperty(value = "瀹炴椂閲嶉噺")
+    private Double weight;
+    /**鐑1/鍐烽0*/
+    @ApiModelProperty(value = "鐑1/鍐烽0")
+    private Integer wind;
     /**鏃堕棿*/
     @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
     @DateTimeFormat(pattern="yyyy-MM-dd  HH:mm:ss")
@@ -35,4 +59,19 @@
     /**绉熸埛id*/
     @ApiModelProperty(value = "绉熸埛id", example = "1000")
     private Integer tenantId;
+
+
+    public DryOrderTrendVo(RealTimeDataVo realTimeDataVo) {
+        this.fanFrequency = realTimeDataVo.getFanfrq();
+        this.weight = realTimeDataVo.getWeight3();
+        this.moisture = realTimeDataVo.getMoisture2();
+        this.fanTemp = realTimeDataVo.getTemp1();
+        this.bellowsTemp = realTimeDataVo.getTemp2();
+        this.dryTime = realTimeDataVo.getTime2();
+        this.wind = realTimeDataVo.getWind()?1:0;
+        this.turn = realTimeDataVo.getTurntime();
+        this.totalTime = realTimeDataVo.getTime3();
+        this.orderId = realTimeDataVo.getOrderId();
+        this.tim = new Date();
+    }
 }
diff --git a/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/DryOrderVo.java b/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/DryOrderVo.java
index 2ac9388..c4d9107 100644
--- a/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/DryOrderVo.java
+++ b/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/DryOrderVo.java
@@ -1,17 +1,20 @@
 package org.jeecg.modules.dry.vo;
 
+import cn.hutool.core.util.IdUtil;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 import lombok.ToString;
 import org.jeecg.common.aspect.annotation.Dict;
+import org.jeecgframework.poi.excel.annotation.Excel;
 import org.springframework.format.annotation.DateTimeFormat;
 
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 
 @Data
 @ToString
+@NoArgsConstructor
 public class DryOrderVo {
     /**id*/
     @ApiModelProperty(value = "id")
@@ -27,6 +30,9 @@
     /**鑽潗*/
     @ApiModelProperty(value = "鑽潗", example = "1085571074")
     private String herbId;
+    /**鑽潗鍚嶇О*/
+    @ApiModelProperty(value="鑽潗鍚嶇О", example = "浼哥瓔鑽�")
+    private String herbName;
     /**鍒濆鍚按鐜�*/
     @ApiModelProperty(value = "鍒濆鍚按鐜�", example = "75.51")
     private Double initial;
@@ -34,8 +40,10 @@
     @ApiModelProperty(value = "鐩爣鍚按鐜�", example="12")
     private Double target;
     /**鎶曟枡閲�*/
-    @ApiModelProperty(value = "鎶曟枡閲�", example = "32")
-    private Double feed;
+    @ApiModelProperty(value = "鎶曟枡閲�", example = "16")
+    private Integer feed;
+    @ApiModelProperty(value = "鍒濆閲嶉噺")
+    private Double originWeight;
     /**棰勮骞茬嚗鏃堕棿*/
     @ApiModelProperty(value = "棰勮骞茬嚗鏃堕棿(min)", example = "120")
     private Integer et;
@@ -44,13 +52,31 @@
     private Double yield;
     /**骞茬嚗鏃堕棿*/
     @ApiModelProperty(value = "骞茬嚗鏃堕棿")
-    private Integer drying;
+    private Integer dryTime;
+    /**鐑娓╁害*/
+    @ApiModelProperty(value = "鐑娓╁害")
+    private Double windTemp;
+    /**鐜娓╁害*/
+    @ApiModelProperty(value = "鐜娓╁害")
+    private Double envTemp;
+    /**鐜婀垮害*/
+    @ApiModelProperty(value = "鐜婀垮害")
+    private Double envHum;
+    /**鑽℃枡寤舵椂ms*/
+    @ApiModelProperty(value = "鑽℃枡寤舵椂ms")
+    private Integer delay;
+    /**缈绘枡娆℃暟*/
+    @ApiModelProperty(value = "缈绘枡娆℃暟")
+    private Integer turn;
     /**棰勮鍓╀綑鏃堕棿*/
     @ApiModelProperty(value = "棰勮鍓╀綑鏃堕棿")
     private Integer remain;
     /**璁惧*/
     @ApiModelProperty(value = "璁惧", example = "S1001")
     private String equId;
+    /**璁惧缂栧彿*/
+    @ApiModelProperty(value = "璁惧缂栧彿", example = "GM001")
+    private String machineCode;
     /**杞﹂棿*/
     @ApiModelProperty(value = "杞﹂棿", example = "S1")
     private String shopId;
@@ -66,6 +92,49 @@
     private String operator;
 
 
-    @ApiModelProperty(value = "瀹炴椂鏄庣粏鏁版嵁")
-    private List<DryOrderTrendVo> DetailList;
+    @ApiModelProperty(value = "鏄庣粏鏁版嵁鍒楄〃")
+    private List<DryOrderTrendVo> detailList = new ArrayList<>();
+    @ApiModelProperty(value = "鏄庣粏")
+    private DryOrderTrendVo trendVo;
+
+    private Map<Integer, Double> bellowsTemp = new HashMap<>();
+
+    /**寮�濮嬪共鐖�*/
+    private Boolean start;
+    /**鑷姩 true/鎵嬪姩 false*/
+    private Boolean auto;
+    /**鏆傚仠鏍囧織 true/false*/
+    private Boolean stop;
+    /**涓婁綅鏈� true/PLC false*/
+    private Boolean plcdisable;
+    /**娓╁害杩囦綆 true/姝e父 false*/
+    private Boolean lowalarm;
+    /**鐑 true/鍐烽 false*/
+    private Boolean wind;
+
+    public DryOrderVo(RealTimeDataVo realTimeDataVo) {
+        this.id = IdUtil.fastSimpleUUID();
+        this.code = realTimeDataVo.getWorkorder();
+        this.herbName = realTimeDataVo.getName();
+        this.delay = realTimeDataVo.getDelay();
+        this.turn = realTimeDataVo.getTurntime();
+        this.feed = realTimeDataVo.getWeight1();
+        this.originWeight = realTimeDataVo.getWeight2();
+        this.initial = realTimeDataVo.getMoisture1();
+        this.target = realTimeDataVo.getMoisture3();
+        this.windTemp = realTimeDataVo.getTemp3();
+        this.et = realTimeDataVo.getTime1();
+        this.dryTime = realTimeDataVo.getTime3();
+        this.start = realTimeDataVo.getStart();
+        this.auto = realTimeDataVo.getAuto();
+        this.stop = realTimeDataVo.getStop();
+        this.plcdisable = realTimeDataVo.getPlcdisable();
+        this.lowalarm = realTimeDataVo.getLowalarm();
+        this.wind = realTimeDataVo.getWind();
+        this.machineCode = realTimeDataVo.getMachineid();
+        this.tenantId = realTimeDataVo.getTenantid();
+        this.orderTime = new Date();
+        this.yield = realTimeDataVo.getWeight3();
+
+    }
 }
diff --git a/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/RealTimeDataVo.java b/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/RealTimeDataVo.java
new file mode 100644
index 0000000..6dbec23
--- /dev/null
+++ b/jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/RealTimeDataVo.java
@@ -0,0 +1,66 @@
+package org.jeecg.modules.dry.vo;
+
+import lombok.Data;
+import lombok.ToString;
+
+@Data
+@ToString
+public class RealTimeDataVo {
+
+    /**宸ュ崟ID*/
+    private String orderId;
+    /**宸ュ崟鍙�*/
+    private String workorder;
+    /**閰嶆柟绱㈠紩*/
+    private Integer index;
+    /**鑽潗鍚嶇О*/
+    private String name;
+
+    private Integer tenantid;
+
+    private String machineid;
+    /**鑽℃枡寤舵椂*/
+    private Integer delay;
+    /**缈绘枡娆℃暟*/
+    private Integer turntime;
+    /**椋庢満棰戠巼*/
+    private Double fanfrq;
+    /**鎶曟枡閲忥紙绛愶級*/
+    private Integer weight1;
+    /**鍒濆閲嶉噺*/
+    private Double weight2;
+    /**杩囩▼瀹炴椂閲嶉噺*/
+    private Double weight3;
+    /**鍒濆鍚按鐜囷紙璁惧畾鍊硷級*/
+    private Double moisture1;
+    /**瀹炴椂鍚按鐜�*/
+    private Double moisture2;
+    /**鐩爣鍚按鐜�*/
+    private Double moisture3;
+    /**椋庢満娓╁害*/
+    private Double temp1;
+    /**椋庣娓╁害*/
+    private Double temp2;
+    /**娓╁害璁惧畾鍊�*/
+    private Double temp3;
+    /**鏃堕棿璁惧畾鍊�*/
+    private Integer time1;
+    /**鏃堕棿璁℃暟*/
+    private Integer time2;
+    /**鎬绘椂闂�*/
+    private Integer time3;
+    /**寮�濮嬪共鐖�*/
+    private Boolean start;
+    /**鑷姩 true/鎵嬪姩 false*/
+    private Boolean auto;
+    /**鏆傚仠鏍囧織 true/false*/
+    private Boolean stop;
+    /**涓婁綅鏈� true/PLC false*/
+    private Boolean plcdisable;
+    /**娓╁害杩囦綆 true/姝e父 false*/
+    private Boolean lowalarm;
+    /**鐑 true/鍐烽 false*/
+    private Boolean wind;
+
+
+}
diff --git a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryHelloController.java b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryHelloController.java
index 0c8ad96..413d7dd 100644
--- a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryHelloController.java
+++ b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryHelloController.java
@@ -1,14 +1,16 @@
 package org.jeecg.modules.dry.controller;
 
+import com.alibaba.fastjson.JSONObject;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.jeecg.common.api.vo.Result;
 import org.jeecg.modules.dry.entity.DryHelloEntity;
 import org.jeecg.modules.dry.service.IDryHelloService;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 import lombok.extern.slf4j.Slf4j;
+
+import java.util.Map;
 
 @Api(tags = "dry绀轰緥")
 @RestController
@@ -26,4 +28,33 @@
 		return jeecgHelloService.hello();
 	}
 
+	@ApiOperation(value="鎺ユ敹瀹炴椂鏁版嵁Str", notes="璁惧瀹炴椂鏁版嵁涓婁紶")
+	@PostMapping("/sendRealTimeData")
+	public Result<?> realTimeData(String orderVo) {
+		System.out.println("鎺ユ敹鍒板疄鏃舵暟鎹細" + orderVo.toString());
+		log.info("瀹炴椂鏁版嵁锛�"+ orderVo.toString());
+		//service.saveRealTimeData(orderVo);
+
+		return Result.ok();
+	}
+
+	@ApiOperation(value="鎺ユ敹瀹炴椂鏁版嵁Map", notes="璁惧瀹炴椂鏁版嵁涓婁紶")
+	@PostMapping("/sendRealTimeDataMap")
+	public Result<?> realTimeDataMap(@RequestBody Map<String,Object> orderVo) {
+		System.out.println("鎺ユ敹鍒板疄鏃舵暟鎹細" + orderVo.toString());
+		log.info("瀹炴椂鏁版嵁锛�"+ orderVo.toString());
+		//service.saveRealTimeData(orderVo);
+
+		return Result.ok();
+	}
+
+	@ApiOperation(value="鎺ユ敹瀹炴椂鏁版嵁Json", notes="璁惧瀹炴椂鏁版嵁涓婁紶")
+	@PostMapping("/sendRealTimeDataJson")
+	public Result<?> realTimeDataJson(@RequestBody JSONObject orderVo) {
+		System.out.println("鎺ユ敹鍒板疄鏃舵暟鎹細" + orderVo.toJSONString());
+		log.info("瀹炴椂鏁版嵁锛�"+orderVo.toJSONString());
+		//service.saveRealTimeData(orderVo);
+
+		return Result.ok();
+	}
 }
diff --git a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryOrderController.java b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryOrderController.java
index 9df905d..8d4de43 100644
--- a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryOrderController.java
+++ b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryOrderController.java
@@ -1,8 +1,12 @@
 package org.jeecg.modules.dry.controller;
 
 import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+
+import com.alibaba.fastjson.JSONObject;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.config.TenantContext;
 import org.jeecg.common.system.query.QueryGenerator;
@@ -67,6 +71,16 @@
 		IPage<DryOrder> pageList = dryOrderService.page(page, queryWrapper);
 		return Result.OK(pageList);
 	}
+
+
+	 @ApiOperation(value="鏈堢敓浜ф儏鍐垫瑙�", notes="")
+	 @GetMapping(value = "/monthOverview")
+	 public Result<?> queryMonthOverview(@RequestParam(name="month") String month) {
+		int tenantId = oConvertUtils.getInt(TenantContext.getTenant(),0);
+		List<String> list = dryOrderService.queryMonthOverview(month, tenantId);
+		return Result.ok(list);
+	 }
+
 
 	/**
 	 *   娣诲姞
@@ -170,14 +184,5 @@
         return super.importExcel(request, response, DryOrder.class);
     }
 
-
-
-	@ApiOperation(value="鎺ユ敹瀹炴椂鏁版嵁", notes="璁惧瀹炴椂鏁版嵁涓婁紶")
-	@PostMapping("/sendRealTimeData")
-	public void realTimeData(@RequestBody DryOrderVo orderVo) {
-		System.out.println("鎺ユ敹鍒板疄鏃舵暟鎹細" + orderVo.toString());
-		service.saveRealTimeData(orderVo);
-
-	}
 
 }
diff --git a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryOrderTrendController.java b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryOrderTrendController.java
index 76923b5..c9989dd 100644
--- a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryOrderTrendController.java
+++ b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryOrderTrendController.java
@@ -1,172 +1,172 @@
-package org.jeecg.modules.dry.controller;
-
-import java.util.Arrays;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.jeecg.common.api.vo.Result;
-import org.jeecg.common.config.TenantContext;
-import org.jeecg.common.system.query.QueryGenerator;
-import org.jeecg.common.util.oConvertUtils;
-import org.jeecg.config.mybatis.MybatisPlusSaasConfig;
-import org.jeecg.modules.dry.entity.DryOrderTrend;
-import org.jeecg.modules.dry.service.IDryOrderTrendService;
-
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import lombok.extern.slf4j.Slf4j;
-
-import org.jeecg.common.system.base.controller.JeecgController;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.web.servlet.ModelAndView;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.jeecg.common.aspect.annotation.AutoLog;
-import org.apache.shiro.authz.annotation.RequiresPermissions;
-
- /**
- * @Description: 宸ュ崟杩囩▼瓒嬪娍
- * @Author: jeecg-boot
- * @Date:   2023-03-08
- * @Version: V1.0
- */
-@Api(tags="宸ュ崟杩囩▼瓒嬪娍")
-@RestController
-@RequestMapping("/dry/dryOrderTrend")
-@Slf4j
-public class DryOrderTrendController extends JeecgController<DryOrderTrend, IDryOrderTrendService> {
-	@Autowired
-	private IDryOrderTrendService dryOrderTrendService;
-
-	/**
-	 * 鍒嗛〉鍒楄〃鏌ヨ
-	 *
-	 * @param dryOrderTrend
-	 * @param pageNo
-	 * @param pageSize
-	 * @param req
-	 * @return
-	 */
-	//@AutoLog(value = "宸ュ崟杩囩▼瓒嬪娍-鍒嗛〉鍒楄〃鏌ヨ")
-	@ApiOperation(value="宸ュ崟杩囩▼瓒嬪娍-鍒嗛〉鍒楄〃鏌ヨ", notes="宸ュ崟杩囩▼瓒嬪娍-鍒嗛〉鍒楄〃鏌ヨ")
-	@GetMapping(value = "/list")
-	public Result<IPage<DryOrderTrend>> queryPageList(DryOrderTrend dryOrderTrend,
-													  @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
-													  @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
-													  HttpServletRequest req) {
-		//------------------------------------------------------------------------------------------------
-		//鏄惁寮�鍚郴缁熺鐞嗘ā鍧楃殑澶氱鎴锋暟鎹殧绂汇�怱AAS澶氱鎴锋ā寮忋��
-		if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){
-			dryOrderTrend.setTenantId(oConvertUtils.getInt(TenantContext.getTenant(),0));
-		}
-		//------------------------------------------------------------------------------------------------
-		QueryWrapper<DryOrderTrend> queryWrapper = QueryGenerator.initQueryWrapper(dryOrderTrend, req.getParameterMap());
-		Page<DryOrderTrend> page = new Page<DryOrderTrend>(pageNo, pageSize);
-		IPage<DryOrderTrend> pageList = dryOrderTrendService.page(page, queryWrapper);
-		return Result.OK(pageList);
-	}
-
-	/**
-	 *   娣诲姞
-	 *
-	 * @param dryOrderTrend
-	 * @return
-	 */
-	@AutoLog(value = "宸ュ崟杩囩▼瓒嬪娍-娣诲姞")
-	@ApiOperation(value="宸ュ崟杩囩▼瓒嬪娍-娣诲姞", notes="宸ュ崟杩囩▼瓒嬪娍-娣诲姞")
-	@RequiresPermissions("dry:dry_order_trend:add")
-	@PostMapping(value = "/add")
-	public Result<String> add(@RequestBody DryOrderTrend dryOrderTrend) {
-		dryOrderTrendService.save(dryOrderTrend);
-		return Result.OK("娣诲姞鎴愬姛锛�");
-	}
-
-	/**
-	 *  缂栬緫
-	 *
-	 * @param dryOrderTrend
-	 * @return
-	 */
-	@AutoLog(value = "宸ュ崟杩囩▼瓒嬪娍-缂栬緫")
-	@ApiOperation(value="宸ュ崟杩囩▼瓒嬪娍-缂栬緫", notes="宸ュ崟杩囩▼瓒嬪娍-缂栬緫")
-	@RequiresPermissions("dry:dry_order_trend:edit")
-	@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
-	public Result<String> edit(@RequestBody DryOrderTrend dryOrderTrend) {
-		dryOrderTrendService.updateById(dryOrderTrend);
-		return Result.OK("缂栬緫鎴愬姛!");
-	}
-
-	/**
-	 *   閫氳繃id鍒犻櫎
-	 *
-	 * @param id
-	 * @return
-	 */
-	@AutoLog(value = "宸ュ崟杩囩▼瓒嬪娍-閫氳繃id鍒犻櫎")
-	@ApiOperation(value="宸ュ崟杩囩▼瓒嬪娍-閫氳繃id鍒犻櫎", notes="宸ュ崟杩囩▼瓒嬪娍-閫氳繃id鍒犻櫎")
-	@RequiresPermissions("dry:dry_order_trend:delete")
-	@DeleteMapping(value = "/delete")
-	public Result<String> delete(@RequestParam(name="id",required=true) String id) {
-		dryOrderTrendService.removeById(id);
-		return Result.OK("鍒犻櫎鎴愬姛!");
-	}
-
-	/**
-	 *  鎵归噺鍒犻櫎
-	 *
-	 * @param ids
-	 * @return
-	 */
-	@AutoLog(value = "宸ュ崟杩囩▼瓒嬪娍-鎵归噺鍒犻櫎")
-	@ApiOperation(value="宸ュ崟杩囩▼瓒嬪娍-鎵归噺鍒犻櫎", notes="宸ュ崟杩囩▼瓒嬪娍-鎵归噺鍒犻櫎")
-	@RequiresPermissions("dry:dry_order_trend:deleteBatch")
-	@DeleteMapping(value = "/deleteBatch")
-	public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
-		this.dryOrderTrendService.removeByIds(Arrays.asList(ids.split(",")));
-		return Result.OK("鎵归噺鍒犻櫎鎴愬姛!");
-	}
-
-	/**
-	 * 閫氳繃id鏌ヨ
-	 *
-	 * @param id
-	 * @return
-	 */
-	//@AutoLog(value = "宸ュ崟杩囩▼瓒嬪娍-閫氳繃id鏌ヨ")
-	@ApiOperation(value="宸ュ崟杩囩▼瓒嬪娍-閫氳繃id鏌ヨ", notes="宸ュ崟杩囩▼瓒嬪娍-閫氳繃id鏌ヨ")
-	@GetMapping(value = "/queryById")
-	public Result<DryOrderTrend> queryById(@RequestParam(name="id",required=true) String id) {
-		DryOrderTrend dryOrderTrend = dryOrderTrendService.getById(id);
-		if(dryOrderTrend ==null) {
-			return Result.error("鏈壘鍒板搴旀暟鎹�");
-		}
-		return Result.OK(dryOrderTrend);
-	}
-
-    /**
-    * 瀵煎嚭excel
-    *
-    * @param request
-    * @param dryOrderTrend
-    */
-    @RequiresPermissions("dry:dry_order_trend:exportXls")
-    @RequestMapping(value = "/exportXls")
-    public ModelAndView exportXls(HttpServletRequest request, DryOrderTrend dryOrderTrend) {
-        return super.exportXls(request, dryOrderTrend, DryOrderTrend.class, "宸ュ崟杩囩▼瓒嬪娍");
-    }
-
-    /**
-      * 閫氳繃excel瀵煎叆鏁版嵁
-    *
-    * @param request
-    * @param response
-    * @return
-    */
-    @RequiresPermissions("dry:dry_order_trend:importExcel")
-    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
-    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
-        return super.importExcel(request, response, DryOrderTrend.class);
-    }
-
-}
+//package org.jeecg.modules.dry.controller;
+//
+//import java.util.Arrays;
+//import javax.servlet.http.HttpServletRequest;
+//import javax.servlet.http.HttpServletResponse;
+//import org.jeecg.common.api.vo.Result;
+//import org.jeecg.common.config.TenantContext;
+//import org.jeecg.common.system.query.QueryGenerator;
+//import org.jeecg.common.util.oConvertUtils;
+//import org.jeecg.config.mybatis.MybatisPlusSaasConfig;
+//import org.jeecg.modules.dry.entity.DryOrderTrend;
+//import org.jeecg.modules.dry.service.IDryOrderTrendService;
+//
+//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+//import com.baomidou.mybatisplus.core.metadata.IPage;
+//import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+//import lombok.extern.slf4j.Slf4j;
+//
+//import org.jeecg.common.system.base.controller.JeecgController;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.web.bind.annotation.*;
+//import org.springframework.web.servlet.ModelAndView;
+//import io.swagger.annotations.Api;
+//import io.swagger.annotations.ApiOperation;
+//import org.jeecg.common.aspect.annotation.AutoLog;
+//import org.apache.shiro.authz.annotation.RequiresPermissions;
+//
+// /**
+// * @Description: 宸ュ崟杩囩▼瓒嬪娍
+// * @Author: jeecg-boot
+// * @Date:   2023-03-08
+// * @Version: V1.0
+// */
+//@Api(tags="宸ュ崟杩囩▼瓒嬪娍")
+//@RestController
+//@RequestMapping("/dry/dryOrderTrend")
+//@Slf4j
+//public class DryOrderTrendController extends JeecgController<DryOrderTrend, IDryOrderTrendService> {
+//	@Autowired
+//	private IDryOrderTrendService dryOrderTrendService;
+//
+//	/**
+//	 * 鍒嗛〉鍒楄〃鏌ヨ
+//	 *
+//	 * @param dryOrderTrend
+//	 * @param pageNo
+//	 * @param pageSize
+//	 * @param req
+//	 * @return
+//	 */
+//	//@AutoLog(value = "宸ュ崟杩囩▼瓒嬪娍-鍒嗛〉鍒楄〃鏌ヨ")
+//	@ApiOperation(value="宸ュ崟杩囩▼瓒嬪娍-鍒嗛〉鍒楄〃鏌ヨ", notes="宸ュ崟杩囩▼瓒嬪娍-鍒嗛〉鍒楄〃鏌ヨ")
+//	@GetMapping(value = "/list")
+//	public Result<IPage<DryOrderTrend>> queryPageList(DryOrderTrend dryOrderTrend,
+//													  @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+//													  @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+//													  HttpServletRequest req) {
+//		//------------------------------------------------------------------------------------------------
+//		//鏄惁寮�鍚郴缁熺鐞嗘ā鍧楃殑澶氱鎴锋暟鎹殧绂汇�怱AAS澶氱鎴锋ā寮忋��
+//		if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){
+//			dryOrderTrend.setTenantId(oConvertUtils.getInt(TenantContext.getTenant(),0));
+//		}
+//		//------------------------------------------------------------------------------------------------
+//		QueryWrapper<DryOrderTrend> queryWrapper = QueryGenerator.initQueryWrapper(dryOrderTrend, req.getParameterMap());
+//		Page<DryOrderTrend> page = new Page<DryOrderTrend>(pageNo, pageSize);
+//		IPage<DryOrderTrend> pageList = dryOrderTrendService.page(page, queryWrapper);
+//		return Result.OK(pageList);
+//	}
+//
+//	/**
+//	 *   娣诲姞
+//	 *
+//	 * @param dryOrderTrend
+//	 * @return
+//	 */
+//	@AutoLog(value = "宸ュ崟杩囩▼瓒嬪娍-娣诲姞")
+//	@ApiOperation(value="宸ュ崟杩囩▼瓒嬪娍-娣诲姞", notes="宸ュ崟杩囩▼瓒嬪娍-娣诲姞")
+//	@RequiresPermissions("dry:dry_order_trend:add")
+//	@PostMapping(value = "/add")
+//	public Result<String> add(@RequestBody DryOrderTrend dryOrderTrend) {
+//		dryOrderTrendService.save(dryOrderTrend);
+//		return Result.OK("娣诲姞鎴愬姛锛�");
+//	}
+//
+//	/**
+//	 *  缂栬緫
+//	 *
+//	 * @param dryOrderTrend
+//	 * @return
+//	 */
+//	@AutoLog(value = "宸ュ崟杩囩▼瓒嬪娍-缂栬緫")
+//	@ApiOperation(value="宸ュ崟杩囩▼瓒嬪娍-缂栬緫", notes="宸ュ崟杩囩▼瓒嬪娍-缂栬緫")
+//	@RequiresPermissions("dry:dry_order_trend:edit")
+//	@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+//	public Result<String> edit(@RequestBody DryOrderTrend dryOrderTrend) {
+//		dryOrderTrendService.updateById(dryOrderTrend);
+//		return Result.OK("缂栬緫鎴愬姛!");
+//	}
+//
+//	/**
+//	 *   閫氳繃id鍒犻櫎
+//	 *
+//	 * @param id
+//	 * @return
+//	 */
+//	@AutoLog(value = "宸ュ崟杩囩▼瓒嬪娍-閫氳繃id鍒犻櫎")
+//	@ApiOperation(value="宸ュ崟杩囩▼瓒嬪娍-閫氳繃id鍒犻櫎", notes="宸ュ崟杩囩▼瓒嬪娍-閫氳繃id鍒犻櫎")
+//	@RequiresPermissions("dry:dry_order_trend:delete")
+//	@DeleteMapping(value = "/delete")
+//	public Result<String> delete(@RequestParam(name="id",required=true) String id) {
+//		dryOrderTrendService.removeById(id);
+//		return Result.OK("鍒犻櫎鎴愬姛!");
+//	}
+//
+//	/**
+//	 *  鎵归噺鍒犻櫎
+//	 *
+//	 * @param ids
+//	 * @return
+//	 */
+//	@AutoLog(value = "宸ュ崟杩囩▼瓒嬪娍-鎵归噺鍒犻櫎")
+//	@ApiOperation(value="宸ュ崟杩囩▼瓒嬪娍-鎵归噺鍒犻櫎", notes="宸ュ崟杩囩▼瓒嬪娍-鎵归噺鍒犻櫎")
+//	@RequiresPermissions("dry:dry_order_trend:deleteBatch")
+//	@DeleteMapping(value = "/deleteBatch")
+//	public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+//		this.dryOrderTrendService.removeByIds(Arrays.asList(ids.split(",")));
+//		return Result.OK("鎵归噺鍒犻櫎鎴愬姛!");
+//	}
+//
+//	/**
+//	 * 閫氳繃id鏌ヨ
+//	 *
+//	 * @param id
+//	 * @return
+//	 */
+//	//@AutoLog(value = "宸ュ崟杩囩▼瓒嬪娍-閫氳繃id鏌ヨ")
+//	@ApiOperation(value="宸ュ崟杩囩▼瓒嬪娍-閫氳繃id鏌ヨ", notes="宸ュ崟杩囩▼瓒嬪娍-閫氳繃id鏌ヨ")
+//	@GetMapping(value = "/queryById")
+//	public Result<DryOrderTrend> queryById(@RequestParam(name="id",required=true) String id) {
+//		DryOrderTrend dryOrderTrend = dryOrderTrendService.getById(id);
+//		if(dryOrderTrend ==null) {
+//			return Result.error("鏈壘鍒板搴旀暟鎹�");
+//		}
+//		return Result.OK(dryOrderTrend);
+//	}
+//
+//    /**
+//    * 瀵煎嚭excel
+//    *
+//    * @param request
+//    * @param dryOrderTrend
+//    */
+//    @RequiresPermissions("dry:dry_order_trend:exportXls")
+//    @RequestMapping(value = "/exportXls")
+//    public ModelAndView exportXls(HttpServletRequest request, DryOrderTrend dryOrderTrend) {
+//        return super.exportXls(request, dryOrderTrend, DryOrderTrend.class, "宸ュ崟杩囩▼瓒嬪娍");
+//    }
+//
+//    /**
+//      * 閫氳繃excel瀵煎叆鏁版嵁
+//    *
+//    * @param request
+//    * @param response
+//    * @return
+//    */
+//    @RequiresPermissions("dry:dry_order_trend:importExcel")
+//    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+//    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+//        return super.importExcel(request, response, DryOrderTrend.class);
+//    }
+//
+//}
diff --git a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryRealTimeDataController.java b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryRealTimeDataController.java
new file mode 100644
index 0000000..b41f4a3
--- /dev/null
+++ b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryRealTimeDataController.java
@@ -0,0 +1,47 @@
+package org.jeecg.modules.dry.controller;
+
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.api.vo.Result;
+
+import org.jeecg.modules.dry.service.*;
+
+import org.jeecg.modules.dry.vo.RealTimeDataVo;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+
+@Api(tags = "瀹炴椂鏁版嵁澶勭悊鎺у埗鍣�")
+@RestController
+@RequestMapping("/dry/real")
+@Slf4j
+public class DryRealTimeDataController {
+
+    @Autowired
+    private IDryRealTimeDataService dryRealTimeDataService;
+
+
+    @ApiOperation(value="娴嬭瘯", notes="杩斿洖Hello")
+    @GetMapping("/hello")
+    public Result<?> sayHello() {
+        return Result.ok("Hello");
+    }
+
+    @ApiOperation(value="鎺ユ敹瀹炴椂鏁版嵁Json", notes="璁惧瀹炴椂鏁版嵁涓婁紶")
+    @PostMapping("/sendRealTimeDataJson")
+    public Result<?> realTimeDataJson(@RequestBody RealTimeDataVo realTimeDataVo) {
+        return dryRealTimeDataService.realTimeDataHandle(realTimeDataVo);
+    }
+
+
+
+    @ApiOperation(value="鑾峰彇璁惧瀹炴椂鏁版嵁", notes="閫氳繃绉熸埛ID鍜岃澶囩紪鐮佽幏鍙栧疄鏃舵暟鎹�")
+    @GetMapping("/getRealTimeData")
+    public Result<?> queryMachineRealTimeData(RealTimeDataVo realTimeDataVo) {
+        return dryRealTimeDataService.queryMachineRealTImeData(realTimeDataVo);
+    }
+
+}
diff --git a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryResultController.java b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryResultController.java
new file mode 100644
index 0000000..3c2c630
--- /dev/null
+++ b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryResultController.java
@@ -0,0 +1,178 @@
+package org.jeecg.modules.dry.controller;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.dry.entity.DryResult;
+import org.jeecg.modules.dry.service.IDryResultService;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+import com.alibaba.fastjson.JSON;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+
+ /**
+ * @Description: 娴嬭瘯缁撴灉
+ * @Author: jeecg-boot
+ * @Date:   2023-03-19
+ * @Version: V1.0
+ */
+@Api(tags="娴嬭瘯缁撴灉")
+@RestController
+@RequestMapping("/dry/dryResult")
+@Slf4j
+public class DryResultController extends JeecgController<DryResult, IDryResultService> {
+	@Autowired
+	private IDryResultService dryResultService;
+	
+	/**
+	 * 鍒嗛〉鍒楄〃鏌ヨ
+	 *
+	 * @param dryResult
+	 * @param pageNo
+	 * @param pageSize
+	 * @param req
+	 * @return
+	 */
+	//@AutoLog(value = "娴嬭瘯缁撴灉-鍒嗛〉鍒楄〃鏌ヨ")
+	@ApiOperation(value="娴嬭瘯缁撴灉-鍒嗛〉鍒楄〃鏌ヨ", notes="娴嬭瘯缁撴灉-鍒嗛〉鍒楄〃鏌ヨ")
+	@GetMapping(value = "/list")
+	public Result<IPage<DryResult>> queryPageList(DryResult dryResult,
+								   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+								   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+								   HttpServletRequest req) {
+		QueryWrapper<DryResult> queryWrapper = QueryGenerator.initQueryWrapper(dryResult, req.getParameterMap());
+		Page<DryResult> page = new Page<DryResult>(pageNo, pageSize);
+		IPage<DryResult> pageList = dryResultService.page(page, queryWrapper);
+		return Result.OK(pageList);
+	}
+	
+	/**
+	 *   娣诲姞
+	 *
+	 * @param dryResult
+	 * @return
+	 */
+	@AutoLog(value = "娴嬭瘯缁撴灉-娣诲姞")
+	@ApiOperation(value="娴嬭瘯缁撴灉-娣诲姞", notes="娴嬭瘯缁撴灉-娣诲姞")
+	@RequiresPermissions("dry:dry_result:add")
+	@PostMapping(value = "/add")
+	public Result<String> add(@RequestBody DryResult dryResult) {
+		dryResultService.save(dryResult);
+		return Result.OK("娣诲姞鎴愬姛锛�");
+	}
+	
+	/**
+	 *  缂栬緫
+	 *
+	 * @param dryResult
+	 * @return
+	 */
+	@AutoLog(value = "娴嬭瘯缁撴灉-缂栬緫")
+	@ApiOperation(value="娴嬭瘯缁撴灉-缂栬緫", notes="娴嬭瘯缁撴灉-缂栬緫")
+	@RequiresPermissions("dry:dry_result:edit")
+	@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+	public Result<String> edit(@RequestBody DryResult dryResult) {
+		dryResultService.updateById(dryResult);
+		return Result.OK("缂栬緫鎴愬姛!");
+	}
+	
+	/**
+	 *   閫氳繃id鍒犻櫎
+	 *
+	 * @param id
+	 * @return
+	 */
+	@AutoLog(value = "娴嬭瘯缁撴灉-閫氳繃id鍒犻櫎")
+	@ApiOperation(value="娴嬭瘯缁撴灉-閫氳繃id鍒犻櫎", notes="娴嬭瘯缁撴灉-閫氳繃id鍒犻櫎")
+	@RequiresPermissions("dry:dry_result:delete")
+	@DeleteMapping(value = "/delete")
+	public Result<String> delete(@RequestParam(name="id",required=true) String id) {
+		dryResultService.removeById(id);
+		return Result.OK("鍒犻櫎鎴愬姛!");
+	}
+	
+	/**
+	 *  鎵归噺鍒犻櫎
+	 *
+	 * @param ids
+	 * @return
+	 */
+	@AutoLog(value = "娴嬭瘯缁撴灉-鎵归噺鍒犻櫎")
+	@ApiOperation(value="娴嬭瘯缁撴灉-鎵归噺鍒犻櫎", notes="娴嬭瘯缁撴灉-鎵归噺鍒犻櫎")
+	@RequiresPermissions("dry:dry_result:deleteBatch")
+	@DeleteMapping(value = "/deleteBatch")
+	public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+		this.dryResultService.removeByIds(Arrays.asList(ids.split(",")));
+		return Result.OK("鎵归噺鍒犻櫎鎴愬姛!");
+	}
+	
+	/**
+	 * 閫氳繃id鏌ヨ
+	 *
+	 * @param id
+	 * @return
+	 */
+	//@AutoLog(value = "娴嬭瘯缁撴灉-閫氳繃id鏌ヨ")
+	@ApiOperation(value="娴嬭瘯缁撴灉-閫氳繃id鏌ヨ", notes="娴嬭瘯缁撴灉-閫氳繃id鏌ヨ")
+	@GetMapping(value = "/queryById")
+	public Result<DryResult> queryById(@RequestParam(name="id",required=true) String id) {
+		DryResult dryResult = dryResultService.getById(id);
+		if(dryResult==null) {
+			return Result.error("鏈壘鍒板搴旀暟鎹�");
+		}
+		return Result.OK(dryResult);
+	}
+
+    /**
+    * 瀵煎嚭excel
+    *
+    * @param request
+    * @param dryResult
+    */
+    @RequiresPermissions("dry:dry_result:exportXls")
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, DryResult dryResult) {
+        return super.exportXls(request, dryResult, DryResult.class, "娴嬭瘯缁撴灉");
+    }
+
+    /**
+      * 閫氳繃excel瀵煎叆鏁版嵁
+    *
+    * @param request
+    * @param response
+    * @return
+    */
+    @RequiresPermissions("dry:dry_result:importExcel")
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        return super.importExcel(request, response, DryResult.class);
+    }
+
+}
diff --git a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mapper/DryOrderMapper.java b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mapper/DryOrderMapper.java
index 885e7fc..5edd90c 100644
--- a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mapper/DryOrderMapper.java
+++ b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mapper/DryOrderMapper.java
@@ -1,7 +1,10 @@
 package org.jeecg.modules.dry.mapper;
 
+import org.apache.ibatis.annotations.Param;
 import org.jeecg.modules.dry.entity.DryOrder;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import java.util.List;
 
 /**
  * @Description: 骞茬嚗宸ュ崟
@@ -11,4 +14,5 @@
  */
 public interface DryOrderMapper extends BaseMapper<DryOrder> {
 
+    List<String> queryMonthOverview(@Param("month") String month, @Param("tenantId") int tenantId);
 }
diff --git a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mapper/DryResultMapper.java b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mapper/DryResultMapper.java
new file mode 100644
index 0000000..f888e7a
--- /dev/null
+++ b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mapper/DryResultMapper.java
@@ -0,0 +1,17 @@
+package org.jeecg.modules.dry.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.dry.entity.DryResult;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: 娴嬭瘯缁撴灉
+ * @Author: jeecg-boot
+ * @Date:   2023-03-19
+ * @Version: V1.0
+ */
+public interface DryResultMapper extends BaseMapper<DryResult> {
+
+}
diff --git a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mapper/xml/DryOrderMapper.xml b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mapper/xml/DryOrderMapper.xml
index 31344b3..ce47adb 100644
--- a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mapper/xml/DryOrderMapper.xml
+++ b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mapper/xml/DryOrderMapper.xml
@@ -2,4 +2,10 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="org.jeecg.modules.dry.mapper.DryOrderMapper">
 
+    <select id="queryMonthOverview" resultType="java.lang.String">
+        select DATE_FORMAT(order_time, '%Y-%m-%d') as orderTime
+        from dry_order where  1=1 and DATE_FORMAT(order_time, '%Y-%m') = #{month}
+         and tenant_id = #{tenantId} group by orderTime  order by orderTime desc
+
+    </select>
 </mapper>
diff --git a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mapper/xml/DryResultMapper.xml b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mapper/xml/DryResultMapper.xml
new file mode 100644
index 0000000..b0dac7f
--- /dev/null
+++ b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mapper/xml/DryResultMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.dry.mapper.DryResultMapper">
+
+</mapper>
\ No newline at end of file
diff --git a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/IDryOrderService.java b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/IDryOrderService.java
index 0fd2b33..6fc915a 100644
--- a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/IDryOrderService.java
+++ b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/IDryOrderService.java
@@ -5,6 +5,8 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.jeecg.modules.dry.vo.DryOrderVo;
 
+import java.util.List;
+
 /**
  * @Description: 骞茬嚗宸ュ崟
  * @Author: jeecg-boot
@@ -15,4 +17,6 @@
 public interface IDryOrderService extends IService<DryOrder> {
 
     void saveRealTimeData(DryOrderVo orderVo);
+
+    List<String> queryMonthOverview(String month, int tenantId);
 }
diff --git a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/IDryOrderTrendService.java b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/IDryOrderTrendService.java
index 9aa9060..951dd12 100644
--- a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/IDryOrderTrendService.java
+++ b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/IDryOrderTrendService.java
@@ -2,6 +2,9 @@
 
 import org.jeecg.modules.dry.entity.DryOrderTrend;
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.dry.vo.DryOrderTrendVo;
+
+import java.util.List;
 
 /**
  * @Description: 宸ュ崟杩囩▼瓒嬪娍
@@ -11,4 +14,5 @@
  */
 public interface IDryOrderTrendService extends IService<DryOrderTrend> {
 
+    List<DryOrderTrendVo> listByOrderId(String id);
 }
diff --git a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/IDryRealTimeDataService.java b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/IDryRealTimeDataService.java
new file mode 100644
index 0000000..7e3844c
--- /dev/null
+++ b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/IDryRealTimeDataService.java
@@ -0,0 +1,10 @@
+package org.jeecg.modules.dry.service;
+
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.modules.dry.vo.RealTimeDataVo;
+
+public interface IDryRealTimeDataService {
+    Result<?> realTimeDataHandle(RealTimeDataVo realTimeDataVo);
+
+    Result<?> queryMachineRealTImeData(RealTimeDataVo realTimeDataVo);
+}
diff --git a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/IDryResultService.java b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/IDryResultService.java
new file mode 100644
index 0000000..f1e562d
--- /dev/null
+++ b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/IDryResultService.java
@@ -0,0 +1,14 @@
+package org.jeecg.modules.dry.service;
+
+import org.jeecg.modules.dry.entity.DryResult;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @Description: 娴嬭瘯缁撴灉
+ * @Author: jeecg-boot
+ * @Date:   2023-03-19
+ * @Version: V1.0
+ */
+public interface IDryResultService extends IService<DryResult> {
+
+}
diff --git a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryOrderServiceImpl.java b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryOrderServiceImpl.java
index 96854fa..d2badb2 100644
--- a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryOrderServiceImpl.java
+++ b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryOrderServiceImpl.java
@@ -9,6 +9,8 @@
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 
+import java.util.List;
+
 /**
  * @Description: 骞茬嚗宸ュ崟
  * @Author: jeecg-boot
@@ -23,4 +25,10 @@
     public void saveRealTimeData(DryOrderVo orderVo) {
         log.info("淇濆瓨瀹炴椂鏁版嵁锛�" + orderVo.toString());
     }
+
+
+    @Override
+    public List<String> queryMonthOverview(String month, int tenantId) {
+        return baseMapper.queryMonthOverview(month, tenantId);
+    }
 }
diff --git a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryOrderTrendServiceImpl.java b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryOrderTrendServiceImpl.java
index ac2997f..9230b20 100644
--- a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryOrderTrendServiceImpl.java
+++ b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryOrderTrendServiceImpl.java
@@ -1,11 +1,17 @@
 package org.jeecg.modules.dry.service.impl;
 
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.jeecg.modules.dry.entity.DryOrderTrend;
 import org.jeecg.modules.dry.mapper.DryOrderTrendMapper;
 import org.jeecg.modules.dry.service.IDryOrderTrendService;
+import org.jeecg.modules.dry.vo.DryOrderTrendVo;
 import org.springframework.stereotype.Service;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * @Description: 宸ュ崟杩囩▼瓒嬪娍
@@ -16,4 +22,16 @@
 @Service
 public class DryOrderTrendServiceImpl extends ServiceImpl<DryOrderTrendMapper, DryOrderTrend> implements IDryOrderTrendService {
 
+    @Override
+    public List<DryOrderTrendVo> listByOrderId(String id) {
+        LambdaQueryWrapper<DryOrderTrend> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(DryOrderTrend::getOrderId, id);
+        queryWrapper.orderByDesc(DryOrderTrend::getWeight);
+        List<DryOrderTrend> dryOrderTrends = baseMapper.selectList(queryWrapper);
+        List<DryOrderTrendVo> vos = new ArrayList<>();
+        dryOrderTrends.stream().forEach(item -> {
+            vos.add(BeanUtil.toBean(item, DryOrderTrendVo.class));
+        });
+        return vos;
+    }
 }
diff --git a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryRealTimeDataServiceImpl.java b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryRealTimeDataServiceImpl.java
new file mode 100644
index 0000000..9fcd610
--- /dev/null
+++ b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryRealTimeDataServiceImpl.java
@@ -0,0 +1,214 @@
+package org.jeecg.modules.dry.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.TypeReference;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.config.TenantContext;
+import org.jeecg.common.util.RedisUtil;
+import org.jeecg.modules.dry.common.CacheConstants;
+import org.jeecg.modules.dry.entity.DryEquipment;
+import org.jeecg.modules.dry.entity.DryHerb;
+import org.jeecg.modules.dry.entity.DryOrder;
+import org.jeecg.modules.dry.entity.DryOrderTrend;
+import org.jeecg.modules.dry.service.*;
+import org.jeecg.modules.dry.vo.DryOrderTrendVo;
+import org.jeecg.modules.dry.vo.DryOrderVo;
+import org.jeecg.modules.dry.vo.RealTimeDataVo;
+import org.jetbrains.annotations.NotNull;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Map;
+@Slf4j
+@Service
+public class DryRealTimeDataServiceImpl implements IDryRealTimeDataService {
+    @Autowired
+    private IDryOrderService dryOrderService;
+    @Autowired
+    private IDryOrderTrendService dryOrderTrendService;
+
+    @Autowired
+    private IDryHerbService herbService;
+
+    @Autowired
+    private IDryEquipmentService equipmentService;
+
+    @Autowired
+    private RedisUtil redisUtil;
+
+    @Override
+    @Transactional
+    public Result<?> realTimeDataHandle(RealTimeDataVo realTimeDataVo) {
+        TenantContext.setTenant(realTimeDataVo.getTenantid()+"");
+        log.info("瀹炴椂鏁版嵁锛�"+realTimeDataVo.toString());
+
+        // 1 鏌ヨ鎴栧垱寤哄伐鍗�
+        // 1.1 浠巖edis鍙栧嚭宸ュ崟缂撳瓨
+        DryOrderVo orderVo = (DryOrderVo) redisUtil.hget(CacheConstants.RedisKeyEnum.WORK_ORDER.getCode(),
+                realTimeDataVo.getTenantid()+"_"+realTimeDataVo.getMachineid());
+        // 1.2 濡傛灉鏈夌紦瀛樿褰�
+        if(orderVo != null && orderVo.getCode().equals(realTimeDataVo.getWorkorder())) {
+
+        // 1.3 娌℃湁缂撳瓨璁板綍鍐嶆煡璇㈡暟鎹簱
+        } else {
+            // 鏍规嵁绉熸埛id鍜屽伐鍗曞彿鏌ヨ鏁版嵁搴撴槸鍚︽湁璁板綍锛屾湁鍒欒繑鍥烇紝娌℃湁鍒欐柊澧炰竴鏉″啀杩斿洖
+            orderVo = getOrSaveDryOrderVoDB(realTimeDataVo);
+        }
+
+        // 2 鏇存柊宸ュ崟瀹炴椂鏁版嵁
+        // 2.1 灏嗗伐鍗曚腑鐨勬暟鎹浛鎹负鏈�鏂版暟鎹�
+        realTimeDataVo.setOrderId(orderVo.getId());
+        orderVo.setInitial(realTimeDataVo.getMoisture1());
+        orderVo.setDryTime(realTimeDataVo.getTime3());
+        orderVo.setDelay(realTimeDataVo.getDelay());
+        orderVo.setTurn(realTimeDataVo.getTurntime());
+        orderVo.setYield(realTimeDataVo.getWeight3());
+        orderVo.setStart(realTimeDataVo.getStart());
+        orderVo.setAuto(realTimeDataVo.getAuto());
+        orderVo.setPlcdisable(realTimeDataVo.getPlcdisable());
+        orderVo.setLowalarm(realTimeDataVo.getLowalarm());
+        orderVo.setWind(realTimeDataVo.getWind());
+        DryOrderTrendVo trendVo = new DryOrderTrendVo(realTimeDataVo);
+        // 2.2 淇濆瓨宸ュ崟鍚按鐜囧彉鍖� 鎴� 閲嶉噺鍙樺寲
+        saveOrderTrendVo(trendVo, orderVo);
+        orderVo.setTrendVo(trendVo);
+        orderVo.getBellowsTemp().put(realTimeDataVo.getTime3(), realTimeDataVo.getTemp2());
+        // 2.3 鏇存柊鍒皉edis缂撳瓨
+        redisUtil.hset(CacheConstants.RedisKeyEnum.WORK_ORDER.getCode(),
+                realTimeDataVo.getTenantid()+"_"+realTimeDataVo.getMachineid(),orderVo, 600000);
+        return Result.ok();
+    }
+
+    /**
+     * 鏍规嵁绉熸埛id鍜屽伐鍗曞彿鏌ヨ鏁版嵁搴撴槸鍚︽湁璁板綍锛屾湁鍒欒繑鍥烇紝娌℃湁鍒欐柊澧炰竴鏉�
+     * @param realTimeDataVo
+     * @return
+     */
+    private DryOrderVo getOrSaveDryOrderVoDB(RealTimeDataVo realTimeDataVo) {
+        DryOrderVo orderVo;
+        LambdaQueryWrapper<DryOrder> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(DryOrder::getCode, realTimeDataVo.getWorkorder());
+        queryWrapper.eq(DryOrder::getTenantId, realTimeDataVo.getTenantid());
+        // 1 鏌ヨ鏁版嵁搴�
+        DryOrder one = dryOrderService.getOne(queryWrapper);
+        // 2 鏁版嵁搴撴湁璁板綍锛屾洿鏂板埌缂撳瓨
+        if (one != null) {
+            // 杞崲涓虹紦瀛樻暟鎹粨鏋�
+            orderVo = BeanUtil.toBean(one, DryOrderVo.class);
+            if (one.getTemps() != null) {
+                Map map = JSONObject.parseObject(one.getTemps(), new TypeReference<Map<Integer,Double>>(){});
+                orderVo.setBellowsTemp(map);
+            }
+            // 鏌ヨ绉伴噸璁板綍锛屾坊鍔犲埌缂撳瓨鏁版嵁缁撴瀯
+            List<DryOrderTrendVo> trendVos = dryOrderTrendService.listByOrderId(one.getId());
+            if (trendVos != null && trendVos.size() > 0) {
+                DryOrderTrendVo oldVo = trendVos.get(trendVos.size() - 1);
+                orderVo.setTrendVo(oldVo);
+                orderVo.setDetailList(trendVos);
+            }
+        // 3 鏁版嵁搴撴病鏈夊垯鏂板涓�鏉℃暟鎹�
+        } else {
+            orderVo = saveNewOrder(realTimeDataVo);
+        }
+        return orderVo;
+    }
+
+    /**
+     * 淇濆瓨鏂板伐鍗�
+     * @param realTimeDataVo
+     * @return
+     */
+    @NotNull
+    private DryOrderVo saveNewOrder(RealTimeDataVo realTimeDataVo) {
+        DryOrderVo orderVo;
+        // 鏌ヨ鑽潗
+        DryHerb herb =  queryHerbByIndexTenant(realTimeDataVo);
+        // 鏌ヨ璁惧
+        DryEquipment equ = queryEquipmentByCodeTenant(realTimeDataVo);
+
+        // 鍒涘缓鏂板伐鍗�
+        orderVo = new DryOrderVo(realTimeDataVo);
+        orderVo.setHerbId(herb.getId());
+        orderVo.setEquId(equ.getId());
+        DryOrder dryOrder = BeanUtil.toBean(orderVo, DryOrder.class);
+        boolean save = dryOrderService.save(dryOrder);
+        return orderVo;
+    }
+
+
+    /**
+     * 鏌ヨ璁惧锛屾柊璁惧鍒欐坊鍔犲埌璁惧涓绘暟鎹�
+     * @param realTimeDataVo
+     * @return
+     */
+    private DryEquipment queryEquipmentByCodeTenant(RealTimeDataVo realTimeDataVo) {
+        LambdaQueryWrapper<DryEquipment> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(DryEquipment::getTenantId, realTimeDataVo.getTenantid());
+        queryWrapper.eq(DryEquipment::getCode, realTimeDataVo.getMachineid());
+        DryEquipment one = equipmentService.getOne(queryWrapper);
+        if (one == null) {
+            one = new DryEquipment(realTimeDataVo);
+            equipmentService.save(one);
+        }
+        return one;
+    }
+
+    /**
+     * 鏌ヨ鑽潗锛屾柊鑽潗娣诲姞鍒版暟鎹簱
+     * @param realTimeDataVo
+     * @return
+     */
+    private DryHerb queryHerbByIndexTenant(RealTimeDataVo realTimeDataVo) {
+        LambdaQueryWrapper<DryHerb> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(DryHerb::getTenantId, realTimeDataVo.getTenantid());
+        queryWrapper.eq(DryHerb::getCode, realTimeDataVo.getIndex());
+        DryHerb one = herbService.getOne(queryWrapper);
+        if (one == null) {
+            one = new DryHerb(realTimeDataVo);
+            herbService.save(one);
+        }
+        return one;
+    }
+
+    /**
+     * 淇濆瓨鍚按鐜囧彉鍖栬褰�
+     * @param trendVo
+     * @param orderVo
+     */
+    private void saveOrderTrendVo(DryOrderTrendVo trendVo, DryOrderVo orderVo) {
+        //鍒ゆ柇 瀹炴椂鍚按鐜� 鎴� 瀹炴椂閲嶉噺鏈夋病鏈夊彉鍖栵紝鏈夊彉鍖栧垯鏇存柊
+        if(orderVo.getTrendVo() == null
+                || trendVo.getWeight() < orderVo.getTrendVo().getWeight()
+                ) {
+            DryOrder byId = dryOrderService.getById(orderVo.getId());
+            // 灏嗘渶鏂扮粨鏋滄洿鏂板埌宸ュ崟
+            if (byId != null) {
+                BeanUtil.copyProperties(orderVo, byId);
+                byId.setTemps(JSONObject.toJSONString(orderVo.getBellowsTemp()));
+                dryOrderService.updateById(byId);
+            }
+            // 淇濆瓨鍚按鐜囧彉鍖�
+            orderVo.getDetailList().add(trendVo);
+            DryOrderTrend dryOrderTrend = BeanUtil.toBean(trendVo, DryOrderTrend.class);
+            dryOrderTrendService.save(dryOrderTrend);
+        }
+    }
+
+
+    /**
+     * 鏌ヨ鏈哄彴瀹炴椂鏁版嵁
+     * @param realTimeDataVo
+     * @return
+     */
+    @Override
+    public Result<?> queryMachineRealTImeData(RealTimeDataVo realTimeDataVo) {
+        TenantContext.setTenant(realTimeDataVo.getTenantid()+"");
+        DryOrderVo orderVo = (DryOrderVo) redisUtil.hget(CacheConstants.RedisKeyEnum.WORK_ORDER.getCode(), realTimeDataVo.getTenantid()+"_"+realTimeDataVo.getMachineid());
+        return Result.ok(orderVo);
+    }
+}
diff --git a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryResultServiceImpl.java b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryResultServiceImpl.java
new file mode 100644
index 0000000..881c8c5
--- /dev/null
+++ b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryResultServiceImpl.java
@@ -0,0 +1,19 @@
+package org.jeecg.modules.dry.service.impl;
+
+import org.jeecg.modules.dry.entity.DryResult;
+import org.jeecg.modules.dry.mapper.DryResultMapper;
+import org.jeecg.modules.dry.service.IDryResultService;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+/**
+ * @Description: 娴嬭瘯缁撴灉
+ * @Author: jeecg-boot
+ * @Date:   2023-03-19
+ * @Version: V1.0
+ */
+@Service
+public class DryResultServiceImpl extends ServiceImpl<DryResultMapper, DryResult> implements IDryResultService {
+
+}
diff --git a/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/websocket/DrySocket.java b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/websocket/DrySocket.java
new file mode 100644
index 0000000..6103217
--- /dev/null
+++ b/jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/websocket/DrySocket.java
@@ -0,0 +1,214 @@
+package org.jeecg.modules.dry.websocket;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.constant.DrySocketConst;
+import org.jeecg.common.util.SpringContextUtils;
+import org.jeecg.modules.dry.service.IDryRealTimeDataService;
+import org.jeecg.modules.dry.vo.RealTimeDataVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.websocket.OnClose;
+import javax.websocket.OnMessage;
+import javax.websocket.OnOpen;
+import javax.websocket.Session;
+import javax.websocket.server.PathParam;
+import javax.websocket.server.ServerEndpoint;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+@Slf4j
+@Component
+@ServerEndpoint("/drySocket/{tenantId}/{machineId}")
+public class DrySocket {
+
+    /**
+     * 褰撳墠 session
+     */
+    private Session session;
+    /**
+     * 褰撳墠绉熸埛id
+     */
+    private String tenantId;
+    /**
+     * 璁惧id锛岀敤浜庢爣璇嗗悓涓�绉熸埛锛屼笉鍚岃澶囩殑鏁版嵁
+     */
+    private String machineId;
+    /**
+     * 褰撳墠socket鍞竴id
+     */
+    private String socketId;
+
+    /**
+     * 绉熸埛杩炴帴姹狅紝鍖呭惈鍗曚釜绉熸埛鐨勬墍鏈塻ocket杩炴帴锛�
+     * 鍥犱负涓�涓鎴峰彲鑳芥墦寮�澶氫釜璁惧锛屽涓澶囧氨浼氭湁澶氫釜杩炴帴锛�
+     * key鏄痶enantId锛寁alue鏄疢ap瀵硅薄锛涘瓙Map鐨刱ey鏄痬achineId锛寁alue鏄痙rySocket瀵硅薄
+     */
+    private static Map<String, Map<String, DrySocket>> tenantPool = new HashMap<>();
+    /**
+     * 杩炴帴姹狅紝鍖呭惈鎵�鏈塛ebSocket杩炴帴锛�
+     * key鏄痵ocketId锛寁alue鏄痙rySocket瀵硅薄
+     */
+    private static Map<String, DrySocket> machinePool = new HashMap<>();
+
+    /**
+     * 鑾峰彇鏌愪釜绉熸埛鎵�鏈夌殑璁惧
+     */
+    public static Map<String, DrySocket> getTenantPool(String tenantId) {
+        return tenantPool.computeIfAbsent(tenantId, k -> new HashMap<>(5));
+    }
+
+    /**
+     * 鍚戝綋鍓嶇鎴峰彂閫佹秷鎭�
+     *
+     * @param message 娑堟伅鍐呭
+     */
+    public void sendMessage(String message) {
+        try {
+            this.session.getAsyncRemote().sendText(message);
+        } catch (Exception e) {
+            log.error("銆恉rySocket銆戞秷鎭彂閫佸け璐ワ細" + e.getMessage());
+        }
+    }
+
+    /**
+     * 灏佽娑堟伅json
+     *
+     * @param data 娑堟伅鍐呭
+     */
+    public static String packageMessage(String type, Object data) {
+        JSONObject message = new JSONObject();
+        message.put(DrySocketConst.TYPE, type);
+        message.put(DrySocketConst.DATA, data);
+        return message.toJSONString();
+    }
+
+    /**
+     * 鍚戞寚瀹氱鎴风殑鎵�鏈夎澶囧彂閫佹秷鎭�
+     *
+     * @param tenantId  鎺ユ敹娑堟伅鐨勭鎴稩D
+     * @param message 娑堟伅鍐呭
+     */
+    public static void sendMessageTo(String tenantId, String message) {
+        Collection<DrySocket> values = getTenantPool(tenantId).values();
+        if (values.size() > 0) {
+            for (DrySocket socketItem : values) {
+                socketItem.sendMessage(message);
+            }
+        } else {
+            log.warn("銆恉rySocket銆戞秷鎭彂閫佸け璐ワ細tenantId\"" + tenantId + "\"涓嶅瓨鍦ㄦ垨鏈湪绾匡紒");
+        }
+    }
+
+    /**
+     * 鍚戞寚瀹氱鎴风殑鎸囧畾璁惧鍙戦�佹秷鎭�
+     *
+     * @param tenantId  鎺ユ敹娑堟伅鐨勭鎴稩D
+     * @param message 娑堟伅鍐呭
+     */
+    public static void sendMessageTo(String tenantId, String machineId, String message) {
+        DrySocket socketItem = getTenantPool(tenantId).get(machineId);
+        if (socketItem != null) {
+            socketItem.sendMessage(message);
+        } else {
+            log.warn("銆恉rySocket銆戞秷鎭彂閫佸け璐ワ細tenantId\"" + tenantId + "\"鐨刴achineId\"" + machineId + "\"涓嶅瓨鍦ㄦ垨鏈湪绾匡紒");
+        }
+    }
+
+    /**
+     * 鍚戝涓鎴风殑鎵�鏈夎澶囧彂閫佹秷鎭�
+     *
+     * @param tenantIds 鎺ユ敹娑堟伅鐨勭鎴稩D鏁扮粍
+     * @param message 娑堟伅鍐呭
+     */
+    public static void sendMessageTo(String[] tenantIds, String message) {
+        for (String tenantId : tenantIds) {
+            DrySocket.sendMessageTo(tenantId, message);
+        }
+    }
+
+    /**
+     * 鍚戞墍鏈夌鎴风殑鎵�鏈夎澶囧彂閫佹秷鎭�
+     *
+     * @param message 娑堟伅鍐呭
+     */
+    public static void sendMessageToAll(String message) {
+        for (DrySocket socketItem : machinePool.values()) {
+            socketItem.sendMessage(message);
+        }
+    }
+
+    /**
+     * websocket 寮�鍚繛鎺�
+     */
+    @OnOpen
+    public void onOpen(Session session, @PathParam("tenantId") String tenantId, @PathParam("machineId") String machineId) {
+        try {
+            this.tenantId = tenantId;
+            this.machineId = machineId;
+            this.socketId = tenantId + machineId;
+            this.session = session;
+
+            machinePool.put(this.socketId, this);
+            getTenantPool(tenantId).put(this.machineId, this);
+
+            log.info("銆恉rySocket銆戞湁鏂扮殑杩炴帴锛屾�绘暟涓�:" + machinePool.size());
+        } catch (Exception ignored) {
+        }
+    }
+
+    /**
+     * websocket 鏂紑杩炴帴
+     */
+    @OnClose
+    public void onClose() {
+        try {
+            machinePool.remove(this.socketId);
+            getTenantPool(this.tenantId).remove(this.machineId);
+
+            log.info("銆恉rySocket銆戣繛鎺ユ柇寮�锛屾�绘暟涓�:" + machinePool.size());
+        } catch (Exception ignored) {
+        }
+    }
+
+    /**
+     * websocket 鏀跺埌娑堟伅
+     */
+    @OnMessage
+    public void onMessage(String message) {
+        log.info("銆恉rySocket銆憃nMessage:" + message);
+        IDryRealTimeDataService realTimeDataService = SpringContextUtils.getBean(IDryRealTimeDataService.class);
+        JSONObject json;
+        try {
+            json = JSON.parseObject(message);
+        } catch (Exception e) {
+            log.warn("銆恉rySocket銆戞敹鍒颁笉鍚堟硶鐨勬秷鎭�:" + message);
+            return;
+        }
+        String type = json.getString(DrySocketConst.TYPE);
+        switch (type) {
+            // 蹇冭烦妫�娴�
+            case DrySocketConst.TYPE_HB:
+                this.sendMessage(DrySocket.packageMessage(type, true));
+                break;
+            // 瀹炴椂鏁版嵁澶勭悊
+            case DrySocketConst.TYPE_RDT:
+                Object o = json.get(DrySocketConst.DATA);
+                RealTimeDataVo realTimeDataVo = BeanUtil.toBean(o, RealTimeDataVo.class);
+                realTimeDataService.realTimeDataHandle(realTimeDataVo);
+                break;
+
+            default:
+                log.warn("銆恉rySocket銆戞敹鍒颁笉璇嗗埆鐨勬秷鎭被鍨�:" + type);
+                break;
+        }
+
+
+    }
+
+
+}
diff --git a/jeecg-module-dry/jeecg-module-dry-start/src/main/resources/logback-spring.xml b/jeecg-module-dry/jeecg-module-dry-start/src/main/resources/logback-spring.xml
new file mode 100644
index 0000000..6c0fd36
--- /dev/null
+++ b/jeecg-module-dry/jeecg-module-dry-start/src/main/resources/logback-spring.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration debug="false">
+	<!--瀹氫箟鏃ュ織鏂囦欢鐨勫瓨鍌ㄥ湴鍧� -->
+	<property name="LOG_HOME" value="../logs" />
+
+	<!--<property name="COLOR_PATTERN" value="%black(%contextName-) %red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta( %replace(%caller{1}){'\t|Caller.{1}0|\r\n', ''})- %gray(%msg%xEx%n)" />-->
+	<!-- 鎺у埗鍙拌緭鍑� -->
+	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<!--鏍煎紡鍖栬緭鍑猴細%d琛ㄧず鏃ユ湡锛�%thread琛ㄧず绾跨▼鍚嶏紝%-5level锛氱骇鍒粠宸︽樉绀�5涓瓧绗﹀搴�%msg锛氭棩蹇楁秷鎭紝%n鏄崲琛岀
+			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n</pattern>-->
+			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{50}:%L) - %msg%n</pattern>
+		</encoder>
+	</appender>
+
+	<!-- 鎸夌収姣忓ぉ鐢熸垚鏃ュ織鏂囦欢 -->
+	<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+			<!--鏃ュ織鏂囦欢杈撳嚭鐨勬枃浠跺悕 -->
+			<FileNamePattern>${LOG_HOME}/herb-dry-%d{yyyy-MM-dd}.%i.log</FileNamePattern>
+			<!--鏃ュ織鏂囦欢淇濈暀澶╂暟 -->
+			<MaxHistory>30</MaxHistory>
+			<maxFileSize>10MB</maxFileSize>
+		</rollingPolicy>
+		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+			<!--鏍煎紡鍖栬緭鍑猴細%d琛ㄧず鏃ユ湡锛�%thread琛ㄧず绾跨▼鍚嶏紝%-5level锛氱骇鍒粠宸︽樉绀�5涓瓧绗﹀搴�%msg锛氭棩蹇楁秷鎭紝%n鏄崲琛岀 -->
+			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n</pattern>
+		</encoder>
+	</appender>
+
+	<!-- 鐢熸垚 error html鏍煎紡鏃ュ織寮�濮� -->
+	<appender name="HTML" class="ch.qos.logback.core.FileAppender">
+		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+			<!--璁剧疆鏃ュ織绾у埆,杩囨护鎺塱nfo鏃ュ織,鍙緭鍏rror鏃ュ織-->
+			<level>ERROR</level>
+		</filter>
+		<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
+			<layout class="ch.qos.logback.classic.html.HTMLLayout">
+				<pattern>%p%d%msg%M%F{32}%L</pattern>
+			</layout>
+		</encoder>
+		<file>${LOG_HOME}/error-log.html</file>
+	</appender>
+	<!-- 鐢熸垚 error html鏍煎紡鏃ュ織缁撴潫 -->
+
+	<!-- 姣忓ぉ鐢熸垚涓�涓猦tml鏍煎紡鐨勬棩蹇楀紑濮� -->
+	<appender name="FILE_HTML" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+			<!--鏃ュ織鏂囦欢杈撳嚭鐨勬枃浠跺悕 -->
+			<FileNamePattern>${LOG_HOME}/herb-dry-%d{yyyy-MM-dd}.%i.html</FileNamePattern>
+			<!--鏃ュ織鏂囦欢淇濈暀澶╂暟 -->
+			<MaxHistory>30</MaxHistory>
+			<MaxFileSize>10MB</MaxFileSize>
+		</rollingPolicy>
+		<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
+			<layout class="ch.qos.logback.classic.html.HTMLLayout">
+				<pattern>%p%d%msg%M%F{32}%L</pattern>
+			</layout>
+		</encoder>
+	</appender>
+	<!-- 姣忓ぉ鐢熸垚涓�涓猦tml鏍煎紡鐨勬棩蹇楃粨鏉� -->
+
+	<!--myibatis log configure -->
+	<logger name="com.apache.ibatis" level="TRACE" />
+	<logger name="java.sql.Connection" level="DEBUG" />
+	<logger name="java.sql.Statement" level="DEBUG" />
+	<logger name="java.sql.PreparedStatement" level="DEBUG" />
+
+	<!-- 鏃ュ織杈撳嚭绾у埆 -->
+	<root level="INFO">
+		<appender-ref ref="STDOUT" />
+		<appender-ref ref="FILE" />
+		<appender-ref ref="HTML" />
+		<appender-ref ref="FILE_HTML" />
+	</root>
+
+</configuration>

--
Gitblit v1.9.3