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訂單智慧管理系統。其核心目標是通過集成先進的信息技術,簡化業務流程,提升運營效率,降低管理成本,同時提供全方位的客戶服務支持。
在當今數字化時代,企業間的競爭已從產品和價格轉向服務和體驗。對于訂單管理,企業不僅需要處理大量的日常交易,還需要實時跟蹤訂單狀態,有效管理庫存,快速響應客戶查詢,以及生成準確的財務報表。然而,傳統系統往往過于復雜,操作繁瑣,難以適應這種變化。
SSM訂單智慧管理系統正是為解決這一問題而設計。它以用戶友好和易用性為核心,將多個關鍵業務環節如訂單創建、處理、發貨、支付、發票開具等整合在一個平臺上,實現了信息的無縫流轉和共享。此外,強大的數據分析功能可以幫助企業進行精細化運營,通過對歷史數據的深入挖掘,預測銷售趨勢,制定更有效的營銷策略。
在支持中心模塊,我們提供了詳細的操作指南和常見問題解答,確保用戶能夠快速上手并解決問題。財務報表管理模塊則能自動生成精確的報表,幫助企業做出明智的決策。無論是內部運營管理還是外部客戶服務,SSM都力求為用戶提供一站式的解決方案。
總之,SSM訂單智慧管理系統旨在通過技術創新,幫助企業提升競爭力,實現數字化轉型,從而在激烈的市場競爭中立于不敗之地。
SSM訂單智慧管理系統是一款專為電商、零售和服務業設計的全面解決方案,它旨在幫助企業提升運營效率,優化客戶服務,并實現數據驅動的決策。以下是該軟件的應用場景和目標用戶的描述:
1. 在日常運營中,幫助企業管理員工快速響應客戶需求,通過幫助中心提供即時解答,節省大量客服時間。
2. 財務報表管理模塊可以幫助財務人員實時跟蹤收入和支出,以便進行有效的成本控制和預算規劃。
3. 訂單管理模塊能自動化處理訂單流程,從接收到發貨全程跟蹤,降低出錯率,提高客戶滿意度。
4. 通過庫存管理和商品管理,企業能夠實時了解銷售情況,避免斷貨或過度庫存的風險。
- 中小型電商平臺和零售商,他們需要一個集成的平臺來簡化操作流程,提升工作效率。
- 需要高效管理訂單、財務、庫存的零售企業,特別是那些面臨快速擴張或頻繁促銷活動的企業。
- 對數據可視化和分析有需求的企業,他們可以利用統計分析功能進行業務洞察和策略調整。
- 服務型企業,如餐飲、美容院等,可通過系統管理客戶信息,提供個性化的服務體驗。
這款軟件的目標用戶是尋求數字化轉型,希望通過技術驅動業務增長,提升客戶體驗并降低成本的企業決策者和技術團隊。無論是新手還是經驗豐富的用戶,SSM訂單智慧管理系統都能提供直觀易用的界面和強大功能支持。
ssm訂單智慧管理系統是一款高效整合的商業智能工具,專為現代企業打造,主要利用Java編程語言和SpringMVC開發框架構建而成,數據庫采用業界廣泛認可的MySQL。該系統集成了多種關鍵業務模塊,旨在提升企業的運營效率和管理水平。
1. 幫助中心:提供詳盡的操作指南和常見問題解答,讓用戶快速上手和解決問題。
2. 財務報表管理:生成各種財務報告,如收入、支出、利潤等,幫助管理者實時掌握財務狀況。
3. 訂單管理:實時跟蹤訂單狀態,包括創建、處理、發貨和退款等全過程,確保流程透明。
4. 發票管理:自動化發票開具與管理,簡化發票流程,降低出錯風險。
5. 活動管理:支持促銷活動策劃與執行,幫助企業提高銷售轉化率。
6. 積分管理:設計激勵體系,通過積分制度增強用戶黏性。
7. 技術支持:為用戶提供專業的技術咨詢與維護服務,確保系統的穩定運行。
8. 客服管理:集成客戶關系管理系統,便于團隊協作處理客戶咨詢與投訴。
9. 庫存管理:實時監控庫存水平,預警低庫存,防止斷貨風險。
10. 商品管理:方便添加、編輯和刪除商品信息,維護商品目錄。
11. 收貨地址管理:便捷管理用戶的收貨地址,提高配送效率。
12. 統計分析:提供數據可視化圖表,幫助企業洞察業務趨勢,做出數據驅動的決策。
13. 推廣管理:支持多渠道營銷活動,優化營銷策略。
14. 退款管理:清晰的退款流程,減少糾紛,提升用戶滿意度。
15. 物流管理:無縫對接第三方物流公司,實時更新物流信息。
16. 消息管理:集成推送通知,確保重要信息不被遺漏。
17. 用戶管理:全面管理用戶賬戶,權限設置靈活。
18. 優惠券管理:支持多種類型的優惠券發放,促進消費。
總之,ssm訂單智慧管理系統是一款全方位的企業管理解決方案,通過集成化的功能設計,旨在簡化復雜業務操作,實現業務流程的自動化,助力企業實現數字化轉型和高效運營。
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訂單智慧管理系統的架構設計旨在提供一個高效、穩定、可擴展的平臺,以滿足企業對訂單管理、財務管理等多方面的自動化需求。
在瀏覽器中輸入系統網址,打開登錄界面后輸入登錄賬號、登錄密碼、驗證碼即可登錄。
工作臺包含:幫助中心、財務報表管理、訂單管理、發票管理、活動管理、積分管理、技術支持、客服管理、庫存管理、商品管理、收貨地址管理、統計分析、推廣管理、退款管理、物流管理、消息管理、用戶管理、優惠券管理,根據不同角色權限菜單展示會有所區別。
幫助中心管理功能主要字段信息包含:編碼、問題ID、問題標題、問題描述、問題解答、問題類型、熱門問題等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進行幫助中心信息的管理。
幫助中心管理設置新增、編輯、刪除、條件搜索、查看詳情等操作,可按照頁面提示進行操作執行,界面結構設計簡單,操作流程簡潔明了,可提升用戶操作體驗。
管理管理功能主要字段信息包含:管理編碼、報表ID、報表名稱、報表類型、報表時間、報表狀態、報表內容等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進行管理信息的管理。
系統為管理管理提供了全面支持,包括新增記錄、編輯信息、刪除條目、數據導出、條件檢索及詳情查看等功能。用戶只需遵循頁面清晰的操作指引,即可輕松完成各項任務。界面設計遵循極簡原則,布局直觀,交互流暢,旨在營造無負擔的操作環境,顯著提升用戶的使用體驗與工作效率。
管理管理功能主要字段信息包含:管理編碼、訂單號、訂單時間、訂單金額、收貨人、收貨地址、聯系電話等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進行管理信息的管理。
針對管理管理,系統精心設置了全方位功能模塊,涵蓋新增、編輯、刪除、導出、條件檢索以及查看詳情等核心操作。用戶在使用過程中,僅需緊密跟隨頁面內直觀且詳盡的操作提示,即可輕松駕馭各項流程。我們秉持化繁為簡的理念,打造出簡約明快的界面風格與邏輯清晰的操作流程,旨在讓用戶在高效管理數據,享受到愉悅、無壓力的操作體驗。
管理管理功能主要字段信息包含:管理編碼、訂單號、發票抬頭、開票金額、開票時間、開票狀態等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進行管理信息的管理。
為實現對管理管理,系統精心配備了豐富的功能組件,包括新增、編輯、刪除、導出、條件搜以及詳情查看等實用操作。用戶在操作過程中,只需遵循頁面上清晰易懂的引導提示,即可順暢地完成各項任務。我們注重用戶體驗,以簡約而不失專業的界面設計,輔以直觀且高效的流程布局,旨在助力用戶在輕松管理數據同時,全面提升操作滿意度與工作效率。
管理管理功能主要字段信息包含:管理編碼、活動ID、活動名稱、活動時間、活動描述、參與條件、活動獎品等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進行管理信息的管理。
為滿足管理管理的多元需求,系統配置了一系列操作功能:新增、編輯、刪除、導出、搜索、詳情。用戶在實際操作中,僅需按照頁面上直觀且詳盡的操作提示,即可輕松駕馭各項流程。系統界面設計簡約清爽,操作邏輯清晰明了,旨在讓用戶在高效管理數據的同時,盡享流暢、無壓力的操作體驗,大幅提升工作效率與滿意度。
管理管理功能主要字段信息包含:管理編碼、用戶ID、積分來源、積分值、積分變動時間、積分使用記錄等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進行管理信息的管理。
管理管理設置新增、編輯、刪除、條件搜索、查看詳情等操作,可按照頁面提示進行操作執行,界面結構設計簡單,操作流程簡潔明了,可提升用戶操作體驗。
技術支持管理功能主要字段信息包含:編碼、技術支持ID、技術支持名稱、技術支持郵箱、技術支持電話、技術支持狀態等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進行技術支持信息的管理。
系統為技術支持管理提供了全面支持,包括新增記錄、編輯信息、刪除條目、數據導出、條件檢索及詳情查看等功能。用戶只需遵循頁面清晰的操作指引,即可輕松完成各項任務。界面設計遵循極簡原則,布局直觀,交互流暢,旨在營造無負擔的操作環境,顯著提升用戶的使用體驗與工作效率。
管理管理功能主要字段信息包含:管理編碼、客服ID、客服姓名、客服電話、客服郵箱、客服狀態等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進行管理信息的管理。
針對管理管理,系統精心設置了全方位功能模塊,涵蓋新增、編輯、刪除、導出、條件檢索以及查看詳情等核心操作。用戶在使用過程中,僅需緊密跟隨頁面內直觀且詳盡的操作提示,即可輕松駕馭各項流程。我們秉持化繁為簡的理念,打造出簡約明快的界面風格與邏輯清晰的操作流程,旨在讓用戶在高效管理數據,享受到愉悅、無壓力的操作體驗。
管理管理功能主要字段信息包含:管理編碼、商品ID、進貨單號、進貨時間、進貨數量、進貨單價、庫存數量等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進行管理信息的管理。
為實現對管理管理,系統精心配備了豐富的功能組件,包括新增、編輯、刪除、導出、條件搜以及詳情查看等實用操作。用戶在操作過程中,只需遵循頁面上清晰易懂的引導提示,即可順暢地完成各項任務。我們注重用戶體驗,以簡約而不失專業的界面設計,輔以直觀且高效的流程布局,旨在助力用戶在輕松管理數據同時,全面提升操作滿意度與工作效率。
管理管理功能主要字段信息包含:管理編碼、商品ID、商品名稱、商品圖片、商品描述、商品價格、庫存量等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進行管理信息的管理。
為滿足管理管理的多元需求,系統配置了一系列操作功能:新增、編輯、刪除、導出、搜索、詳情。用戶在實際操作中,僅需按照頁面上直觀且詳盡的操作提示,即可輕松駕馭各項流程。系統界面設計簡約清爽,操作邏輯清晰明了,旨在讓用戶在高效管理數據的同時,盡享流暢、無壓力的操作體驗,大幅提升工作效率與滿意度。
管理管理功能主要字段信息包含:管理編碼、用戶ID、收貨人、收貨地址、聯系電話、是否默認地址等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進行管理信息的管理。
管理管理設置新增、編輯、刪除、條件搜索、查看詳情等操作,可按照頁面提示進行操作執行,界面結構設計簡單,操作流程簡潔明了,可提升用戶操作體驗。
統計分析管理功能主要字段信息包含:編碼、訂單量、銷售額、用戶量、用戶留存率、商品銷售排行榜等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進行統計分析信息的管理。
系統為統計分析管理提供了全面支持,包括新增記錄、編輯信息、刪除條目、數據導出、條件檢索及詳情查看等功能。用戶只需遵循頁面清晰的操作指引,即可輕松完成各項任務。界面設計遵循極簡原則,布局直觀,交互流暢,旨在營造無負擔的操作環境,顯著提升用戶的使用體驗與工作效率。
管理管理功能主要字段信息包含:管理編碼、推廣ID、推廣渠道、推廣鏈接、注冊量、下單量、成交金額等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進行管理信息的管理。
針對管理管理,系統精心設置了全方位功能模塊,涵蓋新增、編輯、刪除、導出、條件檢索以及查看詳情等核心操作。用戶在使用過程中,僅需緊密跟隨頁面內直觀且詳盡的操作提示,即可輕松駕馭各項流程。我們秉持化繁為簡的理念,打造出簡約明快的界面風格與邏輯清晰的操作流程,旨在讓用戶在高效管理數據,享受到愉悅、無壓力的操作體驗。
管理管理功能主要字段信息包含:管理編碼、訂單號、退款原因、退款金額、退款時間、退款狀態、退款處理人員等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進行管理信息的管理。
為實現對管理管理,系統精心配備了豐富的功能組件,包括新增、編輯、刪除、導出、條件搜以及詳情查看等實用操作。用戶在操作過程中,只需遵循頁面上清晰易懂的引導提示,即可順暢地完成各項任務。我們注重用戶體驗,以簡約而不失專業的界面設計,輔以直觀且高效的流程布局,旨在助力用戶在輕松管理數據同時,全面提升操作滿意度與工作效率。
管理管理功能主要字段信息包含:管理編碼、物流公司、物流單號、運費、發貨時間、收貨時間、發貨地址、收貨地址等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進行管理信息的管理。
為滿足管理管理的多元需求,系統配置了一系列操作功能:新增、編輯、刪除、導出、搜索、詳情。用戶在實際操作中,僅需按照頁面上直觀且詳盡的操作提示,即可輕松駕馭各項流程。系統界面設計簡約清爽,操作邏輯清晰明了,旨在讓用戶在高效管理數據的同時,盡享流暢、無壓力的操作體驗,大幅提升工作效率與滿意度。
管理管理功能主要字段信息包含:管理編碼、消息ID、消息類型、消息內容、接收者、發送時間、消息狀態等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進行管理信息的管理。
管理管理設置新增、編輯、刪除、條件搜索、查看詳情等操作,可按照頁面提示進行操作執行,界面結構設計簡單,操作流程簡潔明了,可提升用戶操作體驗。
管理管理功能主要字段信息包含:管理編碼、用戶ID、用戶名、密碼、角色、郵箱、電話、狀態等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進行管理信息的管理。
系統為管理管理提供了全面支持,包括新增記錄、編輯信息、刪除條目、數據導出、條件檢索及詳情查看等功能。用戶只需遵循頁面清晰的操作指引,即可輕松完成各項任務。界面設計遵循極簡原則,布局直觀,交互流暢,旨在營造無負擔的操作環境,顯著提升用戶的使用體驗與工作效率。
管理管理功能主要字段信息包含:管理編碼、優惠券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語句。
升級策略:
【封裝變化】,局部化每個狀態的行為,將每個狀態的行為放到各自類中,每個狀態只要實現自己的動作就可以了。
販賣機只要將動作委托給代表當前狀態的狀態對象即可。
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.策略模式聚焦的是互換的算法來創建業務。
狀態機典型應用:訂單狀態控制
建表語句
如上圖所示:
一種典型的訂單設計。業務訂單和支付退款訂單組合,他們分別有自己的狀態機。
狀態機模式實現訂單狀態機:
日常開發過程中,狀態機模式應用場景之一的就是訂單模型中的狀態控制。但是區別于狀態模式的點有以下幾個:
以支付訂單為例:
/*
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
*請認真填寫需求信息,我們會在24小時內與您取得聯系。