Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 国产一区二区中文字幕,亚洲一区二区三区在线视频,激情文学小说区另类小说同性

          整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          SSM訂單智慧管理系統-使用手冊.pdf

          、簡介

          1.1、開發目的和背景


          隨著電子商務的快速發展,企業對訂單管理的需求日益增長,傳統的手動操作方式已經無法滿足現代化企業高效、精準、智能的運營需求。為此,我們推出了這款專為中小型企業量身打造的SSM訂單智慧管理系統。其核心目標是通過集成先進的信息技術,簡化業務流程,提升運營效率,降低管理成本,同時提供全方位的客戶服務支持。


          在當今數字化時代,企業間的競爭已從產品和價格轉向服務和體驗。對于訂單管理,企業不僅需要處理大量的日常交易,還需要實時跟蹤訂單狀態,有效管理庫存,快速響應客戶查詢,以及生成準確的財務報表。然而,傳統系統往往過于復雜,操作繁瑣,難以適應這種變化。


          SSM訂單智慧管理系統正是為解決這一問題而設計。它以用戶友好和易用性為核心,將多個關鍵業務環節如訂單創建、處理、發貨、支付、發票開具等整合在一個平臺上,實現了信息的無縫流轉和共享。此外,強大的數據分析功能可以幫助企業進行精細化運營,通過對歷史數據的深入挖掘,預測銷售趨勢,制定更有效的營銷策略。


          在支持中心模塊,我們提供了詳細的操作指南和常見問題解答,確保用戶能夠快速上手并解決問題。財務報表管理模塊則能自動生成精確的報表,幫助企業做出明智的決策。無論是內部運營管理還是外部客戶服務,SSM都力求為用戶提供一站式的解決方案。


          總之,SSM訂單智慧管理系統旨在通過技術創新,幫助企業提升競爭力,實現數字化轉型,從而在激烈的市場競爭中立于不敗之地。

          1.2、軟件的目標用戶


          SSM訂單智慧管理系統是一款專為電商、零售和服務業設計的全面解決方案,它旨在幫助企業提升運營效率,優化客戶服務,并實現數據驅動的決策。以下是該軟件的應用場景和目標用戶的描述:


          1. 在日常運營中,幫助企業管理員工快速響應客戶需求,通過幫助中心提供即時解答,節省大量客服時間。


          2. 財務報表管理模塊可以幫助財務人員實時跟蹤收入和支出,以便進行有效的成本控制和預算規劃。


          3. 訂單管理模塊能自動化處理訂單流程,從接收到發貨全程跟蹤,降低出錯率,提高客戶滿意度。


          4. 通過庫存管理和商品管理,企業能夠實時了解銷售情況,避免斷貨或過度庫存的風險。


          - 中小型電商平臺和零售商,他們需要一個集成的平臺來簡化操作流程,提升工作效率。


          - 需要高效管理訂單、財務、庫存的零售企業,特別是那些面臨快速擴張或頻繁促銷活動的企業。


          - 對數據可視化和分析有需求的企業,他們可以利用統計分析功能進行業務洞察和策略調整。


          - 服務型企業,如餐飲、美容院等,可通過系統管理客戶信息,提供個性化的服務體驗。


          這款軟件的目標用戶是尋求數字化轉型,希望通過技術驅動業務增長,提升客戶體驗并降低成本的企業決策者和技術團隊。無論是新手還是經驗豐富的用戶,SSM訂單智慧管理系統都能提供直觀易用的界面和強大功能支持。

          二、軟件總體設計

          2.1、系統概述


          ssm訂單智慧管理系統是一款高效整合的商業智能工具,專為現代企業打造,主要利用Java編程語言和SpringMVC開發框架構建而成,數據庫采用業界廣泛認可的MySQL。該系統集成了多種關鍵業務模塊,旨在提升企業的運營效率和管理水平。


          1. 幫助中心:提供詳盡的操作指南和常見問題解答,讓用戶快速上手和解決問題。


          2. 財務報表管理:生成各種財務報告,如收入、支出、利潤等,幫助管理者實時掌握財務狀況。


          3. 訂單管理:實時跟蹤訂單狀態,包括創建、處理、發貨和退款等全過程,確保流程透明。


          4. 發票管理:自動化發票開具與管理,簡化發票流程,降低出錯風險。


          5. 活動管理:支持促銷活動策劃與執行,幫助企業提高銷售轉化率。


          6. 積分管理:設計激勵體系,通過積分制度增強用戶黏性。


          7. 技術支持:為用戶提供專業的技術咨詢與維護服務,確保系統的穩定運行。


          8. 客服管理:集成客戶關系管理系統,便于團隊協作處理客戶咨詢與投訴。


          9. 庫存管理:實時監控庫存水平,預警低庫存,防止斷貨風險。


          10. 商品管理:方便添加、編輯和刪除商品信息,維護商品目錄。


          11. 收貨地址管理:便捷管理用戶的收貨地址,提高配送效率。


          12. 統計分析:提供數據可視化圖表,幫助企業洞察業務趨勢,做出數據驅動的決策。


          13. 推廣管理:支持多渠道營銷活動,優化營銷策略。


          14. 退款管理:清晰的退款流程,減少糾紛,提升用戶滿意度。


          15. 物流管理:無縫對接第三方物流公司,實時更新物流信息。


          16. 消息管理:集成推送通知,確保重要信息不被遺漏。


          17. 用戶管理:全面管理用戶賬戶,權限設置靈活。


          18. 優惠券管理:支持多種類型的優惠券發放,促進消費。


          總之,ssm訂單智慧管理系統是一款全方位的企業管理解決方案,通過集成化的功能設計,旨在簡化復雜業務操作,實現業務流程的自動化,助力企業實現數字化轉型和高效運營。

          2.2、系統架構


          SSM訂單智慧管理系統是一款基于Java+Spring MVC的B/S架構的全面企業管理軟件。該架構設計的核心思想是將業務邏輯與表示層分離,以提高代碼復用性和系統的可維護性。


          1. 前端界面(B/S):采用瀏覽器/服務器模式,用戶通過Web瀏覽器訪問,無需安裝任何客戶端軟件。前端使用HTML、CSS和JavaScript技術構建,提供直觀、用戶友好的圖形用戶界面,展示各種功能模塊,如訂單、發票、庫存等信息。


          2. Spring MVC:作為核心框架,Spring MVC實現了模型-視圖-控制器(Model-View-Controller,MVC)的設計模式。控制器處理用戶的請求,調用服務層的業務邏輯,視圖負責數據的呈現,模型則存儲和管理數據。這種設計使代碼結構清晰,易于理解和擴展。


          3. Java后端:選用Java語言,因其強大的面向對象特性和豐富的庫支持。Java后臺處理復雜的業務邏輯,調用持久層(DAO)操作數據庫,實現數據的增刪改查和事務管理。


          4. 持久層(DAO)與數據訪問(JPA):通常使用Java Persistence API (JPA) 或 Hibernate等ORM工具,與關系型數據庫(如MySQL、Oracle)進行交互,提供數據的持久化和事務支持。


          5. 服務層(Service):作為業務邏輯的處理中心,封裝和抽象了底層數據訪問層,提供對外的接口,使得代碼更加模塊化,便于單元測試和維護。


          6. 分布式組件:考慮到系統的擴展性和高可用性,可能涉及分布式緩存(Redis)、消息隊列(RabbitMQ)、負載均衡(Nginx)等,以實現異步處理、數據分發等功能。


          7. 安全性:通過Spring Security進行權限管理和身份驗證,確保敏感數據的安全。同時,采用HTTPS加密通信,保護數據傳輸過程中的隱私。


          8. 統計分析與報告:系統內置的數據分析模塊,能生成各種報表,幫助企業管理人員做出決策。


          綜上所述,SSM訂單智慧管理系統的架構設計旨在提供一個高效、穩定、可擴展的平臺,以滿足企業對訂單管理、財務管理等多方面的自動化需求。

          三、軟件操作說明

          3.1、系統登錄


          在瀏覽器中輸入系統網址,打開登錄界面后輸入登錄賬號、登錄密碼、驗證碼即可登錄。

          3.2、工作臺


          工作臺包含:幫助中心、財務報表管理、訂單管理、發票管理、活動管理、積分管理、技術支持、客服管理、庫存管理、商品管理、收貨地址管理、統計分析、推廣管理、退款管理、物流管理、消息管理、用戶管理、優惠券管理,根據不同角色權限菜單展示會有所區別。

          3.2.1、幫助中心


          幫助中心管理功能主要字段信息包含:編碼、問題ID、問題標題、問題描述、問題解答、問題類型、熱門問題等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進行幫助中心信息的管理。


          幫助中心管理設置新增、編輯、刪除、條件搜索、查看詳情等操作,可按照頁面提示進行操作執行,界面結構設計簡單,操作流程簡潔明了,可提升用戶操作體驗。

          3.2.2、財務報表管理


          管理管理功能主要字段信息包含:管理編碼、報表ID、報表名稱、報表類型、報表時間、報表狀態、報表內容等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進行管理信息的管理。


          系統為管理管理提供了全面支持,包括新增記錄、編輯信息、刪除條目、數據導出、條件檢索及詳情查看等功能。用戶只需遵循頁面清晰的操作指引,即可輕松完成各項任務。界面設計遵循極簡原則,布局直觀,交互流暢,旨在營造無負擔的操作環境,顯著提升用戶的使用體驗與工作效率。

          3.2.3、訂單管理


          管理管理功能主要字段信息包含:管理編碼、訂單號、訂單時間、訂單金額、收貨人、收貨地址、聯系電話等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進行管理信息的管理。


          針對管理管理,系統精心設置了全方位功能模塊,涵蓋新增、編輯、刪除、導出、條件檢索以及查看詳情等核心操作。用戶在使用過程中,僅需緊密跟隨頁面內直觀且詳盡的操作提示,即可輕松駕馭各項流程。我們秉持化繁為簡的理念,打造出簡約明快的界面風格與邏輯清晰的操作流程,旨在讓用戶在高效管理數據,享受到愉悅、無壓力的操作體驗。

          3.2.4、發票管理


          管理管理功能主要字段信息包含:管理編碼、訂單號、發票抬頭、開票金額、開票時間、開票狀態等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進行管理信息的管理。


          為實現對管理管理,系統精心配備了豐富的功能組件,包括新增、編輯、刪除、導出、條件搜以及詳情查看等實用操作。用戶在操作過程中,只需遵循頁面上清晰易懂的引導提示,即可順暢地完成各項任務。我們注重用戶體驗,以簡約而不失專業的界面設計,輔以直觀且高效的流程布局,旨在助力用戶在輕松管理數據同時,全面提升操作滿意度與工作效率。

          3.2.5、活動管理


          管理管理功能主要字段信息包含:管理編碼、活動ID、活動名稱、活動時間、活動描述、參與條件、活動獎品等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進行管理信息的管理。


          為滿足管理管理的多元需求,系統配置了一系列操作功能:新增、編輯、刪除、導出、搜索、詳情。用戶在實際操作中,僅需按照頁面上直觀且詳盡的操作提示,即可輕松駕馭各項流程。系統界面設計簡約清爽,操作邏輯清晰明了,旨在讓用戶在高效管理數據的同時,盡享流暢、無壓力的操作體驗,大幅提升工作效率與滿意度。

          3.2.6、積分管理


          管理管理功能主要字段信息包含:管理編碼、用戶ID、積分來源、積分值、積分變動時間、積分使用記錄等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進行管理信息的管理。


          管理管理設置新增、編輯、刪除、條件搜索、查看詳情等操作,可按照頁面提示進行操作執行,界面結構設計簡單,操作流程簡潔明了,可提升用戶操作體驗。

          3.2.7、技術支持


          技術支持管理功能主要字段信息包含:編碼、技術支持ID、技術支持名稱、技術支持郵箱、技術支持電話、技術支持狀態等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進行技術支持信息的管理。


          系統為技術支持管理提供了全面支持,包括新增記錄、編輯信息、刪除條目、數據導出、條件檢索及詳情查看等功能。用戶只需遵循頁面清晰的操作指引,即可輕松完成各項任務。界面設計遵循極簡原則,布局直觀,交互流暢,旨在營造無負擔的操作環境,顯著提升用戶的使用體驗與工作效率。

          3.2.8、客服管理


          管理管理功能主要字段信息包含:管理編碼、客服ID、客服姓名、客服電話、客服郵箱、客服狀態等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進行管理信息的管理。


          針對管理管理,系統精心設置了全方位功能模塊,涵蓋新增、編輯、刪除、導出、條件檢索以及查看詳情等核心操作。用戶在使用過程中,僅需緊密跟隨頁面內直觀且詳盡的操作提示,即可輕松駕馭各項流程。我們秉持化繁為簡的理念,打造出簡約明快的界面風格與邏輯清晰的操作流程,旨在讓用戶在高效管理數據,享受到愉悅、無壓力的操作體驗。

          3.2.9、庫存管理


          管理管理功能主要字段信息包含:管理編碼、商品ID、進貨單號、進貨時間、進貨數量、進貨單價、庫存數量等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進行管理信息的管理。


          為實現對管理管理,系統精心配備了豐富的功能組件,包括新增、編輯、刪除、導出、條件搜以及詳情查看等實用操作。用戶在操作過程中,只需遵循頁面上清晰易懂的引導提示,即可順暢地完成各項任務。我們注重用戶體驗,以簡約而不失專業的界面設計,輔以直觀且高效的流程布局,旨在助力用戶在輕松管理數據同時,全面提升操作滿意度與工作效率。

          3.2.10、商品管理


          管理管理功能主要字段信息包含:管理編碼、商品ID、商品名稱、商品圖片、商品描述、商品價格、庫存量等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進行管理信息的管理。


          為滿足管理管理的多元需求,系統配置了一系列操作功能:新增、編輯、刪除、導出、搜索、詳情。用戶在實際操作中,僅需按照頁面上直觀且詳盡的操作提示,即可輕松駕馭各項流程。系統界面設計簡約清爽,操作邏輯清晰明了,旨在讓用戶在高效管理數據的同時,盡享流暢、無壓力的操作體驗,大幅提升工作效率與滿意度。

          3.2.11、收貨地址管理


          管理管理功能主要字段信息包含:管理編碼、用戶ID、收貨人、收貨地址、聯系電話、是否默認地址等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進行管理信息的管理。


          管理管理設置新增、編輯、刪除、條件搜索、查看詳情等操作,可按照頁面提示進行操作執行,界面結構設計簡單,操作流程簡潔明了,可提升用戶操作體驗。

          3.2.12、統計分析


          統計分析管理功能主要字段信息包含:編碼、訂單量、銷售額、用戶量、用戶留存率、商品銷售排行榜等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進行統計分析信息的管理。


          系統為統計分析管理提供了全面支持,包括新增記錄、編輯信息、刪除條目、數據導出、條件檢索及詳情查看等功能。用戶只需遵循頁面清晰的操作指引,即可輕松完成各項任務。界面設計遵循極簡原則,布局直觀,交互流暢,旨在營造無負擔的操作環境,顯著提升用戶的使用體驗與工作效率。

          3.2.13、推廣管理


          管理管理功能主要字段信息包含:管理編碼、推廣ID、推廣渠道、推廣鏈接、注冊量、下單量、成交金額等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進行管理信息的管理。


          針對管理管理,系統精心設置了全方位功能模塊,涵蓋新增、編輯、刪除、導出、條件檢索以及查看詳情等核心操作。用戶在使用過程中,僅需緊密跟隨頁面內直觀且詳盡的操作提示,即可輕松駕馭各項流程。我們秉持化繁為簡的理念,打造出簡約明快的界面風格與邏輯清晰的操作流程,旨在讓用戶在高效管理數據,享受到愉悅、無壓力的操作體驗。

          3.2.14、退款管理


          管理管理功能主要字段信息包含:管理編碼、訂單號、退款原因、退款金額、退款時間、退款狀態、退款處理人員等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進行管理信息的管理。


          為實現對管理管理,系統精心配備了豐富的功能組件,包括新增、編輯、刪除、導出、條件搜以及詳情查看等實用操作。用戶在操作過程中,只需遵循頁面上清晰易懂的引導提示,即可順暢地完成各項任務。我們注重用戶體驗,以簡約而不失專業的界面設計,輔以直觀且高效的流程布局,旨在助力用戶在輕松管理數據同時,全面提升操作滿意度與工作效率。

          3.2.15、物流管理


          管理管理功能主要字段信息包含:管理編碼、物流公司、物流單號、運費、發貨時間、收貨時間、發貨地址、收貨地址等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進行管理信息的管理。


          為滿足管理管理的多元需求,系統配置了一系列操作功能:新增、編輯、刪除、導出、搜索、詳情。用戶在實際操作中,僅需按照頁面上直觀且詳盡的操作提示,即可輕松駕馭各項流程。系統界面設計簡約清爽,操作邏輯清晰明了,旨在讓用戶在高效管理數據的同時,盡享流暢、無壓力的操作體驗,大幅提升工作效率與滿意度。

          3.2.16、消息管理


          管理管理功能主要字段信息包含:管理編碼、消息ID、消息類型、消息內容、接收者、發送時間、消息狀態等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進行管理信息的管理。


          管理管理設置新增、編輯、刪除、條件搜索、查看詳情等操作,可按照頁面提示進行操作執行,界面結構設計簡單,操作流程簡潔明了,可提升用戶操作體驗。

          3.2.17、用戶管理


          管理管理功能主要字段信息包含:管理編碼、用戶ID、用戶名、密碼、角色、郵箱、電話、狀態等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進行管理信息的管理。


          系統為管理管理提供了全面支持,包括新增記錄、編輯信息、刪除條目、數據導出、條件檢索及詳情查看等功能。用戶只需遵循頁面清晰的操作指引,即可輕松完成各項任務。界面設計遵循極簡原則,布局直觀,交互流暢,旨在營造無負擔的操作環境,顯著提升用戶的使用體驗與工作效率。

          3.2.18、優惠券管理


          管理管理功能主要字段信息包含:管理編碼、優惠券ID、優惠券名稱、優惠方式、使用條件、使用時間、使用范圍、發放數量等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進行管理信息的管理。


          針對管理管理,系統精心設置了全方位功能模塊,涵蓋新增、編輯、刪除、導出、條件檢索以及查看詳情等核心操作。用戶在使用過程中,僅需緊密跟隨頁面內直觀且詳盡的操作提示,即可輕松駕馭各項流程。我們秉持化繁為簡的理念,打造出簡約明快的界面風格與邏輯清晰的操作流程,旨在讓用戶在高效管理數據,享受到愉悅、無壓力的操作體驗。

          四、注意事項


          系統支持唯一登錄,一個賬號同時只能由一人使用。信息展示順序如果特殊說明,按照排序索引值從大到小進行排序。數據刪除之后,其關聯的數據將不可用使用,或無法正常顯示。內容狀態一般為正常時,表示數據可正常使用操作,如果為異常或者未審核,則表示在關聯數據調用時,不會顯示。

          態機簡介:

          狀態機是有限狀態自動機的簡稱,是現實事物運行規則抽象而成的一個數學模型。【規則的抽象】

          有限狀態機一般都有以下特點:

          (1)可以用狀態來描述事物,并且任一時刻,事物總是處于一種狀態;

          (2)事物擁有的狀態總數是有限的;

          (3)通過觸發事物的某些行為,可以導致事物從一種狀態過渡到另一種狀態;

          (4)事物狀態變化是有規則的,A狀態可以變換到B,B可以變換到C,A卻不一定能變換到C;

          (5)同一種行為,可以將事物從多種狀態變成同種狀態,但是不能從同種狀態變成多種狀態。

          狀態機這種描述客觀世界的方式就是將事物抽象成若干狀態,然后所有的事件和規則導致事物在這些狀態中游走。最終使得事物“自圓其說”。

          很多通信協議的開發都必須用到狀態機;一個健壯的狀態機可以讓你的程序,不論發生何種突發事件都不會突然進入一個不可預知的程序分支。

          • 狀態機示例:

          四大概念:


          狀態(state)

          一個狀態機至少要包含兩個狀態。

          分為:現態(源狀態)、次態(目標狀態)

          狀態可以理解為一種結果,一種穩態形式,沒有擾動會保持不變的。

          狀態命名形式:

          1.副詞+動詞;例如:待審批、待支付、待收貨

          這種命名方式體現了:狀態機就是事件觸發狀態不斷遷徙的本質。表達一種待觸發的感覺。

          2.動詞+結果;例如:審批完成、支付完成

          3.已+動詞形式;例如:已發貨、已付款

          以上兩種命名方式體現了:狀態是一種結果或者穩態的本質。表達了一種已完成的感覺。

          角色很多的時候,為了表示清晰,可以加上角色名:例如:待財務審批、主管批準

          命名考慮從用戶的理解的角度出發。



          事件(event)

          or

          觸發條件

          又稱為“條件”,就是某個操作動作的觸發條件或者口令。當一個條件滿足時,就會觸發一個動作,或者執行一次狀態遷徙

          這個事件可以是外部調用、監聽到消息、或者各種定時到期等觸發的事件。

          對于燈泡,“打開開關”就是一個事件。

          條件命名形式:動詞+結果;例如:支付成功、下單時間>5分鐘


          動作(action)

          事件發生以后要執行動作。例如:事件=“打開開關指令”,動作=“開燈”。一般就對應一個函數。

          條件滿足后執行動作。動作執行完畢后,可以遷移到新的狀態,也可以仍舊保持原狀態。

          動作不是必需的,當條件滿足后,也可以不執行任何動作,直接遷移到新狀態。

          那么如何區分“動作”和“狀態”?

          “動作”是不穩定的,即使沒有條件的觸發,“動作”一旦執行完畢就結束了;

          而“狀態”是相對穩定的,如果沒有外部條件的觸發,一個狀態會一直持續下去。


          變換(transition)

          即從一個狀態變化到另外一個狀態

          例如:“開燈過程”就是一個變化



          狀態機其他表達方式:

          狀態機的設計:

          信息系統中有很多狀態機,例如:業務訂單的狀態。

          狀態機的設計存在的問題:什么是狀態?到底有多少個狀態?要細分到什么程度?

            信息系統是現實世界的一種抽象和描述。而業務領域中那些已經發生的事件就是事實信息系統就是將這些事實以信息的形式存儲到數據庫中,即:信息就是一組事實

          信息系統就是存儲這些事實,對這些事實進行管理與追蹤,進而起到提高工作效率的作用。

          信息系統就是記錄已經發生的事實,信息系統中的狀態基本和事實匹配。即:標識某個事實的完成度。

          業務系統,根據實際業務,具體會有哪些發生的事實需要記錄,基本上這些事實就至少對應一個狀態。需要記錄的事實就是一種穩態,一種結果。

          例如:【待支付】->【已支付】->【已收貨】->【已評價】

          這些都是系統需要記錄的已發生的客觀事實。而這些事實就對應了狀態,而發生這些事實的事件就對應了觸發狀態機的轉換的事件。

          根據自己的業務實際進行分析,并畫出狀態圖即可。

          狀態機實現方式:狀態模式

          下面是經典的自動販賣機例子來說明狀態模式的用法,狀態圖如下:

          分析一個這個狀態圖:

          a、包含4個狀態(我們使用4個int型常量來表示)
          b、包含3個暴露在外的方法(投幣、退幣、轉動手柄、(發貨動作是內部方法,售賣機未對外提供方法,售賣機自動調用))
          c、我們需要處理每個狀態下,用戶都可以觸發這三個動作。

          我們可以做沒有意義的事情,在【未投幣】狀態,試著退幣,或者同時投幣兩枚,此時機器會提示我們不能這么做。


          實現邏輯:

              任何一個可能的動作,我們都要檢查,看看我們所處的狀態和動作是否合適。

          狀態機使用if-else或switch實現

          測試自動售賣機

          使用if-else/switch的方式實現狀態有如下問題:

          • 沒有遵守【開閉】原則,沒有【封裝變化】,所以沒有彈性,應對需求變更非常吃力。

             例如:現在增加一個狀態。每個方法都需要添加if-else語句。

          • 狀態如何轉換看得不是很清楚,隱藏在if-else/switch邏輯中。

          升級策略:

          【封裝變化】,局部化每個狀態的行為,將每個狀態的行為放到各自類中,每個狀態只要實現自己的動作就可以了。

          販賣機只要將動作委托給代表當前狀態的狀態對象即可。


          public interface State
          {
              /**
               * 放錢
               */
              public void insertMoney();
              /**
               * 退錢
               */
              public void backMoney();
              /**
               * 轉動曲柄
               */
              public void turnCrank();
              /**
               * 出商品
               */
              public void dispense();
          }
          public class NoMoneyState implements State
          {
           
              private VendingMachine machine;
           
              public NoMoneyState(VendingMachine machine)
              {
                  this.machine = machine;
                  
              }
              
              @Override
              public void insertMoney()
              {
                  System.out.println("投幣成功");
                  machine.setState(machine.getHasMoneyState());
              }
           
              @Override
              public void backMoney()
              {
                  System.out.println("您未投幣,想退錢?...");
              }
           
              @Override
              public void turnCrank()
              {
                  System.out.println("您未投幣,想拿東西么?...");
              }
           
              @Override
              public void dispense()
              {
                  throw new IllegalStateException("非法狀態!");
              }
           
          }
          public class HasMoneyState implements State
          {
           
              private VendingMachine machine;
           
              public HasMoneyState(VendingMachine machine)
              {
                  this.machine = machine;
              }
           
              @Override
              public void insertMoney()
              {
                  System.out.println("您已經投過幣了,無需再投....");
              }
           
              @Override
              public void backMoney()
              {
                  System.out.println("退幣成功");
                      machine.setState(machine.getNoMoneyState());
              }
           
              @Override
              public void turnCrank()
              {
                  System.out.println("你轉動了手柄");
                  machine.setState(machine.getSoldState());
              }
           
              @Override
              public void dispense()
              {
                  throw new IllegalStateException("非法狀態!");
              }
           
          }
              
          public class SoldOutState implements State
          {
           
              private VendingMachine machine;
           
              public SoldOutState(VendingMachine machine)
              {
                  this.machine = machine;
              }
           
              @Override
              public void insertMoney()
              {
                  System.out.println("投幣失敗,商品已售罄");
              }
           
              @Override
              public void backMoney()
              {
                  System.out.println("您未投幣,想退錢么?...");
              }
           
              @Override
              public void turnCrank()
              {
                  System.out.println("商品售罄,轉動手柄也木有用");
              }
           
              @Override
              public void dispense()
              {
                  throw new IllegalStateException("非法狀態!");
              }
           
          }
          public class SoldState implements State
          {
           
              private VendingMachine machine;
           
              public SoldState(VendingMachine machine)
              {
                  this.machine = machine;
              }
           
              @Override
              public void insertMoney()
              {
                  System.out.println("正在出貨,請勿投幣");
              }
           
              @Override
              public void backMoney()
              {
                  System.out.println("正在出貨,沒有可退的錢");
              }
           
              @Override
              public void turnCrank()
              {
                  System.out.println("正在出貨,請勿重復轉動手柄");
              }
           
              @Override
              public void dispense()
              {
                  machine.releaseBall();
                  if (machine.getCount() > 0)
                  {
                      machine.setState(machine.getNoMoneyState());
                  } else
                  {
                      System.out.println("商品已經售罄");
                      machine.setState(machine.getSoldOutState());
                  }
              }
          }
          public class VendingMachine
          {
              private State noMoneyState;
              private State hasMoneyState;
              private State soldState;
              private State soldOutState;
              private State winnerState ; 
          
          
              private int count = 0;
              private State currentState = noMoneyState;
           
              public VendingMachine(int count)
              {
                  noMoneyState = new NoMoneyState(this);
                  hasMoneyState = new HasMoneyState(this);
                  soldState = new SoldState(this);
                  soldOutState = new SoldOutState(this);
                  winnerState = new WinnerState(this);
           
                        if (count > 0)
                       {
                      this.count = count;
                      currentState = noMoneyState;
                       }
              }
           
                 //將這些動作委托給當前狀態.
              public void insertMoney()
              {
                  currentState.insertMoney();
              }
           
              public void backMoney()
              {
                  currentState.backMoney();
              }
                 
                  // 機器不用提供dispense動作,因為這是一個內部動作.用戶不可以直 
                  //接要求機器發放糖果.我們在狀態對象的turnCrank()方法中調用 
                  //dispense方法;
          
                 //dispense無論如何,即使在nomoney狀態也會被執行.
                 //讓不合法的情形下,dispense拋出異常處理。
              public void turnCrank()
              {
                  currentState.turnCrank();
                      currentState.dispense();
              }
           
          
              public void releaseBall()
              {
                  System.out.println("發出一件商品...");
                  if (count != 0)
                  {
                      count -= 1;
                  }
              }
           
              public void setState(State state)
              {
                  this.currentState = state;
              }
           
              //getter setter omitted ...
           
          }

          我們之前說過,if-else/switch實現方式沒有彈性,那現在按照這種實現模式,需求變更修改起來會輕松點嗎?

          紅色部分標記了我們的需求變更:當用戶每次轉動手柄的時候,有10%的幾率贈送一瓶。

          實現方式:

          我們遵守了【開閉】原則,只要新建一個WinnerState的類即可。然后有限的修改has_money的轉向即可。

          為什么WinnerState要獨立成一個狀態,其實它和sold狀態一模一樣。我把代碼寫在SoldState中不行嗎?

          • 第一個原因就是上面說的信息系統的本質就是記錄【事實】,中獎是需要記錄的事實,它應該是一個狀態。
          • 第二個原因:【單一職責】問題,我們一個類的責任是明確的。

             如果sold需求變化不一定影響到winner代碼實現,winner需求變化時,也不一定要修改sold,比如促銷方案結束了,中獎概率變了等。

             如果他們的變化不是一定互相影響到彼此的,那我們就該將他們分離,即是【隔離變化】也是遵守【單一職責】的原則。


          public class WinnerState implements State
          {
           
              private VendingMachine machine;
           
              public WinnerState(VendingMachine machine)
              {
                  this.machine = machine;
              }
           
              @Override
              public void insertMoney()
              {
                  throw new IllegalStateException("非法狀態");
              }
           
              @Override
              public void backMoney()
              {
                  throw new IllegalStateException("非法狀態");
              }
           
              @Override
              public void turnCrank()
              {
                  throw new IllegalStateException("非法狀態");
              }
           
              @Override
              public void dispense()
              {
                  System.out.println("你中獎了,恭喜你,將得到2件商品");
                  machine.releaseBall();
           
              if (machine.getCount() == 0)
              {
                  System.out.println("商品已經售罄");
                  machine.setState(machine.getSoldOutState());
              } else
              {
                  machine.releaseBall();
                  if (machine.getCount() > 0)
                  {
                      machine.setState(machine.getNoMoneyState());
                  } else
                  {
                      System.out.println("商品已經售罄");
                      machine.setState(machine.getSoldOutState());
                  }
                  
              }
           
              }
           
          }
          public class HasMoneyState implements State
          {
           
              private VendingMachine machine;
              private Random random = new Random();
           
              public HasMoneyState(VendingMachine machine)
              {
                  this.machine = machine;
              }
           
              @Override
              public void insertMoney()
              {
                  System.out.println("您已經投過幣了,無需再投....");
              }
           
              @Override
              public void backMoney()
              {
                  System.out.println("退幣成功");
           
              machine.setState(machine.getNoMoneyState());
              }
           
              @Override
              public void turnCrank()
              {
                  System.out.println("你轉動了手柄");
                  int winner = random.nextInt(10);
                  if (winner == 0 && machine.getCount() > 1)
                  {
                      machine.setState(machine.getWinnerState());
                  } else
                  {
                      machine.setState(machine.getSoldState());
                  }
              }
           
              @Override
              public void dispense()
              {
                  throw new IllegalStateException("非法狀態!");
              }
           
          }

          總結狀態模式:

          狀態模式:允許對象在內部狀態改變時改變它的行為,對象看起來好像修改了他的類。

          解釋:

          狀態模式將狀態封裝成為獨立的類,并將動作委托到代表當前狀態的對象。
          所以行為會隨著內部狀態改變而改變。
          我們通過組合簡單引用不同狀態對象來造成類改變的假象.


          狀態模式策略模式


          1.行為封裝的n個狀態中,不同狀態不用行為。

          2.context的行為委托到不同狀態中。

          3.[當前狀態]在n個狀態中游走,context的行為也隨之[當前狀態]的改變而改變。

          4.用戶對context的狀態改變渾然不知。

          5.客戶不會直接和state交互,只能通過context暴露的方法交互,state轉換是context內部事情。

          6.state可以是接口也可以是抽象類,取決于有沒公共功能可以放進抽象類中。抽象類方便,因為可以后續加方法。

          可以將重復代碼放入抽象類中。例如:"你已投入25元,不能重復投" 這種通用代碼放入抽象類中。

          7.context可以決定狀態流轉,如果這個狀態流轉是固定的,就適合放在context中進行。但是如果狀態流轉是動態的就適合放在狀態中進行。

          例如通過商品的剩余數目來決定流向[已售完]或[等待投幣],這個時候放在狀態類中,因為dispense要根據狀態判斷流轉。

          這個寫法決定了,有新需求時候,你是改context還是改state類。

          8.可以共享所有的state對象,但是需要修改context的時候時候,需要handler中傳入context引用

          1.context主動指定需要組合的策略對象是哪一個。

          2.可以在啟動的時候通過工廠動態指定具體是哪個策略對象,但是沒有在策略對象之間游走,即:只組合了一個策略對象。

          3.策略作為繼承之外一種彈性替代方案。因為繼承導致子類繼承不適用的方法,且每個類都要維護,策略模式通過不同對象組合來改變行為。

          4.策略模式聚焦的是互換的算法來創建業務。



          狀態機典型應用:訂單狀態控制

          建表語句

          如上圖所示:

          一種典型的訂單設計。業務訂單和支付退款訂單組合,他們分別有自己的狀態機。

          • 業務訂單狀態機負責業務邏輯,并和支付退款狀態機聯動。
          • 一切以業務狀態機為主。例如:業務狀態已經【關單】,此時收到支付成功通知,需要進行退款
          • 每個狀態有自己的過期時間。異常訂單的撈取通過過期時間判斷。

          狀態機模式實現訂單狀態機:

          日常開發過程中,狀態機模式應用場景之一的就是訂單模型中的狀態控制。但是區別于狀態模式的點有以下幾個:

          • 狀態模式,所有的操作都在內存。而訂單狀態機是要落庫的。為了防止訂單的并發操作,更新訂單的時候需要使用樂觀鎖機制。
          • 狀態模式的狀態對象是新建狀態機的時候初始化進去的。在實際開發中,狀態對象要復用,被spring管理。
          • 而訂單狀態機對象對應了一條數據庫中實體的訂單,是要每次從數據庫中查出來的即時新建對象,所以必須將該新建的訂單狀態機對象傳入到狀態對象中。使用狀態對象處理該訂單狀態機對象。

          以支付訂單為例:

          /*
             Title: PaymentInfo Description:
            支付訂單狀態機
             該類不可被spring管理,需要new出來,一個類就對應一條數據庫中支付訂單記錄
             本文來自博客園,作者:wanglifeng,轉載請注明原文鏈接:https://www.cnblogs.com/wanglifeng717/p/16214122.html
             
             @author wanglifeng
           */
          
          
          public class PaymentStateMachine {
          
              // 數據庫中當前支付訂單實體
              private SapoPayment payment;
          
              // 當前狀態
              private PaymentState currentState;
          
              // 需要更新入庫的支付訂單實體。與payment屬性配合,payment為當前數據庫中訂單實體,用于樂觀鎖的前置內容校驗。
              private SapoPayment paymentForUpdate;
          
              /* 將最新內容(含狀態)更新入庫,并當前狀態機狀態 */
              public void updateStateMachine() {
          
                  // 從Spring容器中獲取操作數據的dao
                  SapoDao dao = SpringUtil.getBean(SapoDao.class);
          
                  // 更新數據庫,樂觀鎖機制:帶前置內容數據校驗,其中payment為前置內容,paymentForUpdate為要更新的內容,如果更新結果=0,說明該訂單被其他線程修改過。拋異常,放棄此次修改。
                  dao.updateSapoPaymentByNull(paymentForUpdate, payment);
          
                  // 記錄訂單操作流水
                  dao.insertSapoOrderStatusLog(SapoOrderStatusLog.getInstance().setOrderId(paymentForUpdate.getId())
                          .setOrderType(SapoOrderStatusLog.ORDER_TYPE_PAYMENT).setStatus(paymentForUpdate.getStatus()));
          
                  // 更新當前PaymentStateMachine狀態機
                  this.setPayment(paymentForUpdate);
                  this.setCurrentState(paymentForUpdate.getStatus());
              }
          
              // 通過條件獲取一個支付訂單PaymentStateMachine實體
              public static PaymentStateMachine getInstance(SapoPayment sapoPaymentForQuery) {
                  // 1.從spring容器中獲取dao;
                  SapoDao dao = SpringUtil.getBean(SapoDao.class);
          
                  // 2.查出該支付訂單
                  SapoPayment paymentResult = dao.getSapoPayment(sapoPaymentForQuery);
          
                  // 3.初始化訂單狀態機
                  PaymentStateMachine paymentStateMachine = new PaymentStateMachine();
                  paymentStateMachine.setPayment(paymentResult);
                  paymentStateMachine.setCurrentState(paymentResult.getStatus());
                  paymentStateMachine.setPaymentForUpdate(SapoPayment.getInstance(paymentResult));
          
                  return paymentStateMachine;
              }
          
              // 設置當前狀態機的狀態。輸入數據庫中status字段,映射成對應的狀態類實體。
              public void setCurrentState(Integer status) {
          
                  PaymentState currentState = null;
          
                  // status數字,映射成對應的狀態類實體
                  if (SapoPayment.STATUS_APPLY.equals(status)) {
                      currentState = SpringUtil.getBean(PaymentStateApply.class);
                  } else if (SapoPayment.STATUS_WAIT_PAY.equals(status)) {
                      currentState = SpringUtil.getBean(PaymentStateWaitPay.class);
                  } else if (SapoPayment.STATUS_PAY_FINISH.equals(status)) {
                      currentState = SpringUtil.getBean(PaymentStatePayFinish.class);
                  } else if (SapoPayment.STATUS_FAIL.equals(status)) {
                      currentState = SpringUtil.getBean(PaymentStateFail.class);
                  } else if (SapoPayment.STATUS_CANCEL.equals(status)) {
                      currentState = SpringUtil.getBean(PaymentStateCancel.class);
                  } else {
                      throw new BusinessException(ResultInfo.SYS_INNER_ERROR.getCode(),
                              "status not in state machine ,status: " + status);
                  }
          
                  this.currentState = currentState;
              }
          
              // TODO 待實現,申請支付訂單
              public void apply() {
                  // 委托給當前狀態執行,將當前訂單狀態機對象傳進去,使用狀態對象處理訂單
                  currentState.apply(this);
              }
          
              // TODO 待實現,通知支付結果
              public void resultNotify() {
                  // 委托給當前狀態執行
                  currentState.resultNotify(this);
              }
          
              // TODO 同步給當前狀態執行
              public void sync() {
                  // 委托給當前狀態執行
                  currentState.sync(this);
              }
          
              // 取消訂單
              public void cancel() {
                  // 委托給當前狀態執行
                  currentState.cancel(this);
              }
          
          
          }


          public  interface PaymentState {
          
              public void apply(PaymentStateMachine paymentStateMachine);
          
              public void resultNotify(PaymentStateMachine paymentStateMachine);
              
              public void sync(PaymentStateMachine paymentStateMachine);
              
              public void cancel(PaymentStateMachine paymentStateMachine);
          
          }
          @Service
          public class PaymentStateApply extends BaseLogger implements PaymentState {
          
              @Autowired
              FmPayClientService fmPayClientService;
          
              @Autowired
              SapoDao dao;
          
              @Autowired
              private JacksonComponent jacksonComponent;
          
              public void apply(PaymentStateMachine paymentStateMachine) {
          
                 
          
              }
          
              public void sync(PaymentStateMachine paymentStateMachine) {
          
              }
          
              public void resultNotify(PaymentStateMachine paymentStateMachine) {
                  // TODO Auto-generated method stub
          
              }
          
              public void cancel(PaymentStateMachine paymentStateMachine) {
                  
                  SapoPayment sapoPaymentForUpdate = paymentStateMachine.getPaymentForUpdate();
                  sapoPaymentForUpdate.setStatus(SapoPayment.STATUS_CANCEL);
                  sapoPaymentForUpdate.setExpireTime(null);
                  
                  paymentStateMachine.updateStateMachine();
                  
                  
          
              }
          
          }
          @Service
          public class PaymentStateCancel extends BaseLogger implements PaymentState {
          
              public void apply(PaymentStateMachine paymentStateMachine) {
                  // TODO Auto-generated method stub
          
              }
          
              public void resultNotify(PaymentStateMachine paymentStateMachine) {
                  // TODO Auto-generated method stub
          
              }
          
              public void sync(PaymentStateMachine paymentStateMachine) {
                  // TODO Auto-generated method stub
          
              }
          
              public void cancel(PaymentStateMachine paymentStateMachine) {
                  // TODO Auto-generated method stub
          
              }
          
          }
          @Service
          public class PaymentStateFail extends BaseLogger implements PaymentState {
          
              public void apply(PaymentStateMachine paymentStateMachine) {
                  // TODO Auto-generated method stub
          
              }
          
              public void resultNotify(PaymentStateMachine paymentStateMachine) {
                  // TODO Auto-generated method stub
          
              }
          
              public void sync(PaymentStateMachine paymentStateMachine) {
                  // TODO Auto-generated method stub
          
              }
          
              public void cancel(PaymentStateMachine paymentStateMachine) {
                  throw new BusinessException(ResultInfo.SYS_INNER_ERROR.getCode(), "fail status can not cancel");
          
              }
          
          }
          @Service
          public class PaymentStatePayFinish extends BaseLogger implements PaymentState {
          
              public void apply(PaymentStateMachine paymentStateMachine) {
                  // TODO Auto-generated method stub
          
              }
          
              public void resultNotify(PaymentStateMachine paymentStateMachine) {
                  // TODO Auto-generated method stub
          
              }
          
              public void sync(PaymentStateMachine paymentStateMachine) {
                  // TODO Auto-generated method stub
          
              }
          
              public void cancel(PaymentStateMachine paymentStateMachine) {
                  throw new BusinessException(ResultInfo.SYS_INNER_ERROR.getCode(), "payfinish status can not cancel");
          
              }
          
          }
          @Service
          public class PaymentStateWaitPay extends BaseLogger implements PaymentState {
          
              @Autowired
              FmPayClientService fmPayClientService;
          
              @Autowired
              SapoDao dao;
          
              @Autowired
              private JacksonComponent jacksonComponent;
          
              public void payResultNotify() {
                  // TODO implement here
              }
          
              public void apply(PaymentStateMachine paymentStateMachine) {
                  throw new BusinessException(ResultInfo.SYS_INNER_ERROR.getCode(),
                          "applyPayPlatform not match payment state machine,currentStatus:"
                                  + paymentStateMachine.getPayment().getStatus());
          
              }
          
              public void sync(PaymentStateMachine paymentStateMachine) {
          
          
                  // TODO 過期去統一支付查詢
          
                  String payStatus = queryPayResultResponse.getPayStatus();
          
                  // 1:初始化輸入 2:支付中 3:支付成功 4:支付失敗 5:撤銷
                  if (QueryPayResultResponse.PAY_STATUS_INIT.equals(payStatus)) {
                      throw new BusinessException(ResultInfo.SYS_INNER_ERROR.getCode(),
                              "FMpay queryPay return init status ,we are waitpay");
                  }
          
                  if (QueryPayResultResponse.PAY_STATUS_ING.equals(payStatus)) {
                      return;
                  }
          
                  SapoPayment sapoPaymentForUpdate = paymentStateMachine.getPaymentForUpdate();
          
                  if (QueryPayResultResponse.PAY_STATUS_CANCEL.equals(payStatus)) {
                      sapoPaymentForUpdate.setStatus(SapoPayment.STATUS_CANCEL);
          
                  } else if (QueryPayResultResponse.PAY_STATUS_FAIL.equals(payStatus)) {
                      sapoPaymentForUpdate.setStatus(SapoPayment.STATUS_FAIL);
          
                  } else if (QueryPayResultResponse.PAY_STATUS_SUCCESS.equals(payStatus)) {
                      sapoPaymentForUpdate.setStatus(SapoPayment.STATUS_PAY_FINISH);
          
                  }
                  sapoPaymentForUpdate.setExpireTime(null);
          
                  paymentStateMachine.updateStateMachine();
          
              }
          
              public void resultNotify(PaymentStateMachine paymentStateMachine) {
                  // TODO Auto-generated method stub
          
              }
          
              public void cancel(PaymentStateMachine paymentStateMachine) {
                  throw new BusinessException(ResultInfo.SYS_INNER_ERROR.getCode(), "wait pay status can not cancel");
          
              }
          
          }

          文章來自https://www.cnblogs.com/wanglifeng717/p/16214122.html


          主站蜘蛛池模板: 视频在线一区二区| 秋霞电影网一区二区三区| 精品无码人妻一区二区三区| 久久一区不卡中文字幕| 国内精品视频一区二区三区八戒 | 精品熟人妻一区二区三区四区不卡| 国产精品一区二区久久| 国产午夜精品一区二区三区嫩草| 日韩aⅴ人妻无码一区二区| 亚洲av无码一区二区三区天堂古代 | 一区二区在线视频| 一区二区在线免费视频| 国产Av一区二区精品久久| 波多野结衣久久一区二区| 91视频一区二区| 亚洲天堂一区二区| 日本午夜精品一区二区三区电影 | 国产乱码精品一区二区三区麻豆| 69福利视频一区二区| 亚洲AV日韩AV天堂一区二区三区| 免费一区二区无码东京热| 综合久久一区二区三区 | 国产一区二区三区不卡AV| 精品免费久久久久国产一区 | 精品国产日韩亚洲一区在线| 亚洲色精品VR一区区三区| 国产成人一区二区三中文| 午夜一区二区免费视频| 国产精品免费综合一区视频| 日韩有码一区二区| 久久精品一区二区影院| 亚洲一区二区三区AV无码| 久久久久女教师免费一区| 久久久久久综合一区中文字幕| 麻豆精品久久久一区二区| 91久久精品国产免费一区| 国产一区二区在线观看| 精品视频一区二区| 亚洲日本一区二区三区在线| 亚洲国产成人一区二区三区| 亚洲一区二区三区免费视频|