版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第1章緒論1.1研究背景隨著物聯(lián)網(wǎng)技術(shù)的迅速發(fā)展和廣泛應(yīng)用,各類設(shè)備的連接與管理方式發(fā)生了深刻變革。從傳統(tǒng)的單一控制到如今的智能化、網(wǎng)絡(luò)化運(yùn)維,設(shè)備信息的獲取于交互方式愈發(fā)豐富多樣。而基于物聯(lián)網(wǎng)的設(shè)備運(yùn)維管理系統(tǒng)正以其精準(zhǔn)、高效的特性,成為現(xiàn)代工業(yè)、家居等領(lǐng)域不可或缺的重要工具。據(jù)統(tǒng)計(jì),采用物聯(lián)網(wǎng)技術(shù)的設(shè)備運(yùn)維管理系統(tǒng)已經(jīng)廣泛應(yīng)用于電力、交通、醫(yī)療等多個(gè)領(lǐng)域,為提升行業(yè)的智能化水平、推動(dòng)產(chǎn)業(yè)升級(jí)做出了重要貢獻(xiàn)。因此,深入研究基于物聯(lián)網(wǎng)的設(shè)備運(yùn)維管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn),不僅具有重要的理論價(jià)值,更有著廣闊的應(yīng)用前景和深遠(yuǎn)的社會(huì)意義。 1.2研究意義設(shè)備運(yùn)維對(duì)企業(yè)的穩(wěn)定生產(chǎn)和長期發(fā)展具有重要意義,但是傳統(tǒng)的設(shè)備運(yùn)維方式,如人工巡檢,效率低下且容易出錯(cuò)。物聯(lián)網(wǎng)設(shè)備運(yùn)維管理系統(tǒng)具備實(shí)時(shí)、自動(dòng)監(jiān)控設(shè)備運(yùn)行狀態(tài)的能力,它可以通過對(duì)數(shù)據(jù)的深度分析,預(yù)測潛在故障,并進(jìn)行遠(yuǎn)程修復(fù)。這大大提高了設(shè)備的運(yùn)行效率和可靠性。通過這些數(shù)據(jù)分析,企業(yè)可以更加精確地了解設(shè)備的運(yùn)行狀態(tài)和需求,從而優(yōu)化資源配置,避免資源的浪費(fèi)。并且基于物聯(lián)網(wǎng)的設(shè)備運(yùn)維管理系統(tǒng)是智能化發(fā)展的重要組成部分,隨著物聯(lián)網(wǎng)技術(shù)的引入,企業(yè)的設(shè)備運(yùn)維管理可以變得更加信息化、智能化。通過引入更先進(jìn)的技術(shù),運(yùn)維人員可以更加高效地完成運(yùn)維及管理任務(wù),減少了傳統(tǒng)運(yùn)維方式下可能出現(xiàn)的錯(cuò)誤。其次,隨著設(shè)備運(yùn)維的智能化和安全性的加強(qiáng),企業(yè)在運(yùn)維方面的成本也會(huì)降低。本課題的設(shè)計(jì)與實(shí)現(xiàn),旨在通過物聯(lián)網(wǎng)技術(shù)和工具,實(shí)現(xiàn)企業(yè)設(shè)備運(yùn)維管理的優(yōu)化,為企業(yè)設(shè)備運(yùn)維管理的信息化、智能化創(chuàng)造價(jià)值。1.3國內(nèi)外研究現(xiàn)狀設(shè)備運(yùn)維管理是指設(shè)備運(yùn)行的維護(hù)、維修等管理工作。在正常生產(chǎn)中,設(shè)備運(yùn)行維護(hù)不到位或者維修把控不及時(shí)都會(huì)對(duì)設(shè)備造成一定影響,進(jìn)而產(chǎn)生安全隱患或者故障維修,只有做好運(yùn)維管理,及時(shí)補(bǔ)償設(shè)備磨損,恢復(fù)設(shè)備性能,才能確保設(shè)備始終處于完好狀態(tài),提升設(shè)備利用率和安全性,保證生產(chǎn)持續(xù)進(jìn)行。因此,設(shè)備運(yùn)維管理是企業(yè)長久發(fā)展的關(guān)鍵REF_Ref15245\r\h[1]。設(shè)備運(yùn)維作為企業(yè)十分重要的環(huán)節(jié),其智能化、數(shù)字化得到了國內(nèi)外的高度重視。企業(yè)運(yùn)行與信息化技術(shù)的應(yīng)用密不可分,所以需要不斷完善運(yùn)維管理系統(tǒng),提升服務(wù)質(zhì)量,保障企業(yè)的正常生產(chǎn)經(jīng)營[2]。在國內(nèi),基于物聯(lián)網(wǎng)的設(shè)備運(yùn)維管理得到了廣泛關(guān)注和應(yīng)用。許多企業(yè)開始利用物聯(lián)網(wǎng)技術(shù)實(shí)現(xiàn)設(shè)備的遠(yuǎn)程監(jiān)控和管理,以提高設(shè)備的運(yùn)行效率和降低運(yùn)維成本。例如,在智能制造領(lǐng)域,物聯(lián)網(wǎng)技術(shù)被廣泛應(yīng)用于生產(chǎn)線的監(jiān)控和故障診斷,實(shí)現(xiàn)了設(shè)備的預(yù)測性維護(hù)和遠(yuǎn)程故障排除。此外,在能源、交通、醫(yī)療等領(lǐng)域,基于物聯(lián)網(wǎng)的設(shè)備運(yùn)維管理也得到了廣泛應(yīng)用。目前,理論研究和技術(shù)方面也有大量成果。國內(nèi)運(yùn)維系統(tǒng)軟件起步較晚,但隨著信息技術(shù)的飛速發(fā)展,設(shè)備運(yùn)維軟件設(shè)計(jì)在理論研究和技術(shù)方面也有大量成果。北京化工大學(xué)的母俐麗等,以幫助企業(yè)實(shí)現(xiàn)低成本且高效率的運(yùn)維為目標(biāo),結(jié)合其運(yùn)維特點(diǎn)為中小型企業(yè)設(shè)計(jì)了適用的運(yùn)維系統(tǒng)架構(gòu)[3]。并且對(duì)大多數(shù)企業(yè)來言,以下問題比較突出:缺少一套設(shè)備維修記錄實(shí)時(shí)自動(dòng)生成、整理和統(tǒng)計(jì)的平臺(tái)。設(shè)備維修記錄的生成來自于各分廠設(shè)備員人工統(tǒng)計(jì),缺乏實(shí)時(shí)性、客觀性、準(zhǔn)確性和可靠性,導(dǎo)致該數(shù)據(jù)無法進(jìn)行有效統(tǒng)計(jì)和分析。而預(yù)防預(yù)知性維修缺少基礎(chǔ)數(shù)據(jù)會(huì)導(dǎo)致重復(fù)性故障發(fā)生,為公司帶來經(jīng)濟(jì)損失。缺少一套提醒設(shè)備操作者定期點(diǎn)檢的工具以及點(diǎn)檢完成情況反饋給管理人員的平臺(tái)。操作者填寫點(diǎn)檢記錄,管理人員隨機(jī)或定期對(duì)點(diǎn)檢記錄進(jìn)行檢查。多次出現(xiàn)操作者未按時(shí)點(diǎn)檢、集中填寫點(diǎn)檢記錄應(yīng)付檢查的情況,阻礙了設(shè)備故障隱患的及時(shí)發(fā)現(xiàn),導(dǎo)致設(shè)備故障率增高、有效利用率下降[4]。而運(yùn)維管理工作制度不完善是企業(yè)內(nèi)部該項(xiàng)工作開展受限的另一重要因素。設(shè)備運(yùn)維管理機(jī)制的落后,沒有就企業(yè)內(nèi)部設(shè)備運(yùn)維管理工作形成一套科學(xué)嚴(yán)謹(jǐn)?shù)囊?guī)章制度,這使得實(shí)際工作開展較雜亂,后期追責(zé)困難,無法提升企業(yè)內(nèi)部設(shè)備運(yùn)維管理工作效率[5]。1.4本文的結(jié)構(gòu)框架本文首先對(duì)物聯(lián)網(wǎng)的設(shè)備運(yùn)維現(xiàn)狀進(jìn)行了分析,對(duì)物聯(lián)網(wǎng)的設(shè)備運(yùn)維系統(tǒng)做了需求分析,在此基礎(chǔ)上完成了基于物聯(lián)網(wǎng)的設(shè)備運(yùn)維系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)。本文總共5章,具體的組織架構(gòu)如下所示:第一章:緒論。本章介紹了本課題的研究背景,明確了研究目的,描述了國內(nèi)外研究現(xiàn)狀,確定了本文的結(jié)構(gòu)框架。第二章:相關(guān)技術(shù)概論。本章介紹了系統(tǒng)使用的大部分技術(shù),如Vue、SpringBoot、MySQL、Modbus等。第三章:系統(tǒng)分析。本章對(duì)系統(tǒng)開發(fā)的可行性進(jìn)行了分析,并深入探討了系統(tǒng)各功能模塊的具體需求,以確保系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)能夠精準(zhǔn)滿足實(shí)際需求。第四章:系統(tǒng)實(shí)現(xiàn)與測試。本章首先詳細(xì)闡述了系統(tǒng)各功能模塊的代碼實(shí)現(xiàn)細(xì)節(jié),隨后進(jìn)行了全方位的功能測試,以確保其正常運(yùn)行和達(dá)到預(yù)期效果。第五章:總結(jié)與展望。本章總結(jié)了本課題的研究過程,分析了本系統(tǒng)的不足,并對(duì)系統(tǒng)的改進(jìn)做了一定的展望。1.5本章小結(jié)本章首先介紹了本系統(tǒng)的研究背景,接著闡述了研究意義,然后闡述了國內(nèi)外的研究現(xiàn)狀,總結(jié)出了目前設(shè)備管理的優(yōu)缺點(diǎn),最后介紹本文的框架及大概內(nèi)容。
第2章相關(guān)技術(shù)2.1框架介紹1、Vue簡介Vue.js是一款前端JavaScript框架,能幫助開發(fā)者快速關(guān)鍵交互的應(yīng)用程序,且其是輕量級(jí)易學(xué)易用的框架,并且提供了許多高質(zhì)量的插件和庫,方便開發(fā)人員的開發(fā)REF_Ref12895\r\h[6]。Vue.js的核心庫專注于視圖層,使其易于與其他庫或現(xiàn)有項(xiàng)目集成。2、SpringBoot簡介SpringBoot是由Pivotal團(tuán)隊(duì)提供的全新框架,旨在簡化新Spring應(yīng)用的初始搭建以及開發(fā)過程。這個(gè)框架使用了特定的方式來進(jìn)行配置,使開發(fā)人員不再需要定義樣板化的配置。SpringBoot致力于成為快速應(yīng)用開發(fā)領(lǐng)域的領(lǐng)導(dǎo)者。3、SpringCloud簡介SpringCloud是用于創(chuàng)建分布式系統(tǒng)的開發(fā)框架,它建立在SpringBoot的基礎(chǔ)上,提供了一組工具和組件,以簡化分布式系統(tǒng)中的開發(fā)、部署和管理流程。它可以整合成熟的服務(wù)框架,為開發(fā)者提供一個(gè)便捷、易于部署和維護(hù)的分布式系統(tǒng)開發(fā)解決方案。4、MyBatis簡介MyBatis作為一款卓越的持久層框架,其特色在于支持自定義SQL、存儲(chǔ)過程以及高級(jí)映射功能。通過MyBatis,開發(fā)者可以極大地減少JDBC代碼的編寫,并避免手動(dòng)設(shè)置參數(shù)及獲取結(jié)果集的繁瑣操作。5、若依框架簡介若依(Ruoyi)框架是一款基于SpringBoot2.5.5、SpringCloud2020.0、OAuth2與JWT鑒權(quán)等核心技術(shù),同時(shí)也支持SpringSecurity、ApacheShiro等多種安全框架,以及Mybatis、JPA等流行持久化框架,提供了許多常用的功能模塊,包括系統(tǒng)管理、監(jiān)控管理、任務(wù)調(diào)度、代碼生成、文件上傳、高德地圖等功能的快速開發(fā)平臺(tái)REF_Ref19562\r\h[7]。 2.2MySQL數(shù)據(jù)庫簡介MySQL是當(dāng)下最好且最流行的關(guān)系數(shù)據(jù)庫管理系統(tǒng)之一REF_Ref10955\r\h[8],尤其在WEB應(yīng)用方面,MySQL是最好的RDBMS(RelationalDatabaseManagementSystem,關(guān)系數(shù)據(jù)庫管理系統(tǒng))應(yīng)用軟件之一。2.3Modbus通信協(xié)議簡介MODBUS通信協(xié)議是由美國MODICON公司推出的基于RS485總線的通訊協(xié)議REF_Ref6184\r\h[9]。該協(xié)議專為可編程邏輯控制器(PLC)間通信而設(shè)計(jì),并在工業(yè)領(lǐng)域確立了其作為通信協(xié)議的地位。它廣泛應(yīng)用于各種工業(yè)電子設(shè)備之間的連接,形成高效、穩(wěn)定的通信網(wǎng)絡(luò)。在Modbus協(xié)議中,主從結(jié)構(gòu)是核心機(jī)制,即主設(shè)備負(fù)責(zé)發(fā)起請(qǐng)求,而從設(shè)備則負(fù)責(zé)接收、分析并響應(yīng)這些請(qǐng)求。若通信過程中出現(xiàn)問題,從設(shè)備會(huì)通過返回異常功能碼的方式,及時(shí)通知主設(shè)備。這種設(shè)計(jì)不僅確保了通信的可靠性,也降低了通信過程中的錯(cuò)誤率。2.4MQTT協(xié)議簡介MQTT協(xié)議是ISO標(biāo)準(zhǔn)(ISO/IECPRF20922)下基于主題進(jìn)行訂閱和發(fā)布,為硬件性能低下的遠(yuǎn)程設(shè)備以及相對(duì)糟糕的網(wǎng)絡(luò)環(huán)境而設(shè)計(jì)的消息協(xié)議REF_Ref23441\r\h[10]。該協(xié)議使用LastWill和Testament特性通知有關(guān)客戶端異常中斷,具有提供一對(duì)多消息發(fā)布,解除應(yīng)用程序耦合,TCP/IP提供網(wǎng)絡(luò)連接,對(duì)負(fù)載內(nèi)容屏蔽消息傳輸?shù)忍匦訰EF_Ref23676\r\h[11]。其主題是應(yīng)用信息上的附加標(biāo)簽,需要發(fā)揮其作用構(gòu)建發(fā)布和訂閱信息主體間的信息傳輸路徑REF_Ref25910\r\h[12]。2.5ZigBee技術(shù)Zigbee技術(shù)是一種低功耗的個(gè)域網(wǎng)協(xié)議,它是基于標(biāo)準(zhǔn)的遠(yuǎn)程監(jiān)控、控制和傳感器網(wǎng)絡(luò)技術(shù),其具有鮮明的優(yōu)點(diǎn),如技術(shù)難度低、功耗低、時(shí)延短、安全性高及成本低等優(yōu)點(diǎn),一般將Zigbee芯片及外圍電路稱為Zigbee模塊REF_Ref27438\r\h[14]。ZigBee技術(shù)的通信范圍小和傳輸速率低的特點(diǎn)決定了其適應(yīng)低復(fù)雜數(shù)據(jù)傳輸?shù)男阅芴攸c(diǎn)REF_Ref27935\r\h[15]。2.6本章小結(jié)本章詳細(xì)介紹了系統(tǒng)開發(fā)中用到的關(guān)鍵技術(shù)、結(jié)構(gòu)技術(shù)的發(fā)展,為系統(tǒng)的開發(fā)提供了充分的理論知識(shí)。
第3章系統(tǒng)分析在本系統(tǒng)開發(fā)前,已經(jīng)對(duì)基于物聯(lián)網(wǎng)的設(shè)備運(yùn)維進(jìn)行了一些需求調(diào)研、系統(tǒng)分析以及相關(guān)技術(shù)的選型,為后續(xù)系統(tǒng)的開發(fā)提供了支持。3.1需求分析3.1.1功能性需求本系統(tǒng)是一個(gè)基于PC端的WEB系統(tǒng),用戶類型主要?jiǎng)澐譃閮深悾汗芾韱T、用戶。系統(tǒng)的功能需求包括物聯(lián)網(wǎng)設(shè)備運(yùn)維系統(tǒng)的搭建,對(duì)設(shè)備的管理,對(duì)設(shè)備的狀態(tài)進(jìn)行監(jiān)測。物聯(lián)網(wǎng)設(shè)備運(yùn)維系統(tǒng)的搭建物聯(lián)網(wǎng)設(shè)備運(yùn)維系統(tǒng)的搭建主要包括對(duì)用戶設(shè)備的查看、添加、修改信息以及刪除設(shè)備,查看設(shè)備告警,對(duì)設(shè)備分組的查看、添加、修改信息以及刪除設(shè)備分類,查看系統(tǒng)的公告。管理員除此之外還能處理設(shè)備告警、刪除設(shè)備告警,發(fā)布公告以及更改公告。設(shè)備管理設(shè)備管理主要是對(duì)設(shè)備的信息進(jìn)行更新和刪除,也可以新增設(shè)備并把它們更新到數(shù)據(jù)庫中,并且可以對(duì)設(shè)備的狀態(tài)進(jìn)行監(jiān)測。設(shè)備監(jiān)測設(shè)備監(jiān)測主要是對(duì)設(shè)備的狀態(tài)進(jìn)行監(jiān)測并生成設(shè)備日志,并且可以在地圖上查看設(shè)備的位置。系統(tǒng)的用例圖如圖3-1所示。圖3-1系統(tǒng)用例圖3.2.2非功能性需求(1)響應(yīng)時(shí)間需求:系統(tǒng)應(yīng)具備快速的響應(yīng)時(shí)間,確保用戶在進(jìn)行設(shè)備監(jiān)控、故障診斷、任務(wù)調(diào)度等操作時(shí)能夠獲得及時(shí)的反饋。(2)系統(tǒng)穩(wěn)定性需求:系統(tǒng)應(yīng)具備高穩(wěn)定性,能夠長時(shí)間連續(xù)運(yùn)行而不出現(xiàn)故障或性能下降的情況。對(duì)于可能出現(xiàn)的異常情況,系統(tǒng)應(yīng)具備自動(dòng)恢復(fù)和容錯(cuò)機(jī)制,確保服務(wù)的持續(xù)性。(3)可維護(hù)性需求:系統(tǒng)應(yīng)詳細(xì)記錄操作日志和審計(jì)信息,包括用戶登錄、設(shè)備接入、數(shù)據(jù)傳輸?shù)汝P(guān)鍵操作。這些信息對(duì)于故障排查、安全審計(jì)和性能優(yōu)化具有重要意義。(4)安全性需求:系統(tǒng)應(yīng)具備完善的訪問控制和權(quán)限管理機(jī)制,對(duì)不同用戶設(shè)置不同的訪問權(quán)限和操作限制。通過身份驗(yàn)證和授權(quán)機(jī)制確保只有合法用戶才能訪問系統(tǒng)資源和執(zhí)行敏感操作。(5)可擴(kuò)展性需求:隨著物聯(lián)網(wǎng)設(shè)備數(shù)量的日益增多,系統(tǒng)產(chǎn)生的數(shù)據(jù)量也在持續(xù)攀升。因此,系統(tǒng)應(yīng)具備可擴(kuò)展的數(shù)據(jù)存儲(chǔ)能力,支持海量數(shù)據(jù)的存儲(chǔ)和高效檢索。3.2系統(tǒng)總體設(shè)計(jì)3.2.1系統(tǒng)架構(gòu)本系統(tǒng)采用的是前后端分離架構(gòu),前端使用了Vue+Elementui進(jìn)行搭建,而后端則采用SpringBoot+Mybatis與數(shù)據(jù)庫進(jìn)行交互。后端采用的Controller層、Service層、Dao層、domain層進(jìn)行邏輯處理?;谖锫?lián)網(wǎng)的設(shè)備運(yùn)維系統(tǒng)的系統(tǒng)架構(gòu)圖如圖3-2所示。圖3-2系統(tǒng)架構(gòu)圖(1)感知層感知層主要由傳感器和觸發(fā)器構(gòu)成,負(fù)責(zé)收集現(xiàn)場數(shù)據(jù)和執(zhí)行控制命令。(2)網(wǎng)絡(luò)層網(wǎng)絡(luò)層負(fù)責(zé)網(wǎng)絡(luò)連接及設(shè)備間的數(shù)據(jù)傳輸與通信。(3)展示層展示層主要采用了Vue.js框架,這是一個(gè)用于構(gòu)建用戶界面的JavaScript框架,使得用戶能夠更加直觀地操作系統(tǒng)。(4)業(yè)務(wù)層業(yè)務(wù)層包含了各種管理模塊,如設(shè)備管理、日志管理、用戶管理等,這些模塊負(fù)責(zé)共同處理系統(tǒng)的業(yè)務(wù)邏輯。(5)數(shù)據(jù)層數(shù)據(jù)層,Mybatis提供了數(shù)據(jù)訪問服務(wù),它可以定制SQL、映射關(guān)系以及存儲(chǔ)過程,是的數(shù)據(jù)庫更加靈活高效。(6)持久層在持久層,運(yùn)用了MySQL數(shù)據(jù)庫,用于存儲(chǔ)系統(tǒng)的結(jié)構(gòu)化數(shù)據(jù)。而Redis則提供了一種非關(guān)系型的數(shù)據(jù)存儲(chǔ)方式,以及作為系統(tǒng)的緩存服務(wù)。(7)運(yùn)行環(huán)境運(yùn)行環(huán)境本系統(tǒng)基于java8的環(huán)境運(yùn)行。其中設(shè)備管理作為本系統(tǒng)的核心功能之一,起到了對(duì)設(shè)備的管理、監(jiān)控、預(yù)警等功能。首先利用物聯(lián)網(wǎng)技術(shù)采集到設(shè)備的運(yùn)行狀態(tài)、收集到的信息參數(shù),對(duì)這些數(shù)據(jù)進(jìn)行處理,設(shè)置閾值從而集市發(fā)現(xiàn)異常情況。根據(jù)預(yù)警信息,用戶便能及時(shí)維護(hù)設(shè)備。物聯(lián)網(wǎng)產(chǎn)業(yè)由應(yīng)用、云端、網(wǎng)絡(luò)、邊緣、終端五個(gè)部分組成。應(yīng)用為AIoT產(chǎn)業(yè)應(yīng)用行業(yè)。云端指物聯(lián)網(wǎng)相關(guān)的云化能力平臺(tái),主要由云端物聯(lián)網(wǎng)平臺(tái)承載相關(guān)云服務(wù)包括連接、管理、數(shù)據(jù)、AI、安全、區(qū)塊鏈等等。網(wǎng)絡(luò)則是連接網(wǎng)絡(luò)及相關(guān)產(chǎn)品和服務(wù)。邊緣泛指中心節(jié)點(diǎn)之外的位置。邊緣計(jì)算指的是將計(jì)算及相關(guān)能力從中心處理節(jié)點(diǎn)下放至邊緣節(jié)點(diǎn)后形成的,靠近終端的計(jì)算能力。終端則是物聯(lián)網(wǎng)終端,包括底層的芯片、模組、存儲(chǔ)設(shè)備、感知設(shè)備、AI芯片、操作系統(tǒng)等。物聯(lián)網(wǎng)的技術(shù)架構(gòu)圖如圖3-2所示。圖3-2技術(shù)架構(gòu)圖本系統(tǒng)的設(shè)備接入分為感知層和接入層兩個(gè)部分,在感知層包括Modbus設(shè)備和直連設(shè)備,負(fù)責(zé)數(shù)據(jù)采集。通過MQTT協(xié)議傳輸?shù)浇尤雽拥脑凭W(wǎng)關(guān)。而網(wǎng)關(guān)支持TCP、HTTP等多種協(xié)議,將數(shù)據(jù)轉(zhuǎn)發(fā)給用戶?;谖锫?lián)網(wǎng)的設(shè)備運(yùn)維系統(tǒng)的設(shè)備接入圖如圖3-4。圖3-4設(shè)備接入圖3.2.2系統(tǒng)功能模塊劃分本系統(tǒng)主要分為設(shè)備管理和系統(tǒng)管理兩個(gè)模塊,其中設(shè)備管理中包含設(shè)備管理、設(shè)備分組、設(shè)備告警三個(gè)子模塊,可以對(duì)設(shè)備進(jìn)行管理和監(jiān)測;而系統(tǒng)管理模塊包括了用戶管理、日志管理和公告通知管理三個(gè)子模塊。系統(tǒng)的功能模塊圖如圖3-5所示。圖3-5系統(tǒng)功能模塊圖3.2.3數(shù)據(jù)庫設(shè)計(jì)本系統(tǒng)采用的是MySQL數(shù)據(jù)庫和InfluxDB數(shù)據(jù)庫。當(dāng)接受到物聯(lián)設(shè)備采集的信息,如溫度、壓力、震感等,這些原始數(shù)據(jù)通常包含異常值、冗余信息等。這些信息首先會(huì)儲(chǔ)存在時(shí)序數(shù)據(jù)庫InfluxDB中,能夠高效地存儲(chǔ)和查詢大量、高頻率的數(shù)據(jù)。在被長期保存之前,需要對(duì)數(shù)據(jù)進(jìn)行清洗,以消去異常值和重復(fù)數(shù)據(jù)。經(jīng)過了數(shù)據(jù)清洗,最后在MySQL進(jìn)行長期儲(chǔ)存。主要儲(chǔ)存的信息有用戶信息、設(shè)備信息、日志信息、通知公告信息等。首先,通過E-R圖表示出實(shí)體及其之間的關(guān)系,為數(shù)據(jù)庫設(shè)計(jì)提供了基礎(chǔ)。根據(jù)本系統(tǒng)的數(shù)據(jù)模型和數(shù)據(jù)庫設(shè)計(jì)原則,確定了基本的數(shù)據(jù)庫結(jié)構(gòu),包括數(shù)據(jù)表、字段列表等。對(duì)于時(shí)序數(shù)據(jù),由于其具有時(shí)間戳唯一性、數(shù)據(jù)連續(xù)性、數(shù)據(jù)量大、高頻率更新等特點(diǎn),對(duì)其進(jìn)行查詢優(yōu)化,將其儲(chǔ)存在InfluxDB數(shù)據(jù)庫中。在設(shè)計(jì)數(shù)據(jù)庫表時(shí),選擇了合適的字段,并考慮了表的靈活性,以便用戶可以更便捷高效地進(jìn)行查詢。本系統(tǒng)的E-R圖如圖3-6所示。圖3-6系統(tǒng)E-R圖在數(shù)據(jù)庫設(shè)計(jì)中,每一張表都分配了一個(gè)主鍵,它是確保數(shù)據(jù)庫設(shè)計(jì)的完整性和提高數(shù)據(jù)庫的查詢效率的關(guān)鍵因素。結(jié)合以上提供的E-R圖,從而設(shè)計(jì)出了如下數(shù)據(jù)庫表。(1)用戶信息表表3-1用戶信息表sys_user字段名稱數(shù)據(jù)類型長度是否為空字段含義user_idbigint20否用戶IDdept_idbigint20是部門IDuser_namevarchar30否用戶賬號(hào)nick_namevarchar30否用戶昵稱user_typevarchar2是用戶類別表3-1(續(xù))用戶信息表sys_useremailvarchar50是用戶郵箱phonenumbervarchar11是用戶電話sexchar1是用戶性別avatarvarchar100是頭像地址passwordvarchar100是密碼create_byvarchar64是創(chuàng)建者create_timedatetime0是創(chuàng)建時(shí)間update_byvarchar64是更新者update_timedatetime0是更新時(shí)間(2)設(shè)備信息表表3-2設(shè)備信息表iot_device字段名稱數(shù)據(jù)類型長度是否為空字段含義device_idbigint20否設(shè)備IDdevice_namevarchar64否設(shè)備名稱product_idbigint20否產(chǎn)品IDproduct_namevarchar64否產(chǎn)品名稱user_idbigint20否用戶IDuser_namevarchar30否用戶昵稱serial_numbervarchar64否設(shè)備編號(hào)statustinyint1否設(shè)備狀態(tài)network_addressvarchar255是設(shè)備所在地址network_ipvarchar32是設(shè)備入網(wǎng)IPcreate_byvarchar64是創(chuàng)建者create_timedatetime0是創(chuàng)建時(shí)間update_byvarchar64是更新者update_timedatetime0是更新時(shí)間設(shè)備告警表表3-3設(shè)備告警表iot_alert字段名稱數(shù)據(jù)類型長度是否為空字段含義alert_idbigint20否告警IDalert_namevarchar64否告警名稱alert_leveltinyint11否告警級(jí)別product_idbigint20否產(chǎn)品IDproduct_namevarchar64否產(chǎn)品名稱statustinyint1是告警狀態(tài)create_byvarchar64是創(chuàng)建者create_timedatetime0是創(chuàng)建時(shí)間update_byvarchar64是更新者表3-3(續(xù))設(shè)備告警表iot_alertupdate_timedatetime0是更新時(shí)間產(chǎn)品信息表表3-4產(chǎn)品信息表iot_product字段名稱數(shù)據(jù)類型長度是否為空字段含義product_idbigint20否產(chǎn)品IDproduct_namevarchar64否產(chǎn)品名稱device_typetinyint1是設(shè)備類型statustinyint1是狀態(tài)category_idbigint20否產(chǎn)品分類IDcategory_namevarchar64否產(chǎn)品分類名稱create_byvarchar64是創(chuàng)建者create_timedatetime0是創(chuàng)建時(shí)間update_byvarchar64是更新者update_timedatetime0是更新時(shí)間通知公告表表3-5通知公告表sys_notice字段名稱數(shù)據(jù)類型長度是否為空字段含義notice_idint4否公告IDnotice_titlevarchar50否公告名稱notice_typechar1否公告類型notice_contentlongblob0是公告內(nèi)容statuschar1是公告狀態(tài)create_byvarchar64是創(chuàng)建者create_timedatetime0是創(chuàng)建時(shí)間update_byvarchar64是更新者update_timedatetime0是更新時(shí)間設(shè)備告警日志表表3-6設(shè)備告警日志表iot_alert_log字段名稱數(shù)據(jù)類型長度是否為空字段含義alert_log_idbigint20否告警IDalert_namevarchar64否告警名稱alert_leveltinyint11否告警級(jí)別statustinyint11否處理狀態(tài)device_idbigint20是設(shè)備IDtenant_idbigint20否租戶IDtenant_namevarchar30否租戶名稱device_namevarchar64是設(shè)備名稱表3-5(續(xù))設(shè)備告警日志表iot_alert_logcreate_byvarchar64是創(chuàng)建者create_timedatetime0是創(chuàng)建時(shí)間update_byvarchar64是更新者update_timedatetime0是更新時(shí)間3.3系統(tǒng)模塊設(shè)計(jì)3.3.1設(shè)備管理模塊設(shè)計(jì)本小節(jié)主要論述設(shè)備管理模塊的設(shè)計(jì)。本模塊主要功能有對(duì)設(shè)備及其分組的管理、對(duì)設(shè)備的監(jiān)測、對(duì)設(shè)備的告警等功能。該模塊的實(shí)現(xiàn)首先是由DeviceController和ProductController接受前端的請(qǐng)求,然后調(diào)用Service層的相關(guān)處理方法。DeviceServiceImpl和ProductServiceImpl是接口的是具體實(shí)現(xiàn)類,負(fù)責(zé)了相關(guān)功能的邏輯實(shí)現(xiàn)。DeviceServiceImpl負(fù)責(zé)設(shè)備的管理功能,ProductServiceImpl負(fù)責(zé)產(chǎn)品的管理功能。首先對(duì)需要物聯(lián)監(jiān)測的設(shè)備進(jìn)行物模型的定義,在ThingsModelController中編寫了相應(yīng)接口接受前端的請(qǐng)求,然后調(diào)用ThingsModelService來實(shí)現(xiàn)對(duì)物模型的相關(guān)處理。比如需要監(jiān)測設(shè)備的溫度屬性,需要監(jiān)測設(shè)備的溫度變化,便調(diào)用接口實(shí)現(xiàn)對(duì)溫度屬性的定義。其次是對(duì)設(shè)備的監(jiān)測,首先定義了物模型和設(shè)備對(duì)象,物模型能夠清晰的描述設(shè)備的功能和特性,包括了可以執(zhí)行的操作、可以提供的數(shù)據(jù)等。通過物模型,不同的設(shè)備能力都可以進(jìn)行統(tǒng)一的管理,這有利于設(shè)備之間的相互交互,為設(shè)備運(yùn)維管理和控制提供便利。然后利用傳感器實(shí)時(shí)采集數(shù)據(jù),如溫度、濕度、壓力等,接著對(duì)采集到的數(shù)據(jù)從其他工業(yè)協(xié)議統(tǒng)一轉(zhuǎn)化為modbus協(xié)議儲(chǔ)存在數(shù)據(jù)庫中。根據(jù)定義的物模型,如溫度、震感、濕度等,用戶可以設(shè)定這些監(jiān)測指標(biāo)的預(yù)警閾值,將處理好的數(shù)據(jù)與閾值進(jìn)行對(duì)比,并設(shè)計(jì)多級(jí)預(yù)警,如警告、嚴(yán)重警告等。當(dāng)監(jiān)測指標(biāo)達(dá)到閾值以上,便會(huì)觸發(fā)預(yù)警機(jī)制,然后生成預(yù)警信息,包括設(shè)備信息、預(yù)警信息、預(yù)警時(shí)間等。根據(jù)預(yù)警信息和設(shè)備狀態(tài),用戶可以采取相應(yīng)的處理辦法。當(dāng)數(shù)值恢復(fù)到閾值以下,系統(tǒng)便會(huì)發(fā)出告警恢復(fù)的信息,包括設(shè)備信息、恢復(fù)信息、恢復(fù)時(shí)間等。設(shè)備管理流程圖如圖3-7所示。圖3-7設(shè)備管理流程圖3.4本章小結(jié)本章對(duì)系統(tǒng)的需求進(jìn)行了分析,然后對(duì)系統(tǒng)的架構(gòu)及模塊功能進(jìn)行了詳細(xì)的設(shè)計(jì),為系統(tǒng)的開發(fā)提供了保障。第4章系統(tǒng)實(shí)現(xiàn)與測試4.1開發(fā)環(huán)境基于物聯(lián)網(wǎng)的設(shè)備運(yùn)維系統(tǒng)的開發(fā)環(huán)境包括開發(fā)語言、數(shù)據(jù)庫等。表4-1系統(tǒng)開發(fā)環(huán)境工具名稱版本操作系統(tǒng)Windows11開發(fā)語言C++17JavaJDK1.8開發(fā)集成環(huán)境idea2022.2.1關(guān)系型數(shù)據(jù)庫Mysql8.0.12時(shí)序數(shù)據(jù)庫InfluxDB2.04.2系統(tǒng)實(shí)現(xiàn)4.3.1設(shè)備數(shù)據(jù)采集的實(shí)現(xiàn)設(shè)備數(shù)據(jù)采集實(shí)現(xiàn)了對(duì)設(shè)備監(jiān)測數(shù)據(jù)的采集與存儲(chǔ)。首先利用傳感器讀取需要監(jiān)測的數(shù)據(jù),將讀取到的原始數(shù)據(jù)轉(zhuǎn)換為MQTT協(xié)議可以發(fā)送的格式,然后將轉(zhuǎn)化后的數(shù)據(jù)發(fā)送至MQTTBroker,接收到消息后儲(chǔ)存到InfluxDB。MqttService部分核心代碼如表4-2所示,此段代碼實(shí)現(xiàn)了對(duì)設(shè)備信息的上報(bào)。表4-2MqttService類部分代碼表privatevoidreportDevice(LongproductId,StringdeviceNum,Stringmessage){try{//設(shè)備實(shí)體DevicedeviceEntity=deviceService.selectDeviceBySerialNumber(deviceNum);//上報(bào)設(shè)備信息Devicedevice=JSON.parseObject(message,Device.class);device.setProductId(productId);device.setSerialNumber(deviceNum);deviceService.reportDevice(device,deviceEntity);//發(fā)布設(shè)備狀態(tài)publishStatus(productId,deviceNum,3,deviceEntity.getIsShadow(),device.getRssi());}catch(Exceptione){logger.error("接收設(shè)備信息,解析數(shù)據(jù)時(shí)異常message={}",e.getMessage());}}/***上報(bào)屬性**@parammessage*/privatevoidreportProperty(LongproductId,StringdeviceNum,Stringmessage,booleanisShadow){try{List<ThingsModelValueRemarkItem>thingsModelValueRemarkItems=JSON.parseArray(message,ThingsModelValueRemarkItem.class);ThingsModelValuesInputinput=newThingsModelValuesInput();input.setProductId(productId);input.setDeviceNumber(deviceNum);input.setThingsModelValueRemarkItem(thingsModelValueRemarkItems);deviceService.reportDeviceThingsModelValue(input,1,isShadow);}catch(Exceptione){logger.error("接收屬性數(shù)據(jù),解析數(shù)據(jù)時(shí)異常message={}",e.getMessage());}}/***上報(bào)功能**@parammessage*/privatevoidreportFunction(LongproductId,StringdeviceNum,Stringmessage,booleanisShadow){try{List<ThingsModelValueRemarkItem>thingsModelValueRemarkItems=JSON.parseArray(message,ThingsModelValueRemarkItem.class);ThingsModelValuesInputinput=newThingsModelValuesInput();input.setProductId(productId);input.setDeviceNumber(deviceNum);input.setThingsModelValueRemarkItem(thingsModelValueRemarkItems);deviceService.reportDeviceThingsModelValue(input,2,isShadow);}catch(Exceptione){logger.error("接收功能,解析數(shù)據(jù)時(shí)異常message={}",e.getMessage());}}/***上報(bào)事件**@parammessage*/privatevoidreportEvent(LongproductId,StringdeviceNum,Stringmessage){try{List<ThingsModelValueRemarkItem>thingsModelValueRemarkItems=JSON.parseArray(message,ThingsModelValueRemarkItem.class);Devicedevice=deviceService.selectDeviceBySerialNumber(deviceNum);for(inti=0;i<thingsModelValueRemarkItems.size();i++){//添加到設(shè)備日志DeviceLogdeviceLog=newDeviceLog();deviceLog.setDeviceId(device.getDeviceId());deviceLog.setDeviceName(device.getDeviceName());deviceLog.setLogValue(thingsModelValueRemarkItems.get(i).getValue());deviceLog.setRemark(thingsModelValueRemarkItems.get(i).getRemark());deviceLog.setSerialNumber(device.getSerialNumber());deviceLog.setIdentity(thingsModelValueRemarkItems.get(i).getId());deviceLog.setLogType(3);deviceLog.setIsMonitor(0);deviceLog.setUserId(device.getUserId());deviceLog.setUserName(device.getUserName());deviceLog.setTenantId(device.getTenantId());deviceLog.setTenantName(device.getTenantName());deviceLog.setCreateTime(DateUtils.getNowDate());//1=影子模式,2=在線模式,3=其他deviceLog.setMode(2);logService.saveDeviceLog(deviceLog);}}catch(Exceptione){logger.error("接收事件,解析數(shù)據(jù)時(shí)異常message={}",e.getMessage());}}4.2.2設(shè)備管理模塊的實(shí)現(xiàn)設(shè)備管理子模塊負(fù)責(zé)設(shè)備的搜索、添加、刪除和修改等功能的實(shí)現(xiàn)。DeviceController中定義了設(shè)備相關(guān)的接口,然后將請(qǐng)求的參數(shù)傳到DeviceServiceImpl中進(jìn)行進(jìn)一步的處理。DeviceController的部分核心代碼如表4-3所示,此段代碼實(shí)現(xiàn)了對(duì)設(shè)備的新增、修改和刪除功能。通過調(diào)用IDeviceServiceImpl中的方法,對(duì)設(shè)備進(jìn)行各種操作,然后通過AjaxResult返回給前端。表4-3DeviceController類部分代碼表publicclassDeviceControllerextendsBaseController{@AutowiredprivateIDeviceServicedeviceService;/***新增設(shè)備*/@PreAuthorize("@ss.hasPermi('iot:device:add')")@Log(title="添加設(shè)備",businessType=BusinessType.INSERT)@PostMapping@ApiOperation("添加設(shè)備")publicAjaxResultadd(@RequestBodyDevicedevice){returnAjaxResult.success(deviceService.insertDevice(device));}/***修改設(shè)備*/@PreAuthorize("@ss.hasPermi('iot:device:edit')")@Log(title="修改設(shè)備",businessType=BusinessType.UPDATE)@PutMapping@ApiOperation("修改設(shè)備")publicAjaxResultedit(@RequestBodyDevicedevice){returndeviceService.updateDevice(device);}/***刪除設(shè)備*/@PreAuthorize("@ss.hasPermi('iot:device:remove')")@Log(title="刪除設(shè)備",businessType=BusinessType.DELETE)@DeleteMapping("/{deviceIds}")@ApiOperation("批量刪除設(shè)備")publicAjaxResultremove(@PathVariableLong[]deviceIds)throwsSchedulerException{returntoAjax(deviceService.deleteDeviceByDeviceId(deviceIds[0]));}/***生成設(shè)備編號(hào)*/@PreAuthorize("@ss.hasPermi('iot:device:edit')")@GetMapping("/generator")@ApiOperation("生成設(shè)備編號(hào)")publicAjaxResultgeneratorDeviceNum(){returnAjaxResult.success("操作成功",deviceService.generationDeviceNum());}}設(shè)備管理模塊功能圖如圖4-1所示,用戶可以添加設(shè)備、刪除設(shè)備,查看設(shè)備的情況并可以對(duì)設(shè)備信息進(jìn)行修改,例如名稱、編號(hào)、產(chǎn)品等,還能獲取其地址并在地圖上顯示。圖4-1設(shè)備管理模塊功能圖4.3.3設(shè)備分組模塊的實(shí)現(xiàn)設(shè)備分組子模塊實(shí)現(xiàn)了對(duì)設(shè)備分組的新增、修改和刪除,以及對(duì)設(shè)備的關(guān)聯(lián)。本模塊在GroupController中定義了設(shè)備分組的相關(guān)接口,然后在GroupServiceImpl中進(jìn)行邏輯處理。設(shè)備分組的部分核心代碼如表4-4所示,該段代碼實(shí)現(xiàn)了對(duì)設(shè)備分組的新增、修改和刪除,以及對(duì)設(shè)備的關(guān)聯(lián)操作。其中對(duì)設(shè)備進(jìn)行關(guān)聯(lián),通過設(shè)備分組對(duì)象DeviceGroupInput作為數(shù)據(jù)容器,傳遞分組ID以及設(shè)備ID以進(jìn)行關(guān)聯(lián)。表4-4GroupController類部分代碼表publicclassGroupControllerextendsBaseController{@AutowiredprivateIGroupServicegroupService;/***獲取設(shè)備分組詳細(xì)信息*/@PreAuthorize("@ss.hasPermi('iot:group:query')")@GetMapping(value="/{groupId}")@ApiOperation("獲取分組詳情")publicAjaxResultgetInfo(@PathVariable("groupId")LonggroupId){returnAjaxResult.success(groupService.selectGroupByGroupId(groupId));}/***獲取設(shè)備分組詳細(xì)信息*/@PreAuthorize("@ss.hasPermi('iot:group:query')")@GetMapping(value="/{groupId}")@ApiOperation("獲取分組詳情")publicAjaxResultgetInfo(@PathVariable("groupId")LonggroupId){returnAjaxResult.success(groupService.selectGroupByGroupId(groupId));}/***獲取分組下的所有關(guān)聯(lián)設(shè)備ID數(shù)組*/@PreAuthorize("@ss.hasPermi('iot:group:query')")@GetMapping(value="/getDeviceIds/{groupId}")@ApiOperation("獲取分組下的所有關(guān)聯(lián)設(shè)備ID數(shù)組")publicAjaxResultgetDeviceIds(@PathVariable("groupId")LonggroupId){returnAjaxResult.success(groupService.selectDeviceIdsByGroupId(groupId));}/***更新分組下的關(guān)聯(lián)設(shè)備*@paraminput*@return*/@PreAuthorize("@ss.hasPermi('iot:group:edit')")@Log(title="設(shè)備分組",businessType=BusinessType.UPDATE)@PutMapping("/updateDeviceGroups")@ApiOperation("更新分組下的關(guān)聯(lián)設(shè)備")publicAjaxResultupdateDeviceGroups(@RequestBodyDeviceGroupInputinput){returntoAjax(groupService.updateDeviceGroups(input));}設(shè)備分組模塊功能圖如圖4-2所示,用戶可以對(duì)分組進(jìn)行新增、修改、刪除和查看,查看本分組下有哪些設(shè)備,還可以在產(chǎn)品分類下選擇已有的設(shè)備添加。圖4-2設(shè)備分組模塊功能圖4.3.4產(chǎn)品管理模塊的實(shí)現(xiàn)產(chǎn)品管理子模塊實(shí)現(xiàn)了對(duì)產(chǎn)品的查詢、查看、新增以及刪除,以及跳轉(zhuǎn)查看此產(chǎn)品下的設(shè)備。本模塊在ProductController中定義了產(chǎn)品管理的相關(guān)接口,然后在ProductServiceImpl中進(jìn)行邏輯處理。ProductController的部分核心代碼如表4-5所示,其實(shí)現(xiàn)了對(duì)產(chǎn)品信息的查詢、查看、新增以及刪除等功能。表4-5ProductController類部分代碼表publicclassProductControllerextendsBaseController{@AutowiredprivateIProductServiceproductService;/***查詢產(chǎn)品列表*/@GetMapping("/list")@ApiOperation("產(chǎn)品分頁列表")publicTableDataInfolist(Productproduct){startPage();returngetDataTable(productService.selectProductList(product));}/***獲取產(chǎn)品詳細(xì)信息*/@PreAuthorize("@ss.hasPermi('iot:product:query')")@GetMapping(value="/{productId}")@ApiOperation("獲取產(chǎn)品詳情")publicAjaxResultgetInfo(@PathVariable("productId")LongproductId){returnAjaxResult.success(productService.selectProductByProductId(productId));}/***新增產(chǎn)品*/@PreAuthorize("@ss.hasPermi('iot:product:add')")@Log(title="產(chǎn)品",businessType=BusinessType.INSERT)@PostMapping@ApiOperation("添加產(chǎn)品")publicAjaxResultadd(@RequestBodyProductproduct){returnAjaxResult.success(productService.insertProduct(product));}/***修改產(chǎn)品*/@PreAuthorize("@ss.hasPermi('iot:product:edit')")@Log(title="產(chǎn)品",businessType=BusinessType.UPDATE)@PutMapping@ApiOperation("修改產(chǎn)品")publicAjaxResultedit(@RequestBodyProductproduct){returntoAjax(productService.updateProduct(product));}/***發(fā)布產(chǎn)品*/@PreAuthorize("@ss.hasPermi('iot:product:edit')")@Log(title="更新產(chǎn)品狀態(tài)",businessType=BusinessType.UPDATE)@PutMapping("/status")@ApiOperation("更新產(chǎn)品狀態(tài)")publicAjaxResultchangeProductStatus(@RequestBodyChangeProductStatusModelmodel){returnproductService.changeProductStatus(model);}/***刪除產(chǎn)品*/@PreAuthorize("@ss.hasPermi('iot:product:remove')")@Log(title="產(chǎn)品",businessType=BusinessType.DELETE)@DeleteMapping("/{productIds}")@ApiOperation("批量刪除產(chǎn)品")publicAjaxResultremove(@PathVariableLong[]productIds){returnproductService.deleteProductByProductIds(productIds);}}產(chǎn)品管理模塊功能圖如圖4-3所示,用戶可以產(chǎn)品進(jìn)行新增、修改、刪除和查看,并可以查看本產(chǎn)品下有哪些設(shè)備。圖4-3產(chǎn)品管理模塊功能圖4.3.5產(chǎn)品分類模塊的實(shí)現(xiàn)產(chǎn)品分類子模塊實(shí)現(xiàn)了對(duì)產(chǎn)品分類的查詢、查看、新增、修改和刪除,及其顯示順序。本模塊在CategoryController中定義了產(chǎn)品分類的相關(guān)接口,然后在CategoryServiceImpl中進(jìn)行邏輯處理。如表4-6為設(shè)備分組的部分核心代碼,該段代碼實(shí)現(xiàn)了對(duì)設(shè)備分組的查詢、查看、新增、修改和刪除功能。表4-6CategoryController類部分代碼表publicclassCategoryControllerextendsBaseController{@AutowiredprivateICategoryServicecategoryService;/***獲取產(chǎn)品分類詳細(xì)信息*/@ApiOperation("獲取分類詳情")@PreAuthorize("@ss.hasPermi('iot:category:query')")@GetMapping(value="/{categoryId}")publicAjaxResultgetInfo(@PathVariable("categoryId")LongcategoryId){returnAjaxResult.success(categoryService.selectCategoryByCategoryId(categoryId));}/***新增產(chǎn)品分類*/@PreAuthorize("@ss.hasPermi('iot:category:add')")@Log(title="產(chǎn)品分類",businessType=BusinessType.INSERT)@PostMapping@ApiOperation("添加分類")publicAjaxResultadd(@RequestBodyCategorycategory){returntoAjax(categoryService.insertCategory(category));}/***修改產(chǎn)品分類*/@PreAuthorize("@ss.hasPermi('iot:category:edit')")@Log(title="產(chǎn)品分類",businessType=BusinessType.UPDATE)@PutMapping@ApiOperation("修改分類")publicAjaxResultedit(@RequestBodyCategorycategory){returntoAjax(categoryService.updateCategory(category));}/***刪除產(chǎn)品分類*/@PreAuthorize("@ss.hasPermi('iot:category:remove')")@Log(title="產(chǎn)品分類",businessType=BusinessType.DELETE)@DeleteMapping("/{categoryIds}")@ApiOperation("批量刪除分類")publicAjaxResultremove(@PathVariableLong[]categoryIds){returncategoryService.deleteCategoryByCategoryIds(categoryIds);}}產(chǎn)品分組模塊功能圖如圖4-4所示,用戶可以對(duì)產(chǎn)品分類進(jìn)行新增、修改、刪除和查看。圖4-4產(chǎn)品分組模塊功能圖4.3.6設(shè)備告警模塊的實(shí)現(xiàn)設(shè)備告警子模塊實(shí)現(xiàn)了對(duì)設(shè)備告警信息的獲取,以及對(duì)告警信息的查詢、查看、刪除。本模塊在AlertController中定義了部門管理的相關(guān)接口,然后在SysAleServiceImpl中進(jìn)行邏輯處理。AlertController的部分核心代碼如表4-7所示,其實(shí)現(xiàn)了對(duì)告警信息的查詢、查看、刪除等功能,其中獲取設(shè)備告警信息,是按照設(shè)備的ID在數(shù)據(jù)庫中進(jìn)行查詢后獲取到。表4-7AlertController類部分代碼表publicclassAlertControllerextendsBaseController{@AutowiredprivateIAlertServicealertService;/***獲取設(shè)備告警詳細(xì)信息*/@PreAuthorize("@ss.hasPermi('iot:alert:query')")@GetMapping(value="/{alertId}")publicAjaxResultgetInfo(@PathVariable("alertId")LongalertId){returnAjaxResult.success(alertService.selectAlertByAlertId(alertId));}/***新增設(shè)備告警*/@PreAuthorize("@ss.hasPermi('iot:alert:add')")@Log(title="設(shè)備告警",businessType=BusinessType.INSERT)@PostMappingpublicAjaxResultadd(@RequestBodyAlertalert){returntoAjax(alertService.insertAlert(alert));}/***刪除設(shè)備告警*/@PreAuthorize("@ss.hasPermi('iot:alert:remove')")@Log(title="設(shè)備告警",businessType=BusinessType.DELETE)@DeleteMapping("/{alertIds}")publicAjaxResultremove(@PathVariableLong[]alertIds){returntoAjax(alertService.deleteAlertByAlertIds(alertIds));}}設(shè)備告警模塊功能圖如圖4-5所示,用戶可以告警信息進(jìn)行查看、查找,并對(duì)告警信息進(jìn)行處理。圖4-5設(shè)備告警模塊功能圖4.3.7用戶管理模塊的實(shí)現(xiàn)用戶管理子模塊實(shí)現(xiàn)了對(duì)用戶信息的查詢、查看、新增、修改和刪除,以及對(duì)用戶信息的導(dǎo)出及導(dǎo)入,另外管理員還能對(duì)用戶進(jìn)行授權(quán)管理。本模塊在SysUserController中定義了部門管理的相關(guān)接口,然后在SysUserServiceImpl中進(jìn)行邏輯處理。SysUserController的部分核心代碼如表4-8所示,其實(shí)現(xiàn)了根據(jù)用戶編號(hào)對(duì)用戶信息的查詢、查看、新增、修改和刪除等功能。表4-8SysUsertController類部分代碼表publicclassSysUserControllerextendsBaseController{@AutowiredprivateISysUserServiceuserService;@AutowiredprivateISysRoleServiceroleService;@AutowiredprivateISysPostServicepostService;/***根據(jù)用戶編號(hào)獲取詳細(xì)信息*/@PreAuthorize("@ss.hasPermi('system:user:query')")@GetMapping(value={"/","/{userId}"})publicAjaxResultgetInfo(@PathVariable(value="userId",required=false)LonguserId){userService.checkUserDataScope(userId);AjaxResultajax=AjaxResult.success();List<SysRole>roles=roleService.selectRoleAll();ajax.put("roles",SysUser.isAdmin(userId)?roles:roles.stream().filter(r->!r.isAdmin()).collect(Collectors.toList()));ajax.put("posts",postService.selectPostAll());if(StringUtils.isNotNull(userId)){ajax.put(AjaxResult.DATA_TAG,userService.selectUserById(userId));ajax.put("postIds",postService.selectPostListByUserId(userId));ajax.put("roleIds",roleService.selectRoleListByUserId(userId));}returnajax;}/***新增用戶*/@PreAuthorize("@ss.hasPermi('system:user:add')")@Log(title="用戶管理",businessType=BusinessType.INSERT)@PostMappingpublicAjaxResultadd(@Validated@RequestBodySysUseruser){if(UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user.getUserName()))){returnAjaxResult.error("新增用戶'"+user.getUserName()+"'失敗,登錄賬號(hào)已存在");}elseif(StringUtils.isNotEmpty(user.getPhonenumber())&&UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))){returnAjaxResult.error("新增用戶'"+user.getUserName()+"'失敗,手機(jī)號(hào)碼已存在");}elseif(StringUtils.isNotEmpty(user.getEmail())&&UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))){returnAjaxResult.error("新增用戶'"+user.getUserName()+"'失敗,郵箱賬號(hào)已存在");}user.setCreateBy(getUsername());user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));returntoAjax(userService.insertUser(user));}/***修改用戶*/@PreAuthorize("@ss.hasPermi('system:user:edit')")@Log(title="用戶管理",businessType=BusinessType.UPDATE)@PutMappingpublicAjaxResultedit(@Validated@RequestBodySysUseruser){userService.checkUserAllowed(user);if(StringUtils.isNotEmpty(user.getPhonenumber())&&UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))){returnAjaxResult.error("修改用戶'"+user.getUserName()+"'失敗,手機(jī)號(hào)碼已存在");}elseif(StringUtils.isNotEmpty(user.getEmail())&&UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))){returnAjaxResult.error("修改用戶'"+user.getUserName()+"'失敗,郵箱賬號(hào)已存在");}user.setUpdateBy(getUsername());returntoAjax(userService.updateUser(user));}/***刪除用戶*/@PreAuthorize("@ss.hasPermi('system:user:remove')")@Log(title="用戶管理",businessType=BusinessType.DELETE)@DeleteMapping("/{userIds}")publicAjaxResultremove(@PathVariableLong[]userIds){if(ArrayUtils.contains(userIds,getUserId())){returnerror("當(dāng)前用戶不能刪除");}returntoAjax(userService.deleteUserByIds(userIds));}/***重置密碼*/@PreAuthorize("@ss.hasPermi('system:user:resetPwd')")@Log(title="用戶管理",businessType=BusinessType.UPDATE)@PutMapping("/resetPwd")publicAjaxResultresetPwd(@RequestBodySysUseruser){userService.checkUserAllowed(user);user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));user.setUpdateBy(getUsername());returntoAjax(userService.resetPwd(user));}用戶管理模塊功能圖如圖4-6所示,管理員可以對(duì)用戶進(jìn)行管理,還可以停用用戶,并且可以對(duì)用戶信息進(jìn)行導(dǎo)出,以及導(dǎo)入用戶信息。圖4-6用戶管理模塊功能圖4.3.8部門管理模塊的實(shí)現(xiàn)部門管理子模塊實(shí)現(xiàn)了對(duì)部門的查詢、查看、刪除,本模塊在SysDeptController中定義了部門管理的相關(guān)接口,然后在SysDeptServiceImpl中進(jìn)行邏輯處理。SysDeptController的部分核心代碼如表4-9所示,其實(shí)現(xiàn)了根據(jù)部門的編號(hào)對(duì)部門信息的查詢、查看以及刪除等功能。表4-9SysDeptController類部分代碼表publicclassSysDeptControllerextendsBaseController{@AutowiredprivateISysDeptServicedeptService;/***獲取部門列表*/@PreAuthorize("@ss.hasPermi('system:dept:list')")@GetMapping("/list")publicAjaxResultlist(SysDeptdept){List<SysDept>depts=deptService.selectDeptList(dept);returnAjaxResult.success(depts);}/***新增部門*/@PreAuthorize("@ss.hasPermi('system:dept:add')")@Log(title="部門管理",businessType=BusinessType.INSERT)@PostMappingpublicAjaxResultadd(@Validated@RequestBodySysDeptdept){if(UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept))){returnAjaxResult.error("新增部門'"+dept.getDeptName()+"'失敗,部門名稱已存在");}dept.setCreateBy(getUsername());returntoAjax(deptService.insertDept(dept));}/***修改部門*/@PreAuthorize("@ss.hasPermi('system:dept:edit')")@Log(title="部門管理",businessType=BusinessType.UPDATE)@PutMappingpublicAjaxResultedit(@Validated@RequestBodySysDeptdept){if(UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept))){returnAjaxResult.error("修改部門'"+dept.getDeptName()+"'失敗,部門名稱已存在");}elseif(dept.getParentId().equals(dept.getDeptId())){returnAjaxResult.error("修改部門'"+dept.getDeptName()+"'失敗,上級(jí)部門不能是自己");}elseif(StringUtils.equals(UserConstants.DEPT_DISABLE,dept.getStatus())&&deptService.selectNormalChildrenDeptById(dept.getDeptId())>0){returnAjaxResult.error("該部門包含未停用的子部門!");}dept.setUpdateBy(getUsername());returntoAjax(deptService.updateDept(dept));}/***刪除部門*/@PreAuthorize("@ss.hasPermi('system:dept:remove')")@Log(title="部門管理",businessType=BusinessType.DELETE)@Del
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 旅游業(yè)評(píng)級(jí)財(cái)務(wù)制度
- 白酒出入庫管理財(cái)務(wù)制度
- 非盈利財(cái)務(wù)制度管理
- 怎樣制作財(cái)務(wù)制度
- 商品財(cái)務(wù)制度
- 農(nóng)貿(mào)市場管理員排班制度
- 內(nèi)部協(xié)議簽訂制度
- 公司提成制度
- 養(yǎng)老院老人健康數(shù)據(jù)統(tǒng)計(jì)分析制度
- 養(yǎng)老院環(huán)境衛(wèi)生制度
- 數(shù)字孿生方案
- 【低空經(jīng)濟(jì)】無人機(jī)AI巡檢系統(tǒng)設(shè)計(jì)方案
- 金融領(lǐng)域人工智能算法應(yīng)用倫理與安全評(píng)規(guī)范
- 機(jī)動(dòng)車駕校安全培訓(xùn)課件
- 2025年役前訓(xùn)練考試題庫及答案
- 2024VADOD臨床實(shí)踐指南:耳鳴的管理課件
- 2025年湖南省公務(wù)員錄用考試錄用考試《申論》標(biāo)準(zhǔn)試卷及答案
- 行政崗位面試問題庫及應(yīng)對(duì)策略
- 2025年中信金融業(yè)務(wù)面試題庫及答案
- 2025廣東潮州府城文化旅游投資集團(tuán)有限公司下屬企業(yè)副總經(jīng)理崗位招聘1人筆試歷年備考題庫附帶答案詳解2套試卷
- 2025年公務(wù)員多省聯(lián)考《申論》題(陜西A卷)及參考答案
評(píng)論
0/150
提交評(píng)論