干燥机配套车间生产管理系统/云平台服务端
baoshiwei
2023-03-27 88880cf067bf4d3aacdf9ba70353b731888cf9fe
实时数据接口与移动端接口
已添加16个文件
已修改19个文件
1862 ■■■■ 文件已修改
db/herb.sql 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
db/nginx/nginx.key 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
db/nginx/nginx.pem 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/DrySocketConst.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-boot-base-core/src/main/java/org/jeecg/config/WebSocketConfig.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-boot-base-core/src/main/java/org/jeecg/config/mybatis/MybatisPlusSaasConfig.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/common/CacheConstants.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/entity/DryEquipment.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/entity/DryHerb.java 60 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/entity/DryOrder.java 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/entity/DryOrderTrend.java 43 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/entity/DryResult.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/DryOrderTrendVo.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/DryOrderVo.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/vo/RealTimeDataVo.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryHelloController.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryOrderController.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryOrderTrendController.java 344 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryRealTimeDataController.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryResultController.java 178 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mapper/DryOrderMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mapper/DryResultMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mapper/xml/DryOrderMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/mapper/xml/DryResultMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/IDryOrderService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/IDryOrderTrendService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/IDryRealTimeDataService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/IDryResultService.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryOrderServiceImpl.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryOrderTrendServiceImpl.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryRealTimeDataServiceImpl.java 214 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/service/impl/DryResultServiceImpl.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/websocket/DrySocket.java 214 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jeecg-module-dry/jeecg-module-dry-start/src/main/resources/logback-spring.xml 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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`;
/*
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-----
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-----
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";
}
jeecg-boot-base-core/src/main/java/org/jeecg/config/WebSocketConfig.java
@@ -12,6 +12,7 @@
 */
@Configuration
public class WebSocketConfig {
    /**
     *     æ³¨å…¥ServerEndpointExporter,
     *     è¿™ä¸ªbean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint
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");
    }
jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java
@@ -140,6 +140,7 @@
        filterChainDefinitionMap.put("/websocket/**", "anon");//系统通知和公告
        filterChainDefinitionMap.put("/newsWebsocket/**", "anon");//CMS模块
        filterChainDefinitionMap.put("/vxeSocket/**", "anon");//JVxeTable无痕刷新示例
        filterChainDefinitionMap.put("/drySocket/**", "anon");//干燥机通信
        //性能监控——安全隐患泄露TOEKN(durid连接池也有)
        //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");
        // æ·»åŠ è‡ªå·±çš„è¿‡æ»¤å™¨å¹¶ä¸”å–åä¸ºjwt
        Map<String, Filter> filterMap = new HashMap<String, Filter>(1);
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;
        }
    }
}
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();
    }
}
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();
    }
}
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;
}
jeecg-module-dry/jeecg-module-dry-api/src/main/java/org/jeecg/modules/dry/entity/DryOrderTrend.java
@@ -41,16 +41,45 @@
    @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;
    /**总时间*/
    @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")
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;
}
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();
    }
}
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/正常 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();
    }
}
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/正常 false*/
    private Boolean lowalarm;
    /**热风 true/冷风 false*/
    private Boolean wind;
}
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();
    }
}
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);
    }
}
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) {
        //------------------------------------------------------------------------------------------------
        //是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】
        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) {
//        //------------------------------------------------------------------------------------------------
//        //是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】
//        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);
//    }
//
//}
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);
    }
}
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);
    }
}
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);
}
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> {
}
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>
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>
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);
}
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);
}
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);
}
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> {
}
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);
    }
}
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;
    }
}
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 ä»Žredis取出工单缓存
        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 æ›´æ–°åˆ°redis缓存
        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);
    }
}
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 {
}
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;
    /**
     * ç§Ÿæˆ·è¿žæŽ¥æ± ï¼ŒåŒ…含单个租户的所有socket连接;
     * å› ä¸ºä¸€ä¸ªç§Ÿæˆ·å¯èƒ½æ‰“开多个设备,多个设备就会有多个连接;
     * key是tenantId,value是Map对象;子Map的key是machineId,value是drySocket对象
     */
    private static Map<String, Map<String, DrySocket>> tenantPool = new HashMap<>();
    /**
     * è¿žæŽ¥æ± ï¼ŒåŒ…含所有WebSocket连接;
     * key是socketId,value是drySocket对象
     */
    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("【drySocket】消息发送失败:" + 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  æŽ¥æ”¶æ¶ˆæ¯çš„租户ID
     * @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("【drySocket】消息发送失败:tenantId\"" + tenantId + "\"不存在或未在线!");
        }
    }
    /**
     * å‘指定租户的指定设备发送消息
     *
     * @param tenantId  æŽ¥æ”¶æ¶ˆæ¯çš„租户ID
     * @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("【drySocket】消息发送失败:tenantId\"" + tenantId + "\"的machineId\"" + machineId + "\"不存在或未在线!");
        }
    }
    /**
     * å‘多个租户的所有设备发送消息
     *
     * @param tenantIds æŽ¥æ”¶æ¶ˆæ¯çš„租户ID数组
     * @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("【drySocket】有新的连接,总数为:" + machinePool.size());
        } catch (Exception ignored) {
        }
    }
    /**
     * websocket æ–­å¼€è¿žæŽ¥
     */
    @OnClose
    public void onClose() {
        try {
            machinePool.remove(this.socketId);
            getTenantPool(this.tenantId).remove(this.machineId);
            log.info("【drySocket】连接断开,总数为:" + machinePool.size());
        } catch (Exception ignored) {
        }
    }
    /**
     * websocket æ”¶åˆ°æ¶ˆæ¯
     */
    @OnMessage
    public void onMessage(String message) {
        log.info("【drySocket】onMessage:" + message);
        IDryRealTimeDataService realTimeDataService = SpringContextUtils.getBean(IDryRealTimeDataService.class);
        JSONObject json;
        try {
            json = JSON.parseObject(message);
        } catch (Exception e) {
            log.warn("【drySocket】收到不合法的消息:" + 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("【drySocket】收到不识别的消息类型:" + type);
                break;
        }
    }
}
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">
            <!--设置日志级别,过滤掉info日志,只输入error日志-->
            <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格式日志结束 -->
    <!-- æ¯å¤©ç”Ÿæˆä¸€ä¸ªhtml格式的日志开始 -->
    <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>
    <!-- æ¯å¤©ç”Ÿæˆä¸€ä¸ªhtml格式的日志结束 -->
    <!--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>