整合營銷服務(wù)商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          SSM訂單智慧管理系統(tǒng)-使用手冊.pdf

          、簡介

          1.1、開發(fā)目的和背景


          隨著電子商務(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)型,從而在激烈的市場競爭中立于不敗之地。

          1.2、軟件的目標(biāo)用戶


          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)都能提供直觀易用的界面和強大功能支持。

          二、軟件總體設(shè)計

          2.1、系統(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)型和高效運營。

          2.2、系統(tǒng)架構(gòu)


          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ù)管理等多方面的自動化需求。

          三、軟件操作說明

          3.1、系統(tǒng)登錄


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

          3.2、工作臺


          工作臺包含:幫助中心、財務(wù)報表管理、訂單管理、發(fā)票管理、活動管理、積分管理、技術(shù)支持、客服管理、庫存管理、商品管理、收貨地址管理、統(tǒng)計分析、推廣管理、退款管理、物流管理、消息管理、用戶管理、優(yōu)惠券管理,根據(jù)不同角色權(quán)限菜單展示會有所區(qū)別。

          3.2.1、幫助中心


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


          幫助中心管理設(shè)置新增、編輯、刪除、條件搜索、查看詳情等操作,可按照頁面提示進(jìn)行操作執(zhí)行,界面結(jié)構(gòu)設(shè)計簡單,操作流程簡潔明了,可提升用戶操作體驗。

          3.2.2、財務(wù)報表管理


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


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

          3.2.3、訂單管理


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


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

          3.2.4、發(fā)票管理


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


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

          3.2.5、活動管理


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


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

          3.2.6、積分管理


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


          管理管理設(shè)置新增、編輯、刪除、條件搜索、查看詳情等操作,可按照頁面提示進(jìn)行操作執(zhí)行,界面結(jié)構(gòu)設(shè)計簡單,操作流程簡潔明了,可提升用戶操作體驗。

          3.2.7、技術(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)境,顯著提升用戶的使用體驗與工作效率。

          3.2.8、客服管理


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


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

          3.2.9、庫存管理


          管理管理功能主要字段信息包含:管理編碼、商品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ù)同時,全面提升操作滿意度與工作效率。

          3.2.10、商品管理


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


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

          3.2.11、收貨地址管理


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


          管理管理設(shè)置新增、編輯、刪除、條件搜索、查看詳情等操作,可按照頁面提示進(jìn)行操作執(zhí)行,界面結(jié)構(gòu)設(shè)計簡單,操作流程簡潔明了,可提升用戶操作體驗。

          3.2.12、統(tǒng)計分析


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


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

          3.2.13、推廣管理


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


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

          3.2.14、退款管理


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


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

          3.2.15、物流管理


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


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

          3.2.16、消息管理


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


          管理管理設(shè)置新增、編輯、刪除、條件搜索、查看詳情等操作,可按照頁面提示進(jìn)行操作執(zhí)行,界面結(jié)構(gòu)設(shè)計簡單,操作流程簡潔明了,可提升用戶操作體驗。

          3.2.17、用戶管理


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


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

          3.2.18、優(yōu)惠券管理


          管理管理功能主要字段信息包含:管理編碼、優(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)機示例:

          四大概念:


          狀態(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)有如下問題:

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

             例如:現(xiàn)在增加一個狀態(tài)。每個方法都需要添加if-else語句。

          • 狀態(tài)如何轉(zhuǎn)換看得不是很清楚,隱藏在if-else/switch邏輯中。

          升級策略:

          【封裝變化】,局部化每個狀態(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中不行嗎?

          • 第一個原因就是上面說的信息系統(tǒng)的本質(zhì)就是記錄【事實】,中獎是需要記錄的事實,它應(yīng)該是一個狀態(tài)。
          • 第二個原因:【單一職責(zé)】問題,我們一個類的責(zé)任是明確的。

             如果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)機。

          • 業(yè)務(wù)訂單狀態(tài)機負(fù)責(zé)業(yè)務(wù)邏輯,并和支付退款狀態(tài)機聯(lián)動。
          • 一切以業(yè)務(wù)狀態(tài)機為主。例如:業(yè)務(wù)狀態(tài)已經(jīng)【關(guān)單】,此時收到支付成功通知,需要進(jìn)行退款
          • 每個狀態(tài)有自己的過期時間。異常訂單的撈取通過過期時間判斷。

          狀態(tài)機模式實現(xiàn)訂單狀態(tài)機:

          日常開發(fā)過程中,狀態(tài)機模式應(yīng)用場景之一的就是訂單模型中的狀態(tài)控制。但是區(qū)別于狀態(tài)模式的點有以下幾個:

          • 狀態(tài)模式,所有的操作都在內(nèi)存。而訂單狀態(tài)機是要落庫的。為了防止訂單的并發(fā)操作,更新訂單的時候需要使用樂觀鎖機制。
          • 狀態(tài)模式的狀態(tài)對象是新建狀態(tài)機的時候初始化進(jìn)去的。在實際開發(fā)中,狀態(tài)對象要復(fù)用,被spring管理。
          • 而訂單狀態(tài)機對象對應(yīng)了一條數(shù)據(jù)庫中實體的訂單,是要每次從數(shù)據(jù)庫中查出來的即時新建對象,所以必須將該新建的訂單狀態(tài)機對象傳入到狀態(tài)對象中。使用狀態(tài)對象處理該訂單狀態(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


          主站蜘蛛池模板: 精品国产一区二区麻豆| 久久精品无码一区二区无码| 午夜AV内射一区二区三区红桃视| 精品国产一区二区三区无码| 国产一区二区三区久久精品| 久久久久人妻一区二区三区| 免费无码一区二区三区| 亚洲一区二区三区国产精品无码| 一区二区不卡在线| 日韩一区二区三区在线精品| 国产精品亚洲不卡一区二区三区 | 亚洲日韩AV一区二区三区四区| 亚洲欧美日韩一区二区三区在线 | 免费无码AV一区二区| 国产一区二区三区久久精品| 日本无卡码一区二区三区| 一区二区三区美女视频| 日韩精品人妻一区二区中文八零 | 亚洲性日韩精品一区二区三区 | 蜜桃臀无码内射一区二区三区| 日本免费一区二区三区最新vr| 国产午夜三级一区二区三| 久久久无码一区二区三区| 国偷自产视频一区二区久| 一区二区三区精品| 欲色影视天天一区二区三区色香欲| 精品人妻码一区二区三区| 一区二区精品在线观看| 亚洲性无码一区二区三区| 国产在线一区二区三区| 搜日本一区二区三区免费高清视频| 中文字幕视频一区| 亚洲伦理一区二区| 久久精品国产一区二区三区不卡| 亚洲国产日韩在线一区| 一区二区在线观看视频| 国产在线精品一区二区中文 | 中文字幕一区二区三区久久网站| 人妻无码一区二区视频| 国产一区二区三区在线观看免费 | 色综合视频一区中文字幕|