隨著電子商務(wù)的快速發(fā)展,企業(yè)對訂單管理的需求日益增長,傳統(tǒng)的手動操作方式已經(jīng)無法滿足現(xiàn)代化企業(yè)高效、精準(zhǔn)、智能的運營需求。為此,我們推出了這款專為中小型企業(yè)量身打造的SSM訂單智慧管理系統(tǒng)。其核心目標(biāo)是通過集成先進(jìn)的信息技術(shù),簡化業(yè)務(wù)流程,提升運營效率,降低管理成本,同時提供全方位的客戶服務(wù)支持。
在當(dāng)今數(shù)字化時代,企業(yè)間的競爭已從產(chǎn)品和價格轉(zhuǎn)向服務(wù)和體驗。對于訂單管理,企業(yè)不僅需要處理大量的日常交易,還需要實時跟蹤訂單狀態(tài),有效管理庫存,快速響應(yīng)客戶查詢,以及生成準(zhǔn)確的財務(wù)報表。然而,傳統(tǒng)系統(tǒng)往往過于復(fù)雜,操作繁瑣,難以適應(yīng)這種變化。
SSM訂單智慧管理系統(tǒng)正是為解決這一問題而設(shè)計。它以用戶友好和易用性為核心,將多個關(guān)鍵業(yè)務(wù)環(huán)節(jié)如訂單創(chuàng)建、處理、發(fā)貨、支付、發(fā)票開具等整合在一個平臺上,實現(xiàn)了信息的無縫流轉(zhuǎn)和共享。此外,強大的數(shù)據(jù)分析功能可以幫助企業(yè)進(jìn)行精細(xì)化運營,通過對歷史數(shù)據(jù)的深入挖掘,預(yù)測銷售趨勢,制定更有效的營銷策略。
在支持中心模塊,我們提供了詳細(xì)的操作指南和常見問題解答,確保用戶能夠快速上手并解決問題。財務(wù)報表管理模塊則能自動生成精確的報表,幫助企業(yè)做出明智的決策。無論是內(nèi)部運營管理還是外部客戶服務(wù),SSM都力求為用戶提供一站式的解決方案。
總之,SSM訂單智慧管理系統(tǒng)旨在通過技術(shù)創(chuàng)新,幫助企業(yè)提升競爭力,實現(xiàn)數(shù)字化轉(zhuǎn)型,從而在激烈的市場競爭中立于不敗之地。
SSM訂單智慧管理系統(tǒng)是一款專為電商、零售和服務(wù)業(yè)設(shè)計的全面解決方案,它旨在幫助企業(yè)提升運營效率,優(yōu)化客戶服務(wù),并實現(xiàn)數(shù)據(jù)驅(qū)動的決策。以下是該軟件的應(yīng)用場景和目標(biāo)用戶的描述:
1. 在日常運營中,幫助企業(yè)管理員工快速響應(yīng)客戶需求,通過幫助中心提供即時解答,節(jié)省大量客服時間。
2. 財務(wù)報表管理模塊可以幫助財務(wù)人員實時跟蹤收入和支出,以便進(jìn)行有效的成本控制和預(yù)算規(guī)劃。
3. 訂單管理模塊能自動化處理訂單流程,從接收到發(fā)貨全程跟蹤,降低出錯率,提高客戶滿意度。
4. 通過庫存管理和商品管理,企業(yè)能夠?qū)崟r了解銷售情況,避免斷貨或過度庫存的風(fēng)險。
- 中小型電商平臺和零售商,他們需要一個集成的平臺來簡化操作流程,提升工作效率。
- 需要高效管理訂單、財務(wù)、庫存的零售企業(yè),特別是那些面臨快速擴張或頻繁促銷活動的企業(yè)。
- 對數(shù)據(jù)可視化和分析有需求的企業(yè),他們可以利用統(tǒng)計分析功能進(jìn)行業(yè)務(wù)洞察和策略調(diào)整。
- 服務(wù)型企業(yè),如餐飲、美容院等,可通過系統(tǒng)管理客戶信息,提供個性化的服務(wù)體驗。
這款軟件的目標(biāo)用戶是尋求數(shù)字化轉(zhuǎn)型,希望通過技術(shù)驅(qū)動業(yè)務(wù)增長,提升客戶體驗并降低成本的企業(yè)決策者和技術(shù)團(tuán)隊。無論是新手還是經(jīng)驗豐富的用戶,SSM訂單智慧管理系統(tǒng)都能提供直觀易用的界面和強大功能支持。
ssm訂單智慧管理系統(tǒng)是一款高效整合的商業(yè)智能工具,專為現(xiàn)代企業(yè)打造,主要利用Java編程語言和SpringMVC開發(fā)框架構(gòu)建而成,數(shù)據(jù)庫采用業(yè)界廣泛認(rèn)可的MySQL。該系統(tǒng)集成了多種關(guān)鍵業(yè)務(wù)模塊,旨在提升企業(yè)的運營效率和管理水平。
1. 幫助中心:提供詳盡的操作指南和常見問題解答,讓用戶快速上手和解決問題。
2. 財務(wù)報表管理:生成各種財務(wù)報告,如收入、支出、利潤等,幫助管理者實時掌握財務(wù)狀況。
3. 訂單管理:實時跟蹤訂單狀態(tài),包括創(chuàng)建、處理、發(fā)貨和退款等全過程,確保流程透明。
4. 發(fā)票管理:自動化發(fā)票開具與管理,簡化發(fā)票流程,降低出錯風(fēng)險。
5. 活動管理:支持促銷活動策劃與執(zhí)行,幫助企業(yè)提高銷售轉(zhuǎn)化率。
6. 積分管理:設(shè)計激勵體系,通過積分制度增強用戶黏性。
7. 技術(shù)支持:為用戶提供專業(yè)的技術(shù)咨詢與維護(hù)服務(wù),確保系統(tǒng)的穩(wěn)定運行。
8. 客服管理:集成客戶關(guān)系管理系統(tǒng),便于團(tuán)隊協(xié)作處理客戶咨詢與投訴。
9. 庫存管理:實時監(jiān)控庫存水平,預(yù)警低庫存,防止斷貨風(fēng)險。
10. 商品管理:方便添加、編輯和刪除商品信息,維護(hù)商品目錄。
11. 收貨地址管理:便捷管理用戶的收貨地址,提高配送效率。
12. 統(tǒng)計分析:提供數(shù)據(jù)可視化圖表,幫助企業(yè)洞察業(yè)務(wù)趨勢,做出數(shù)據(jù)驅(qū)動的決策。
13. 推廣管理:支持多渠道營銷活動,優(yōu)化營銷策略。
14. 退款管理:清晰的退款流程,減少糾紛,提升用戶滿意度。
15. 物流管理:無縫對接第三方物流公司,實時更新物流信息。
16. 消息管理:集成推送通知,確保重要信息不被遺漏。
17. 用戶管理:全面管理用戶賬戶,權(quán)限設(shè)置靈活。
18. 優(yōu)惠券管理:支持多種類型的優(yōu)惠券發(fā)放,促進(jìn)消費。
總之,ssm訂單智慧管理系統(tǒng)是一款全方位的企業(yè)管理解決方案,通過集成化的功能設(shè)計,旨在簡化復(fù)雜業(yè)務(wù)操作,實現(xiàn)業(yè)務(wù)流程的自動化,助力企業(yè)實現(xiàn)數(shù)字化轉(zhuǎn)型和高效運營。
SSM訂單智慧管理系統(tǒng)是一款基于Java+Spring MVC的B/S架構(gòu)的全面企業(yè)管理軟件。該架構(gòu)設(shè)計的核心思想是將業(yè)務(wù)邏輯與表示層分離,以提高代碼復(fù)用性和系統(tǒng)的可維護(hù)性。
1. 前端界面(B/S):采用瀏覽器/服務(wù)器模式,用戶通過Web瀏覽器訪問,無需安裝任何客戶端軟件。前端使用HTML、CSS和JavaScript技術(shù)構(gòu)建,提供直觀、用戶友好的圖形用戶界面,展示各種功能模塊,如訂單、發(fā)票、庫存等信息。
2. Spring MVC:作為核心框架,Spring MVC實現(xiàn)了模型-視圖-控制器(Model-View-Controller,MVC)的設(shè)計模式。控制器處理用戶的請求,調(diào)用服務(wù)層的業(yè)務(wù)邏輯,視圖負(fù)責(zé)數(shù)據(jù)的呈現(xiàn),模型則存儲和管理數(shù)據(jù)。這種設(shè)計使代碼結(jié)構(gòu)清晰,易于理解和擴展。
3. Java后端:選用Java語言,因其強大的面向?qū)ο筇匦院拓S富的庫支持。Java后臺處理復(fù)雜的業(yè)務(wù)邏輯,調(diào)用持久層(DAO)操作數(shù)據(jù)庫,實現(xiàn)數(shù)據(jù)的增刪改查和事務(wù)管理。
4. 持久層(DAO)與數(shù)據(jù)訪問(JPA):通常使用Java Persistence API (JPA) 或 Hibernate等ORM工具,與關(guān)系型數(shù)據(jù)庫(如MySQL、Oracle)進(jìn)行交互,提供數(shù)據(jù)的持久化和事務(wù)支持。
5. 服務(wù)層(Service):作為業(yè)務(wù)邏輯的處理中心,封裝和抽象了底層數(shù)據(jù)訪問層,提供對外的接口,使得代碼更加模塊化,便于單元測試和維護(hù)。
6. 分布式組件:考慮到系統(tǒng)的擴展性和高可用性,可能涉及分布式緩存(Redis)、消息隊列(RabbitMQ)、負(fù)載均衡(Nginx)等,以實現(xiàn)異步處理、數(shù)據(jù)分發(fā)等功能。
7. 安全性:通過Spring Security進(jìn)行權(quán)限管理和身份驗證,確保敏感數(shù)據(jù)的安全。同時,采用HTTPS加密通信,保護(hù)數(shù)據(jù)傳輸過程中的隱私。
8. 統(tǒng)計分析與報告:系統(tǒng)內(nèi)置的數(shù)據(jù)分析模塊,能生成各種報表,幫助企業(yè)管理人員做出決策。
綜上所述,SSM訂單智慧管理系統(tǒng)的架構(gòu)設(shè)計旨在提供一個高效、穩(wěn)定、可擴展的平臺,以滿足企業(yè)對訂單管理、財務(wù)管理等多方面的自動化需求。
在瀏覽器中輸入系統(tǒng)網(wǎng)址,打開登錄界面后輸入登錄賬號、登錄密碼、驗證碼即可登錄。
工作臺包含:幫助中心、財務(wù)報表管理、訂單管理、發(fā)票管理、活動管理、積分管理、技術(shù)支持、客服管理、庫存管理、商品管理、收貨地址管理、統(tǒng)計分析、推廣管理、退款管理、物流管理、消息管理、用戶管理、優(yōu)惠券管理,根據(jù)不同角色權(quán)限菜單展示會有所區(qū)別。
幫助中心管理功能主要字段信息包含:編碼、問題ID、問題標(biāo)題、問題描述、問題解答、問題類型、熱門問題等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進(jìn)行幫助中心信息的管理。
幫助中心管理設(shè)置新增、編輯、刪除、條件搜索、查看詳情等操作,可按照頁面提示進(jìn)行操作執(zhí)行,界面結(jié)構(gòu)設(shè)計簡單,操作流程簡潔明了,可提升用戶操作體驗。
管理管理功能主要字段信息包含:管理編碼、報表ID、報表名稱、報表類型、報表時間、報表狀態(tài)、報表內(nèi)容等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進(jìn)行管理信息的管理。
系統(tǒng)為管理管理提供了全面支持,包括新增記錄、編輯信息、刪除條目、數(shù)據(jù)導(dǎo)出、條件檢索及詳情查看等功能。用戶只需遵循頁面清晰的操作指引,即可輕松完成各項任務(wù)。界面設(shè)計遵循極簡原則,布局直觀,交互流暢,旨在營造無負(fù)擔(dān)的操作環(huán)境,顯著提升用戶的使用體驗與工作效率。
管理管理功能主要字段信息包含:管理編碼、訂單號、訂單時間、訂單金額、收貨人、收貨地址、聯(lián)系電話等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進(jìn)行管理信息的管理。
針對管理管理,系統(tǒng)精心設(shè)置了全方位功能模塊,涵蓋新增、編輯、刪除、導(dǎo)出、條件檢索以及查看詳情等核心操作。用戶在使用過程中,僅需緊密跟隨頁面內(nèi)直觀且詳盡的操作提示,即可輕松駕馭各項流程。我們秉持化繁為簡的理念,打造出簡約明快的界面風(fēng)格與邏輯清晰的操作流程,旨在讓用戶在高效管理數(shù)據(jù),享受到愉悅、無壓力的操作體驗。
管理管理功能主要字段信息包含:管理編碼、訂單號、發(fā)票抬頭、開票金額、開票時間、開票狀態(tài)等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進(jìn)行管理信息的管理。
為實現(xiàn)對管理管理,系統(tǒng)精心配備了豐富的功能組件,包括新增、編輯、刪除、導(dǎo)出、條件搜以及詳情查看等實用操作。用戶在操作過程中,只需遵循頁面上清晰易懂的引導(dǎo)提示,即可順暢地完成各項任務(wù)。我們注重用戶體驗,以簡約而不失專業(yè)的界面設(shè)計,輔以直觀且高效的流程布局,旨在助力用戶在輕松管理數(shù)據(jù)同時,全面提升操作滿意度與工作效率。
管理管理功能主要字段信息包含:管理編碼、活動ID、活動名稱、活動時間、活動描述、參與條件、活動獎品等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進(jìn)行管理信息的管理。
為滿足管理管理的多元需求,系統(tǒng)配置了一系列操作功能:新增、編輯、刪除、導(dǎo)出、搜索、詳情。用戶在實際操作中,僅需按照頁面上直觀且詳盡的操作提示,即可輕松駕馭各項流程。系統(tǒng)界面設(shè)計簡約清爽,操作邏輯清晰明了,旨在讓用戶在高效管理數(shù)據(jù)的同時,盡享流暢、無壓力的操作體驗,大幅提升工作效率與滿意度。
管理管理功能主要字段信息包含:管理編碼、用戶ID、積分來源、積分值、積分變動時間、積分使用記錄等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進(jìn)行管理信息的管理。
管理管理設(shè)置新增、編輯、刪除、條件搜索、查看詳情等操作,可按照頁面提示進(jìn)行操作執(zhí)行,界面結(jié)構(gòu)設(shè)計簡單,操作流程簡潔明了,可提升用戶操作體驗。
技術(shù)支持管理功能主要字段信息包含:編碼、技術(shù)支持ID、技術(shù)支持名稱、技術(shù)支持郵箱、技術(shù)支持電話、技術(shù)支持狀態(tài)等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進(jìn)行技術(shù)支持信息的管理。
系統(tǒng)為技術(shù)支持管理提供了全面支持,包括新增記錄、編輯信息、刪除條目、數(shù)據(jù)導(dǎo)出、條件檢索及詳情查看等功能。用戶只需遵循頁面清晰的操作指引,即可輕松完成各項任務(wù)。界面設(shè)計遵循極簡原則,布局直觀,交互流暢,旨在營造無負(fù)擔(dān)的操作環(huán)境,顯著提升用戶的使用體驗與工作效率。
管理管理功能主要字段信息包含:管理編碼、客服ID、客服姓名、客服電話、客服郵箱、客服狀態(tài)等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進(jìn)行管理信息的管理。
針對管理管理,系統(tǒng)精心設(shè)置了全方位功能模塊,涵蓋新增、編輯、刪除、導(dǎo)出、條件檢索以及查看詳情等核心操作。用戶在使用過程中,僅需緊密跟隨頁面內(nèi)直觀且詳盡的操作提示,即可輕松駕馭各項流程。我們秉持化繁為簡的理念,打造出簡約明快的界面風(fēng)格與邏輯清晰的操作流程,旨在讓用戶在高效管理數(shù)據(jù),享受到愉悅、無壓力的操作體驗。
管理管理功能主要字段信息包含:管理編碼、商品ID、進(jìn)貨單號、進(jìn)貨時間、進(jìn)貨數(shù)量、進(jìn)貨單價、庫存數(shù)量等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進(jìn)行管理信息的管理。
為實現(xiàn)對管理管理,系統(tǒng)精心配備了豐富的功能組件,包括新增、編輯、刪除、導(dǎo)出、條件搜以及詳情查看等實用操作。用戶在操作過程中,只需遵循頁面上清晰易懂的引導(dǎo)提示,即可順暢地完成各項任務(wù)。我們注重用戶體驗,以簡約而不失專業(yè)的界面設(shè)計,輔以直觀且高效的流程布局,旨在助力用戶在輕松管理數(shù)據(jù)同時,全面提升操作滿意度與工作效率。
管理管理功能主要字段信息包含:管理編碼、商品ID、商品名稱、商品圖片、商品描述、商品價格、庫存量等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進(jìn)行管理信息的管理。
為滿足管理管理的多元需求,系統(tǒng)配置了一系列操作功能:新增、編輯、刪除、導(dǎo)出、搜索、詳情。用戶在實際操作中,僅需按照頁面上直觀且詳盡的操作提示,即可輕松駕馭各項流程。系統(tǒng)界面設(shè)計簡約清爽,操作邏輯清晰明了,旨在讓用戶在高效管理數(shù)據(jù)的同時,盡享流暢、無壓力的操作體驗,大幅提升工作效率與滿意度。
管理管理功能主要字段信息包含:管理編碼、用戶ID、收貨人、收貨地址、聯(lián)系電話、是否默認(rèn)地址等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進(jìn)行管理信息的管理。
管理管理設(shè)置新增、編輯、刪除、條件搜索、查看詳情等操作,可按照頁面提示進(jìn)行操作執(zhí)行,界面結(jié)構(gòu)設(shè)計簡單,操作流程簡潔明了,可提升用戶操作體驗。
統(tǒng)計分析管理功能主要字段信息包含:編碼、訂單量、銷售額、用戶量、用戶留存率、商品銷售排行榜等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進(jìn)行統(tǒng)計分析信息的管理。
系統(tǒng)為統(tǒng)計分析管理提供了全面支持,包括新增記錄、編輯信息、刪除條目、數(shù)據(jù)導(dǎo)出、條件檢索及詳情查看等功能。用戶只需遵循頁面清晰的操作指引,即可輕松完成各項任務(wù)。界面設(shè)計遵循極簡原則,布局直觀,交互流暢,旨在營造無負(fù)擔(dān)的操作環(huán)境,顯著提升用戶的使用體驗與工作效率。
管理管理功能主要字段信息包含:管理編碼、推廣ID、推廣渠道、推廣鏈接、注冊量、下單量、成交金額等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進(jìn)行管理信息的管理。
針對管理管理,系統(tǒng)精心設(shè)置了全方位功能模塊,涵蓋新增、編輯、刪除、導(dǎo)出、條件檢索以及查看詳情等核心操作。用戶在使用過程中,僅需緊密跟隨頁面內(nèi)直觀且詳盡的操作提示,即可輕松駕馭各項流程。我們秉持化繁為簡的理念,打造出簡約明快的界面風(fēng)格與邏輯清晰的操作流程,旨在讓用戶在高效管理數(shù)據(jù),享受到愉悅、無壓力的操作體驗。
管理管理功能主要字段信息包含:管理編碼、訂單號、退款原因、退款金額、退款時間、退款狀態(tài)、退款處理人員等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進(jìn)行管理信息的管理。
為實現(xiàn)對管理管理,系統(tǒng)精心配備了豐富的功能組件,包括新增、編輯、刪除、導(dǎo)出、條件搜以及詳情查看等實用操作。用戶在操作過程中,只需遵循頁面上清晰易懂的引導(dǎo)提示,即可順暢地完成各項任務(wù)。我們注重用戶體驗,以簡約而不失專業(yè)的界面設(shè)計,輔以直觀且高效的流程布局,旨在助力用戶在輕松管理數(shù)據(jù)同時,全面提升操作滿意度與工作效率。
管理管理功能主要字段信息包含:管理編碼、物流公司、物流單號、運費、發(fā)貨時間、收貨時間、發(fā)貨地址、收貨地址等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進(jìn)行管理信息的管理。
為滿足管理管理的多元需求,系統(tǒng)配置了一系列操作功能:新增、編輯、刪除、導(dǎo)出、搜索、詳情。用戶在實際操作中,僅需按照頁面上直觀且詳盡的操作提示,即可輕松駕馭各項流程。系統(tǒng)界面設(shè)計簡約清爽,操作邏輯清晰明了,旨在讓用戶在高效管理數(shù)據(jù)的同時,盡享流暢、無壓力的操作體驗,大幅提升工作效率與滿意度。
管理管理功能主要字段信息包含:管理編碼、消息ID、消息類型、消息內(nèi)容、接收者、發(fā)送時間、消息狀態(tài)等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進(jìn)行管理信息的管理。
管理管理設(shè)置新增、編輯、刪除、條件搜索、查看詳情等操作,可按照頁面提示進(jìn)行操作執(zhí)行,界面結(jié)構(gòu)設(shè)計簡單,操作流程簡潔明了,可提升用戶操作體驗。
管理管理功能主要字段信息包含:管理編碼、用戶ID、用戶名、密碼、角色、郵箱、電話、狀態(tài)等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進(jìn)行管理信息的管理。
系統(tǒng)為管理管理提供了全面支持,包括新增記錄、編輯信息、刪除條目、數(shù)據(jù)導(dǎo)出、條件檢索及詳情查看等功能。用戶只需遵循頁面清晰的操作指引,即可輕松完成各項任務(wù)。界面設(shè)計遵循極簡原則,布局直觀,交互流暢,旨在營造無負(fù)擔(dān)的操作環(huán)境,顯著提升用戶的使用體驗與工作效率。
管理管理功能主要字段信息包含:管理編碼、優(yōu)惠券ID、優(yōu)惠券名稱、優(yōu)惠方式、使用條件、使用時間、使用范圍、發(fā)放數(shù)量等。使用表格形式展示這些信息,方便用戶查看和編輯,方便用戶進(jìn)行管理信息的管理。
針對管理管理,系統(tǒng)精心設(shè)置了全方位功能模塊,涵蓋新增、編輯、刪除、導(dǎo)出、條件檢索以及查看詳情等核心操作。用戶在使用過程中,僅需緊密跟隨頁面內(nèi)直觀且詳盡的操作提示,即可輕松駕馭各項流程。我們秉持化繁為簡的理念,打造出簡約明快的界面風(fēng)格與邏輯清晰的操作流程,旨在讓用戶在高效管理數(shù)據(jù),享受到愉悅、無壓力的操作體驗。
系統(tǒng)支持唯一登錄,一個賬號同時只能由一人使用。信息展示順序如果特殊說明,按照排序索引值從大到小進(jìn)行排序。數(shù)據(jù)刪除之后,其關(guān)聯(lián)的數(shù)據(jù)將不可用使用,或無法正常顯示。內(nèi)容狀態(tài)一般為正常時,表示數(shù)據(jù)可正常使用操作,如果為異常或者未審核,則表示在關(guān)聯(lián)數(shù)據(jù)調(diào)用時,不會顯示。
態(tài)機簡介:
狀態(tài)機是有限狀態(tài)自動機的簡稱,是現(xiàn)實事物運行規(guī)則抽象而成的一個數(shù)學(xué)模型。【規(guī)則的抽象】
有限狀態(tài)機一般都有以下特點:
(1)可以用狀態(tài)來描述事物,并且任一時刻,事物總是處于一種狀態(tài);
(2)事物擁有的狀態(tài)總數(shù)是有限的;
(3)通過觸發(fā)事物的某些行為,可以導(dǎo)致事物從一種狀態(tài)過渡到另一種狀態(tài);
(4)事物狀態(tài)變化是有規(guī)則的,A狀態(tài)可以變換到B,B可以變換到C,A卻不一定能變換到C;
(5)同一種行為,可以將事物從多種狀態(tài)變成同種狀態(tài),但是不能從同種狀態(tài)變成多種狀態(tài)。
狀態(tài)機這種描述客觀世界的方式就是將事物抽象成若干狀態(tài),然后所有的事件和規(guī)則導(dǎo)致事物在這些狀態(tài)中游走。最終使得事物“自圓其說”。
很多通信協(xié)議的開發(fā)都必須用到狀態(tài)機;一個健壯的狀態(tài)機可以讓你的程序,不論發(fā)生何種突發(fā)事件都不會突然進(jìn)入一個不可預(yù)知的程序分支。
四大概念:
狀態(tài)(state)
一個狀態(tài)機至少要包含兩個狀態(tài)。
分為:現(xiàn)態(tài)(源狀態(tài))、次態(tài)(目標(biāo)狀態(tài))
狀態(tài)可以理解為一種結(jié)果,一種穩(wěn)態(tài)形式,沒有擾動會保持不變的。
狀態(tài)命名形式:
1.副詞+動詞;例如:待審批、待支付、待收貨
這種命名方式體現(xiàn)了:狀態(tài)機就是事件觸發(fā)狀態(tài)不斷遷徙的本質(zhì)。表達(dá)一種待觸發(fā)的感覺。
2.動詞+結(jié)果;例如:審批完成、支付完成
3.已+動詞形式;例如:已發(fā)貨、已付款
以上兩種命名方式體現(xiàn)了:狀態(tài)是一種結(jié)果或者穩(wěn)態(tài)的本質(zhì)。表達(dá)了一種已完成的感覺。
角色很多的時候,為了表示清晰,可以加上角色名:例如:待財務(wù)審批、主管批準(zhǔn)
命名考慮從用戶的理解的角度出發(fā)。
事件(event)
or
觸發(fā)條件
又稱為“條件”,就是某個操作動作的觸發(fā)條件或者口令。當(dāng)一個條件滿足時,就會觸發(fā)一個動作,或者執(zhí)行一次狀態(tài)遷徙
這個事件可以是外部調(diào)用、監(jiān)聽到消息、或者各種定時到期等觸發(fā)的事件。
對于燈泡,“打開開關(guān)”就是一個事件。
條件命名形式:動詞+結(jié)果;例如:支付成功、下單時間>5分鐘
動作(action)
事件發(fā)生以后要執(zhí)行動作。例如:事件=“打開開關(guān)指令”,動作=“開燈”。一般就對應(yīng)一個函數(shù)。
條件滿足后執(zhí)行動作。動作執(zhí)行完畢后,可以遷移到新的狀態(tài),也可以仍舊保持原狀態(tài)。
動作不是必需的,當(dāng)條件滿足后,也可以不執(zhí)行任何動作,直接遷移到新狀態(tài)。
那么如何區(qū)分“動作”和“狀態(tài)”?
“動作”是不穩(wěn)定的,即使沒有條件的觸發(fā),“動作”一旦執(zhí)行完畢就結(jié)束了;
而“狀態(tài)”是相對穩(wěn)定的,如果沒有外部條件的觸發(fā),一個狀態(tài)會一直持續(xù)下去。
變換(transition)
即從一個狀態(tài)變化到另外一個狀態(tài)
例如:“開燈過程”就是一個變化
狀態(tài)機其他表達(dá)方式:
狀態(tài)機的設(shè)計:
信息系統(tǒng)中有很多狀態(tài)機,例如:業(yè)務(wù)訂單的狀態(tài)。
狀態(tài)機的設(shè)計存在的問題:什么是狀態(tài)?到底有多少個狀態(tài)?要細(xì)分到什么程度?
信息系統(tǒng)是現(xiàn)實世界的一種抽象和描述。而業(yè)務(wù)領(lǐng)域中那些已經(jīng)發(fā)生的事件就是事實,信息系統(tǒng)就是將這些事實以信息的形式存儲到數(shù)據(jù)庫中,即:信息就是一組事實
信息系統(tǒng)就是存儲這些事實,對這些事實進(jìn)行管理與追蹤,進(jìn)而起到提高工作效率的作用。
信息系統(tǒng)就是記錄已經(jīng)發(fā)生的事實,信息系統(tǒng)中的狀態(tài)基本和事實匹配。即:標(biāo)識某個事實的完成度。
業(yè)務(wù)系統(tǒng),根據(jù)實際業(yè)務(wù),具體會有哪些發(fā)生的事實需要記錄,基本上這些事實就至少對應(yīng)一個狀態(tài)。需要記錄的事實就是一種穩(wěn)態(tài),一種結(jié)果。
例如:【待支付】->【已支付】->【已收貨】->【已評價】
這些都是系統(tǒng)需要記錄的已發(fā)生的客觀事實。而這些事實就對應(yīng)了狀態(tài),而發(fā)生這些事實的事件就對應(yīng)了觸發(fā)狀態(tài)機的轉(zhuǎn)換的事件。
根據(jù)自己的業(yè)務(wù)實際進(jìn)行分析,并畫出狀態(tài)圖即可。
狀態(tài)機實現(xiàn)方式:狀態(tài)模式
下面是經(jīng)典的自動販賣機例子來說明狀態(tài)模式的用法,狀態(tài)圖如下:
分析一個這個狀態(tài)圖:
a、包含4個狀態(tài)(我們使用4個int型常量來表示)
b、包含3個暴露在外的方法(投幣、退幣、轉(zhuǎn)動手柄、(發(fā)貨動作是內(nèi)部方法,售賣機未對外提供方法,售賣機自動調(diào)用))
c、我們需要處理每個狀態(tài)下,用戶都可以觸發(fā)這三個動作。
我們可以做沒有意義的事情,在【未投幣】狀態(tài),試著退幣,或者同時投幣兩枚,此時機器會提示我們不能這么做。
實現(xiàn)邏輯:
任何一個可能的動作,我們都要檢查,看看我們所處的狀態(tài)和動作是否合適。
狀態(tài)機使用if-else或switch實現(xiàn)
測試自動售賣機
使用if-else/switch的方式實現(xiàn)狀態(tài)有如下問題:
例如:現(xiàn)在增加一個狀態(tài)。每個方法都需要添加if-else語句。
升級策略:
【封裝變化】,局部化每個狀態(tài)的行為,將每個狀態(tài)的行為放到各自類中,每個狀態(tài)只要實現(xiàn)自己的動作就可以了。
販賣機只要將動作委托給代表當(dāng)前狀態(tài)的狀態(tài)對象即可。
public interface State
{
/**
* 放錢
*/
public void insertMoney();
/**
* 退錢
*/
public void backMoney();
/**
* 轉(zhuǎn)動曲柄
*/
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("非法狀態(tài)!");
}
}
public class HasMoneyState implements State
{
private VendingMachine machine;
public HasMoneyState(VendingMachine machine)
{
this.machine = machine;
}
@Override
public void insertMoney()
{
System.out.println("您已經(jīng)投過幣了,無需再投....");
}
@Override
public void backMoney()
{
System.out.println("退幣成功");
machine.setState(machine.getNoMoneyState());
}
@Override
public void turnCrank()
{
System.out.println("你轉(zhuǎn)動了手柄");
machine.setState(machine.getSoldState());
}
@Override
public void dispense()
{
throw new IllegalStateException("非法狀態(tài)!");
}
}
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("商品售罄,轉(zhuǎn)動手柄也木有用");
}
@Override
public void dispense()
{
throw new IllegalStateException("非法狀態(tài)!");
}
}
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("正在出貨,請勿重復(fù)轉(zhuǎn)動手柄");
}
@Override
public void dispense()
{
machine.releaseBall();
if (machine.getCount() > 0)
{
machine.setState(machine.getNoMoneyState());
} else
{
System.out.println("商品已經(jīng)售罄");
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;
}
}
//將這些動作委托給當(dāng)前狀態(tài).
public void insertMoney()
{
currentState.insertMoney();
}
public void backMoney()
{
currentState.backMoney();
}
// 機器不用提供dispense動作,因為這是一個內(nèi)部動作.用戶不可以直
//接要求機器發(fā)放糖果.我們在狀態(tài)對象的turnCrank()方法中調(diào)用
//dispense方法;
//dispense無論如何,即使在nomoney狀態(tài)也會被執(zhí)行.
//讓不合法的情形下,dispense拋出異常處理。
public void turnCrank()
{
currentState.turnCrank();
currentState.dispense();
}
public void releaseBall()
{
System.out.println("發(fā)出一件商品...");
if (count != 0)
{
count -= 1;
}
}
public void setState(State state)
{
this.currentState = state;
}
//getter setter omitted ...
}
我們之前說過,if-else/switch實現(xiàn)方式?jīng)]有彈性,那現(xiàn)在按照這種實現(xiàn)模式,需求變更修改起來會輕松點嗎?
紅色部分標(biāo)記了我們的需求變更:當(dāng)用戶每次轉(zhuǎn)動手柄的時候,有10%的幾率贈送一瓶。
實現(xiàn)方式:
我們遵守了【開閉】原則,只要新建一個WinnerState的類即可。然后有限的修改has_money的轉(zhuǎn)向即可。
為什么WinnerState要獨立成一個狀態(tài),其實它和sold狀態(tài)一模一樣。我把代碼寫在SoldState中不行嗎?
如果sold需求變化不一定影響到winner代碼實現(xiàn),winner需求變化時,也不一定要修改sold,比如促銷方案結(jié)束了,中獎概率變了等。
如果他們的變化不是一定互相影響到彼此的,那我們就該將他們分離,即是【隔離變化】也是遵守【單一職責(zé)】的原則。
public class WinnerState implements State
{
private VendingMachine machine;
public WinnerState(VendingMachine machine)
{
this.machine = machine;
}
@Override
public void insertMoney()
{
throw new IllegalStateException("非法狀態(tài)");
}
@Override
public void backMoney()
{
throw new IllegalStateException("非法狀態(tài)");
}
@Override
public void turnCrank()
{
throw new IllegalStateException("非法狀態(tài)");
}
@Override
public void dispense()
{
System.out.println("你中獎了,恭喜你,將得到2件商品");
machine.releaseBall();
if (machine.getCount() == 0)
{
System.out.println("商品已經(jīng)售罄");
machine.setState(machine.getSoldOutState());
} else
{
machine.releaseBall();
if (machine.getCount() > 0)
{
machine.setState(machine.getNoMoneyState());
} else
{
System.out.println("商品已經(jīng)售罄");
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("您已經(jīng)投過幣了,無需再投....");
}
@Override
public void backMoney()
{
System.out.println("退幣成功");
machine.setState(machine.getNoMoneyState());
}
@Override
public void turnCrank()
{
System.out.println("你轉(zhuǎn)動了手柄");
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("非法狀態(tài)!");
}
}
總結(jié)狀態(tài)模式:
狀態(tài)模式:允許對象在內(nèi)部狀態(tài)改變時改變它的行為,對象看起來好像修改了他的類。
解釋:
狀態(tài)模式將狀態(tài)封裝成為獨立的類,并將動作委托到代表當(dāng)前狀態(tài)的對象。
所以行為會隨著內(nèi)部狀態(tài)改變而改變。
我們通過組合簡單引用不同狀態(tài)對象來造成類改變的假象.
狀態(tài)模式策略模式
1.行為封裝的n個狀態(tài)中,不同狀態(tài)不用行為。
2.context的行為委托到不同狀態(tài)中。
3.[當(dāng)前狀態(tài)]在n個狀態(tài)中游走,context的行為也隨之[當(dāng)前狀態(tài)]的改變而改變。
4.用戶對context的狀態(tài)改變渾然不知。
5.客戶不會直接和state交互,只能通過context暴露的方法交互,state轉(zhuǎn)換是context內(nèi)部事情。
6.state可以是接口也可以是抽象類,取決于有沒公共功能可以放進(jìn)抽象類中。抽象類方便,因為可以后續(xù)加方法。
可以將重復(fù)代碼放入抽象類中。例如:"你已投入25元,不能重復(fù)投" 這種通用代碼放入抽象類中。
7.context可以決定狀態(tài)流轉(zhuǎn),如果這個狀態(tài)流轉(zhuǎn)是固定的,就適合放在context中進(jìn)行。但是如果狀態(tài)流轉(zhuǎn)是動態(tài)的就適合放在狀態(tài)中進(jìn)行。
例如通過商品的剩余數(shù)目來決定流向[已售完]或[等待投幣],這個時候放在狀態(tài)類中,因為dispense要根據(jù)狀態(tài)判斷流轉(zhuǎn)。
這個寫法決定了,有新需求時候,你是改context還是改state類。
8.可以共享所有的state對象,但是需要修改context的時候時候,需要handler中傳入context引用
1.context主動指定需要組合的策略對象是哪一個。
2.可以在啟動的時候通過工廠動態(tài)指定具體是哪個策略對象,但是沒有在策略對象之間游走,即:只組合了一個策略對象。
3.策略作為繼承之外一種彈性替代方案。因為繼承導(dǎo)致子類繼承不適用的方法,且每個類都要維護(hù),策略模式通過不同對象組合來改變行為。
4.策略模式聚焦的是互換的算法來創(chuàng)建業(yè)務(wù)。
狀態(tài)機典型應(yīng)用:訂單狀態(tài)控制
建表語句
如上圖所示:
一種典型的訂單設(shè)計。業(yè)務(wù)訂單和支付退款訂單組合,他們分別有自己的狀態(tài)機。
狀態(tài)機模式實現(xiàn)訂單狀態(tài)機:
日常開發(fā)過程中,狀態(tài)機模式應(yīng)用場景之一的就是訂單模型中的狀態(tài)控制。但是區(qū)別于狀態(tài)模式的點有以下幾個:
以支付訂單為例:
/*
Title: PaymentInfo Description:
支付訂單狀態(tài)機
該類不可被spring管理,需要new出來,一個類就對應(yīng)一條數(shù)據(jù)庫中支付訂單記錄
本文來自博客園,作者:wanglifeng,轉(zhuǎn)載請注明原文鏈接:https://www.cnblogs.com/wanglifeng717/p/16214122.html
@author wanglifeng
*/
public class PaymentStateMachine {
// 數(shù)據(jù)庫中當(dāng)前支付訂單實體
private SapoPayment payment;
// 當(dāng)前狀態(tài)
private PaymentState currentState;
// 需要更新入庫的支付訂單實體。與payment屬性配合,payment為當(dāng)前數(shù)據(jù)庫中訂單實體,用于樂觀鎖的前置內(nèi)容校驗。
private SapoPayment paymentForUpdate;
/* 將最新內(nèi)容(含狀態(tài))更新入庫,并當(dāng)前狀態(tài)機狀態(tài) */
public void updateStateMachine() {
// 從Spring容器中獲取操作數(shù)據(jù)的dao
SapoDao dao = SpringUtil.getBean(SapoDao.class);
// 更新數(shù)據(jù)庫,樂觀鎖機制:帶前置內(nèi)容數(shù)據(jù)校驗,其中payment為前置內(nèi)容,paymentForUpdate為要更新的內(nèi)容,如果更新結(jié)果=0,說明該訂單被其他線程修改過。拋異常,放棄此次修改。
dao.updateSapoPaymentByNull(paymentForUpdate, payment);
// 記錄訂單操作流水
dao.insertSapoOrderStatusLog(SapoOrderStatusLog.getInstance().setOrderId(paymentForUpdate.getId())
.setOrderType(SapoOrderStatusLog.ORDER_TYPE_PAYMENT).setStatus(paymentForUpdate.getStatus()));
// 更新當(dāng)前PaymentStateMachine狀態(tài)機
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.初始化訂單狀態(tài)機
PaymentStateMachine paymentStateMachine = new PaymentStateMachine();
paymentStateMachine.setPayment(paymentResult);
paymentStateMachine.setCurrentState(paymentResult.getStatus());
paymentStateMachine.setPaymentForUpdate(SapoPayment.getInstance(paymentResult));
return paymentStateMachine;
}
// 設(shè)置當(dāng)前狀態(tài)機的狀態(tài)。輸入數(shù)據(jù)庫中status字段,映射成對應(yīng)的狀態(tài)類實體。
public void setCurrentState(Integer status) {
PaymentState currentState = null;
// status數(shù)字,映射成對應(yīng)的狀態(tài)類實體
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 待實現(xiàn),申請支付訂單
public void apply() {
// 委托給當(dāng)前狀態(tài)執(zhí)行,將當(dāng)前訂單狀態(tài)機對象傳進(jìn)去,使用狀態(tài)對象處理訂單
currentState.apply(this);
}
// TODO 待實現(xiàn),通知支付結(jié)果
public void resultNotify() {
// 委托給當(dāng)前狀態(tài)執(zhí)行
currentState.resultNotify(this);
}
// TODO 同步給當(dāng)前狀態(tài)執(zhí)行
public void sync() {
// 委托給當(dāng)前狀態(tài)執(zhí)行
currentState.sync(this);
}
// 取消訂單
public void cancel() {
// 委托給當(dāng)前狀態(tài)執(zhí)行
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 過期去統(tǒng)一支付查詢
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
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。