
在集團型企業和多分支商貿公司里多公司進銷存并不是把幾家公司放到同一個菜單里簡單管理而是要讓每一家公司擁有獨立賬套、獨立庫存、獨立財務核算同時總部又能按需跨公司合并查詢。很多團隊第一次設計這類系統時容易在數據隔離方式、賬套歸屬、權限邊界三個地方反復返工。本文圍繞“多公司進銷存、多賬套財務、分公司獨立核算”這條主線先從概念講清賬套與公司的關系再對比數據隔離方案然后給出可落地的表結構、關鍵流程、權限控制和驗證方式最后補充常見問題排查與上線建議。無論你是準備選型這類軟件的商貿公司負責人還是要自研這套系統的技術人員都能從中找到直接可用的判斷依據和設計參考。1. 先理解多公司場景中的“賬套”到底是什么在正式設計表結構和寫代碼之前必須先統一業務口徑。很多項目返工并不是因為代碼寫錯而是把“公司”“賬套”“倉庫”“核算主體”幾個概念混在一起。1.1 賬套的含義一整套獨立核算的數據邊界通俗地說賬套就是一套獨立的數據集合。一個賬套通常包含會計科目表、期初余額、業務單據、庫存記錄、憑證、固定資產卡片、期末報表。選中某個賬套時用戶看到的應當是完整且封閉的一套業務數據不能夾帶其他公司的數據。用更技術化的話說賬套是一個邏輯隔離域。賬套內單據編號可以獨立從 1 開始賬套內期初庫存、期初應收應付、期初科目余額各自成立賬套內月末結賬、年度結轉互不影響。常見的映射關系有兩種一家公司一個賬套。這是最常見的情況分公司經營獨立稅務獨立財務也需要單獨出報表。一家公司多個賬套。例如一家公司同時維護“對外稅務賬”和“內部管理賬”兩套數據規則不同但底層業務來源相同。設計中不要強行規定“公司就是賬套”。數據庫里應把公司組織和賬套核算域拆成兩個維度默認一對一但保留一對多的擴展能力。1.2 一套軟件管理多家公司核心要解決三件事從業務角度看集團總部關心的是匯總分公司關心的是獨立。一套系統要在同一套代碼里同時滿足這兩類訴求必須解決三個問題第一數據隔離。任何一張業務表都要能回答“這條數據屬于哪個公司、哪個賬套”否則查詢報表時會出現串數。串數是多公司系統里最嚴重的數據事故。第二流程隔離。分公司 A 的采購入庫審批流不能觸發分公司 B 的庫存變化分公司 A 的銷售單不能把成本結到分公司 B 的賬上。第三合并視圖。總部需要一個跨賬套的查詢層能按公司匯總采購金額、銷售金額、庫存總量和應收應付余額。合并視圖只做讀取不直接修改各分公司數據。這三件事決定了后續所有模塊的設計。下面的章節就是圍繞這三件事逐步展開。2. 數據隔離方案選型決定后續所有開發量的關鍵決策多公司系統的第一步不是寫業務而是選數據隔離方案。方案選錯后面接客開單、報表合并、權限控制都會很痛苦。2.1 三種常見隔離方案對比業界做多租戶或多組織系統數據隔離通常有三種做法。這里用表格直觀對比再給出推薦組合。方案隔離粒度開發復雜度部署與運維成本適合場景獨立數據庫一個公司一個數據庫中需要動態數據源高備份、升級、遷移都要逐庫處理大客戶、強隔離要求共享數據庫、獨立 Schema一個公司一個 Schema中高需要動態 Schema 切換中數據庫實例少但結構數量多中大型客戶或定制項目共享數據庫、共享 Schema、租戶字段所有公司在同一套表中用公司字段區分低一套表一把梭低備份升級都簡單中小型集團、商貿公司、SaaS 產品對多數商貿型集團和分公司模式來說第三種方案性價比最高。原因有三分公司數量通常在幾個到幾十個單表數據量可控。業務需要跨公司合并查詢共享表結構做 UNION 或維度匯總最方便。上線和升級只需要維護一套數據庫結構運維成本低。2.2 共享表結構下如何避免“大雜燴”共享表結構不等于不隔離。隔離靠兩個東西表結構上的公司字段 查詢層的強制過濾條件。每張業務表必須包含兩個關鍵字段company_id所屬公司用于組織維度隔離。account_book_id所屬賬套用于核算維度隔離。為什么兩個字段都要因為一家公司可能開多個賬套而總部合并統計又經常要跨公司。只有公司字段沒有賬套字段管理賬和稅務賬會混在一起只有賬套字段沒有公司字段跨公司合并報表時就缺少組織維度。基礎資料表要區分層級。商品、供應商、客戶這類數據有些是集團共享的有些是公司私有的。推薦在基礎資料表上也加一個data_scope字段取值為GROUP或COMPANY并配合company_id一起使用。集團共享資料可以被所有分公司引用公司私有資料只能被本公司單據引用。2.3 獨立數據庫方案在什么情況下才值得選擇雖然共享表結構適合大部分場景但以下情況應該考慮獨立數據庫或獨立 Schema分公司數量少但單體數據量極大例如每家公司每年產生上千萬條流水。客戶對數據隔離有合規要求要求不同法人主體物理分庫。某些分公司需要獨立部署、獨立升級不能和集團共用一套發布流程。采用獨立數據庫時業務邏輯層要有統一的“數據源路由”抽象。常見做法是將公司編號與數據源 Key 做成映射表在請求進入服務層的攔截器里切換到對應數據源。這個方案的開發量明顯高于共享表結構選型時要做好成本評估。3. 組織架構與賬套模型設計先搭骨架再寫業務確定隔離方案后下一步是設計組織與賬套骨架。這部分是后續所有模塊的地基建議先建表、先跑通基礎數據維護再進入采購銷售庫存開發。3.1 一個可落地的組織模型設計上把組織分成三層集團最高層可以查看所有公司的匯總數據。公司承擔經營責任和核算責任的法人主體。部門/倉庫公司內部的業務單元業務單據上的歸屬單位。對應到數據庫至少需要公司表和賬套表兩張核心表。下面給出 MySQL 風格的建表示例字段可根據實際項目調整。-- 公司表 CREATE TABLE t_sys_company ( id BIGINT PRIMARY KEY AUTO_INCREMENT, company_code VARCHAR(32) NOT NULL COMMENT 公司編碼全局唯一, company_name VARCHAR(128) NOT NULL COMMENT 公司名稱, parent_id BIGINT DEFAULT 0 COMMENT 上級公司ID集團為0, sort_no INT DEFAULT 0, status TINYINT DEFAULT 1 COMMENT 1啟用 0停用, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, UNIQUE KEY uk_company_code (company_code) ) COMMENT 公司/組織表; -- 賬套表 CREATE TABLE t_sys_account_book ( id BIGINT PRIMARY KEY AUTO_INCREMENT, company_id BIGINT NOT NULL COMMENT 所屬公司, book_code VARCHAR(32) NOT NULL, book_name VARCHAR(128) NOT NULL COMMENT 賬套名稱如對外稅務賬、管理賬, start_date DATE NULL COMMENT 啟用日期, fiscal_year INT NULL COMMENT 當前會計年度, currency_code VARCHAR(16) DEFAULT CNY COMMENT 本位幣, status TINYINT DEFAULT 1, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY uk_book_code (book_code), KEY idx_company (company_id) ) COMMENT 賬套表;這里要解釋三個設計意圖。第一公司編碼必須全局唯一。在實際項目中公司編碼會出現在單據編號前綴、數據源路由 Key、對接外部系統的主數據編碼里一旦重復會造成串單。第二賬套表用company_id指向公司而不是把公司信息冗余到賬套表。這樣可以支持“一個公司多個賬套”的擴展。第三會計年度字段放在賬套表而不是公司表因為年度結轉是按賬套執行的。每個賬套可能有不同的啟用日期和當前期間。3.2 基礎資料如何按層級共享基礎資料是另一個容易踩坑的地方。以商品檔案為例集團希望同一個商品編碼全集團統一但分公司又希望維護自己專屬的商品例如包裝規格不同的內部料號。推薦這樣設計CREATE TABLE t_biz_product ( id BIGINT PRIMARY KEY AUTO_INCREMENT, product_code VARCHAR(64) NOT NULL, product_name VARCHAR(128) NOT NULL, spec VARCHAR(64) DEFAULT , unit VARCHAR(16) DEFAULT 件, data_scope TINYINT NOT NULL DEFAULT 1 COMMENT 1集團共享 2公司私有, company_id BIGINT DEFAULT 0 COMMENT data_scope2時必填, status TINYINT DEFAULT 1, create_time DATETIME DEFAULT CURRENT_TIMESTAMP ) COMMENT 商品檔案;查詢商品列表時邏輯是data_scope 1的商品全部可見data_scope 2且company_id 當前公司的商品可見。這個邏輯要封裝成公共查詢服務避免每個菜單都各寫一遍。供應商、客戶、倉庫、部門等基礎資料同理。基礎資料的共享層級設計直接決定后續銷售訂單一來選擇客戶時能不能正確過濾出本公司客戶。3.3 賬套初始化應該包含什么一個賬套啟用時要完成以下初始化動作缺一不可創建會計科目表。可以從行業模板復制科目也可以通過 Excel 導入期初科目。設置賬套參數。包括本位幣、啟用期間、數量小數位、單價小數位、庫存成本核算方式。錄入期初余額。包括庫存期初、應收期初、應付期初、銀行期初、科目期初。配置單據編號規則。通常按“賬套 單據類型 年月 流水號”生成。初始化最好做成一個獨立的功能菜單而不是在數據庫里手工 INSERT。因為在初始化過程中系統要生成賬套參數記錄、科目記錄、期初余額臺賬并且要做數據校驗例如期初庫存數量和單價不能為負期初科目借貸必須平衡。注意對學習環境來說手工建表和初始化數據可以加快跑通進度但生產環境必須通過程序完成賬套初始化并保留初始化日志否則上線后很難追蹤“這個賬套當時啟用了哪些參數”。4. 進銷存核心流程在多賬套下的實現要點進銷存是多公司系統的核心業務域包含采購、銷售、庫存、盤點、調撥等流程。多賬套環境下每個流程都要回答兩個問題單據屬于哪個賬套單據操作會影響哪個賬套的庫存和往來4.1 采購入庫從訂單到入庫單的隔離采購業務通常分成兩步采購訂單和采購入庫單。訂單是業務意向入庫單才真正影響庫存。關鍵設計是采購訂單表、采購入庫單表、入庫明細表都要攜帶company_id和account_book_id。下拉選供應商時只顯示當前公司的供應商系統在頁面查詢接口就按當前登錄公司過濾。CREATE TABLE t_purchase_inbound ( id BIGINT PRIMARY KEY AUTO_INCREMENT, inbound_no VARCHAR(40) NOT NULL, company_id BIGINT NOT NULL, account_book_id BIGINT NOT NULL, supplier_id BIGINT NOT NULL, warehouse_id BIGINT NOT NULL, inbound_date DATE NOT NULL, total_amount DECIMAL(20, 6) DEFAULT 0 COMMENT 含稅金額, status TINYINT DEFAULT 0 COMMENT 0草稿 1已審核 2已紅沖, create_by BIGINT, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY uk_inbound_no (inbound_no), KEY idx_company_book (company_id, account_book_id) ) COMMENT 采購入庫單;采購入庫審核時系統要同時做兩件事增加對應倉庫的庫存庫存明細記錄來源單據號、供應商、單價、批次。生成應付暫估或直接生成采購憑證。如果采用暫估入庫財務憑證是“借存貨 貸應付暫估”。這里最容易犯的錯是只更新了庫存數量沒有更新庫存成本導致后續銷售出庫時成本計算錯誤。庫存成本更新必須和入庫單審核放在同一個數據庫事務里。4.2 銷售出庫成本結轉與往來確認銷售出庫的流程類似。銷售訂單審核后生成出庫單出庫單審核時做兩件事扣減對應倉庫庫存記錄出庫數量、出庫單價、出庫成本。生成應收賬款確認銷售收入同時結轉銷售成本到主營業務成本。成本計算方式需要提前定好。商貿類企業常用移動加權平均法即每次入庫后重新計算庫存平均單價。-- 庫存余額臺賬 CREATE TABLE t_stock_balance ( id BIGINT PRIMARY KEY AUTO_INCREMENT, company_id BIGINT NOT NULL, account_book_id BIGINT NOT NULL, warehouse_id BIGINT NOT NULL, product_id BIGINT NOT NULL, batch_no VARCHAR(64) DEFAULT , quantity DECIMAL(20, 4) DEFAULT 0 COMMENT 數量, cost_price DECIMAL(20, 6) DEFAULT 0 COMMENT 移動加權平均成本, amount DECIMAL(20, 6) DEFAULT 0, update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, UNIQUE KEY uk_stock (company_id, account_book_id, warehouse_id, product_id, batch_no) ) COMMENT 庫存余額臺賬;移動加權平均的邏輯是新平均單價 (原庫存金額 本次入庫金額) / (原庫存數量 本次入庫數量)。出庫時按當前平均單價結轉成本。這個公式要在代碼里實現成獨立服務并加上并發控制。統一使用SELECT ... FOR UPDATE鎖定庫存行避免兩個單據同時審核時超賣或成本異常。4.3 盤點與調撥多倉庫、多賬套的分界盤點單處理的是“賬面庫存與實際庫存的差異”。盤點流程中盤點表按倉庫生成盤點完成后生成盤盈盤虧單盤盈盤虧單審核后影響庫存余額。調撥分兩種同賬套內調撥只是倉庫 A 到倉庫 B不改變公司庫存總量。跨賬套調撥發生在集團下屬兩家公司之間本質上是一家公司銷售、另一家公司采購。跨賬套調撥不能只寫一張調撥單。推薦設計為“調撥申請單”加“調出方的其他出庫單”加“調入方的其他入庫單”三者通過source_bill_no關聯。調出方按出庫價減少庫存調入方按調入價增加庫存雙方分別在自己的賬套內生成往來和憑證。這樣財務核算才是清晰的。4.4 庫存賬要能追本溯源庫存模塊必須維護流水賬。每次入庫、出庫、盤點、調撥都寫一條庫存流水流水表記錄變化前數量、變化后數量、單據號、操作人、操作時間。CREATE TABLE t_stock_flow ( id BIGINT PRIMARY KEY AUTO_INCREMENT, company_id BIGINT NOT NULL, account_book_id BIGINT NOT NULL, warehouse_id BIGINT NOT NULL, product_id BIGINT NOT NULL, flow_type TINYINT NOT NULL COMMENT 1入庫 2出庫 3盤盈 4盤虧 5調出 6調入, bill_no VARCHAR(40) NOT NULL COMMENT 來源單據號, before_qty DECIMAL(20, 4) DEFAULT 0, change_qty DECIMAL(20, 4) DEFAULT 0, after_qty DECIMAL(20, 4) DEFAULT 0, cost_price DECIMAL(20, 6) DEFAULT 0, create_by BIGINT, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, KEY idx_product_warehouse (company_id, account_book_id, product_id, warehouse_id) ) COMMENT 庫存流水;有了庫存流水才能回答用戶最常問的問題“這個批次這個商品為什么庫存多了兩百件”沒有流水賬的進銷存系統庫存對不上時基本無法排查。5. 財務模塊與業務模塊如何共用同一套賬套多公司軟件最容易出現業務和財務“兩張皮”的問題。業務單據在進銷存里查得到但財務憑證沒有自動生成導致月底財務還要手工錄入一遍。5.1 進銷存單據與財務憑證的銜接規則推薦的做法是業務單據審核時按照預置的憑證模板自動生成一張草稿憑證進入會計的“待審核憑證”池。會計核對無誤后審核過賬。憑證模板可以按單據類型和業務方向配置例如業務單據借方科目貸方科目觸發條件采購入庫單存貨應付暫估/應付賬款審核通過銷售出庫單收入應收賬款主營業務收入審核通過銷售出庫單成本主營業務成本存貨審核通過采購付款單應付賬款銀行存款審核通過銷售收款單銀行存款應收賬款審核通過生成憑證時科目可以從商品檔案或供應商檔案的“默認科目”字段帶出。如果帶不出科目就把憑證標記為“待完善”不允許審核。這樣設計可以避免月底出現大量借貸不平的憑證。5.2 獨立做賬與合并報表如何并存總部財務要的合并報表不應該直接查分公司賬套的數據表。推薦增加一個“跨賬套報表查詢”層專門做匯總按公司匯總銷售收入、采購成本、庫存余額。按集團匯總應收應付、資金余額。合并時先做內部往來抵消例如集團內部調撥產生的應收應付要抵消。實現上可以有兩種方式一種是在應用層分別查詢每個賬套再匯總適合公司數量少的情況另一種是把各賬套數據按統一口徑抽取到報表庫適合公司數量多、報表頻繁查詢的情況。第二種方式要注意抽取任務失敗時的補償機制保證報表數據不丟不重。5.3 憑證、科目、期末結賬的隔離財務模塊的每張憑證都要帶account_book_id。憑證號在一個賬套內連續禁止跨賬套連續。會計科目表也屬于賬套級基礎資料每個賬套可以有自己的科目體系。不過實際項目中集團通常會統一下發科目模板保證各公司報表格式一致。實現方式是建賬套時從“集團科目模板”復制科目復制后允許分公司在權限范圍內局部調整但集團科目模板變更時要提供“對比和增量同步”功能。期末結賬是另一個容易出問題的節點。每個賬套自行執行“存貨成本結轉 - 計提費用 - 結轉損益 - 月末結賬”。A 公司結賬不影響 B 公司未結賬狀態。系統要提供集團視角的“各公司結賬狀態表”方便總部財務跟蹤。注意跨賬套結賬時不能使用全局鎖把整個系統鎖住。否則一個分公司結賬慢會拖累所有分公司正常操作。應該只鎖定當前賬套的相關表或者使用樂觀鎖記錄賬套版本號。6. 權限與數據范圍控制防止賬號能串到別的公司數據多公司系統的權限不是簡單的“菜單權限 按鈕權限”還必須包含“數據權限”也就是登錄一個分公司賬號時后端查詢必須自動帶上該公司的過濾條件。6.1 用戶、角色、數據權限三層模型建議使用三張表用戶表保存登錄賬號、密碼、所屬公司、狀態。角色表定義系統角色例如集團管理員、分公司經理、會計、倉管。用戶角色關系表一個用戶可以有多個角色。除業務角色外還需要一個數據權限范圍字段用來標識用戶能看到哪些賬套的數據。常見取值數據范圍說明使用對象全部賬套查詢時不過濾賬套可跨公司匯總集團管理員指定公司及其下級按組織樹過濾集團下屬區域負責人指定賬套只看本公司一個賬套分公司財務、倉管僅本人數據只看自己創建的單據普通業務員6.2 數據權限攔截的實現思路數據權限必須是后端行為不能只靠前端隱藏菜單來保證。常見實現是使用 ORM 攔截器在查詢時自動拼接company_id和account_book_id條件。下面是 MyBatis 攔截器的示意邏輯用于說明思路實際項目要結合自己的框架版本調整Intercepts({ Signature(type StatementHandler.class, method prepare, args {Connection.class, Integer.class}) }) public class DataScopeInterceptor implements Interceptor { Override public Object intercept(Invocation invocation) throws Throwable { // 1. 從當前線程上下文獲取登錄賬套 UserContext ctx UserContextHolder.get(); // 2. 改寫 SQL追加 company_id 和 account_book_id 條件 // 如果是關聯查詢還要在處理主表別名后生成正確條件 // 3. 白名單表不追加例如系統配置表 return invocation.proceed(); } }實現攔截器要注意三個細節攔截規則必須支持表白名單。公司表、賬套表、用戶表本身不能加公司條件否則連登錄后的基本信息都查不出來。關聯查詢要處理表別名。如果 SQL 是SELECT p.* FROM t_biz_product p LEFT JOIN ...拼接條件時應該寫成AND p.company_id ?不能漏掉別名。禁止通過在 Mapper XML 里每個查詢手寫company_id條件來替代攔截器。手寫容易漏新來的開發加一個查詢忘記加條件就會造成串賬而且很難被發現。另一種更穩妥的方式是手寫透明的查詢層所有業務查詢都經過統一的DataScopeService組裝條件。雖然初期開發量大但可控性更高。6.3 集團管理員與分公司管理員的分工權限設計要區分兩類管理員集團管理員可以創建公司、創建賬套、維護集團共享商品和供應商、查看匯總報表但不應直接編輯分公司具體單據。分公司管理員在自己所屬公司范圍內創建用戶、維護本公司基礎資料、審核本公司單據、執行本公司結賬。一個常見的錯誤是把所有權限都給了集團管理員導致集團管理員不小心改了分公司單據月底對賬時責任無法界定。建議集團管理員默認只有“只讀 導出”權限涉及數據修改必須走審計流程操作日志留痕。7. 運行驗證與常見問題排查多公司系統上線前驗證不能只驗證“功能能跑”要專項驗證“隔離是否生效”。這部分給出可操作的驗證清單和排查路徑。7.1 上線前功能驗證清單驗證項操作方式預期結果賬套初始化新建一家分公司并啟用賬套生成獨立科目、單據編號從 1 開始跨賬套串數檢查A 賬套錄入客戶B 賬套查詢該客戶B 賬套看不到 A 的私有客戶庫存隔離A 公司采購入庫查 B 公司庫存B 公司庫存不變財務憑證生成審核采購入庫單自動生成暫估憑證科目與單據一致報表合并兩家公司分別出庫查集團匯總匯總數量等于兩家之和權限過濾分公司會計登錄直接調用其它公司查詢接口返回結果為空或被攔截結賬互不影響A 公司結賬同時操作 B 公司單據B 公司操作正常A 公司鎖定期內不可改每一項驗證都要記錄測試數據和結果截圖最好做成自動化測試的一部分。特別是“串數檢查”建議每次迭代都跑一遍回歸腳本。7.2 常見問題現象、原因與處理問題現象常見原因檢查方式處理建議B 公司能看到 A 公司的客戶查詢條件未過濾 company_id或基礎資料 data_scope 判斷錯誤查看 SQL 日志確認是否帶 company_id 條件補過濾條件檢查數據權限攔截器是否覆蓋該 Mapper庫存數量正確但金額不對成本計算沒有按賬套隔離或并發時重復計算平均價對比庫存流水和成本明細入庫和出庫放在同一事務庫存行加行鎖單據編號重復編號生成只用了公司維度沒有用賬套維度查詢單據表唯一索引編號規則調整為賬套 類型 年月 流水號月底結賬時系統卡死結賬事務鎖范圍過大鎖到了其他賬套表查看數據庫鎖等待與事務 SQL縮小鎖粒度按賬套分表或按數據行加鎖報表匯總金額翻倍合并報表時內部調撥沒有抵消檢查調撥單是否同時生成調出和調入兩筆在合并層增加內部往來抵消規則用戶離開公司后仍能訪問用戶與公司關系未同步停用檢查用戶狀態和會話緩存停用用戶時踢出會話并使緩存失效7.3 從現象倒推的排查鏈路遇到“某個功能數據不對”時按以下順序排查確認當前登錄用戶所屬公司與賬套。先看登錄上下文排除看錯賬套的可能。確認頁面傳入的查詢參數。是否帶掉了 company_id、account_book_id 參數。查看應用輸出的 SQL。確認 SQL 中是否自動拼上了賬套條件條件值是否正確。查看單據和流水。業務單據是否生成庫存流水是否寫入流水數量變化是否連續。查看憑證和科目。業務單據審核后是否生成憑證科目是否為空借貸是否平衡。查看數據庫鎖和慢查詢日志。如果數據正確但操作慢需要考慮索引和鎖。這條鏈路幾乎能覆蓋 80% 的多賬套數據問題。無論什么模塊出錯先確認“數據到底落在哪個賬套”再確認“查詢時是否按這個賬套過濾”往往很快能定位根因。8. 最佳實踐與擴展方向8.1 開發落地時的檢查清單每張業務表都包含company_id和account_book_id并建聯合索引。單據編號規則按賬套獨立生成使用數據庫唯一索引兜底。基礎資料按集團共享、公司私有分層查詢公共服務統一處理。庫存余額更新和成本計算放在同一事務中庫存行使用SELECT ... FOR UPDATE。數據權限過濾放在后端攔截器或公共查詢層禁止依賴前端隱藏。憑證生成使用模板驅動生成后進入待審核池禁止業務單據直接寫入已過賬憑證。所有關鍵操作審核、反審核、結賬、紅沖寫操作日志。表結構變更通過遷移腳本執行不手工改生產庫。8.2 生產環境額外要注意的事情學習環境可以只在一臺機器上跑通功能但生產環境必須補齊以下能力數據庫備份和恢復演練。多賬套數據都集中在一套庫時備份粒度要大恢復驗證要定期做。日志與監控。按公司、賬套、用戶維度記錄關鍵操作日志同時監控慢 SQL 和庫存異常。性能設計。庫存余額表、流水表要按 company_id 賬套 商品建聯合索引單據列表查詢必須分頁避免全表掃描。異常補償。業務單據審核和憑證生成如果跨服務調用需要設計重試或對賬機制避免一處成功、一處失敗。數據導入導出。上線初期通常要導入歷史庫存和往來余額導入工具必須有模板校驗、錯誤行提示、冪等機制。8.3 擴展方向從進銷存走向集團一體化多公司進銷存是集團信息化的入口。系統跑穩后可以逐步擴展這些方向集團采購中心分公司共享供應商資源和采購價格集中采購后再按需調撥給各公司。合并報表先做進銷存層面的匯總再擴展財務合并報表處理內部交易抵消。多組織核算從單一賬套擴展到利潤中心、成本中心維度讓一個分公司內部也能按業務線獨立核算。庫存預留與齊套檢查在銷售訂單下達時檢查可用庫存支持按倉庫、按批次、按預留類型分配。移動端作業倉管用移動端掃碼收貨、發貨、盤點減少手工錄入錯誤。對團隊來說最重要的建議是先在一個最小賬套范圍內把采購、銷售、庫存、財務憑證跑通再擴展多公司套用。多公司系統不是把單公司代碼復制十份而是從一開始就按“數據隔離字段 統一查詢層”去設計。設計上守住隔離邊界業務上保留合并視圖這套系統才能真正服務好集團企業的管理需求。