架構(gòu)到二次開發(fā)實戰(zhàn))
簡介這份《實驗室信息管理系統(tǒng)用戶需求說明書》是LIMS項目需求階段的核心依據(jù)面向系統(tǒng)分析師、項目經(jīng)理、開發(fā)維護人員及課程項目參考。資源包共1個文件為doc文檔約6.25MB正文共76頁目錄結(jié)構(gòu)完整便于按章節(jié)查閱。從系統(tǒng)目標、邊界范圍、遵循ISO/IEC 17025:2005標準、角色權(quán)限入手梳理了實驗室基礎(chǔ)信息、工作流、自動排程、儀器物資、標準方法、檢測業(yè)務(wù)、編碼規(guī)則、首頁報表等十二類功能需求并對可用性、可靠性、性能、安全性及軟硬件環(huán)境等非功能需求作了說明。具體涵蓋位置管理、采樣點管理、樣品登錄、結(jié)果錄入、審核審批等子功能附帶需求描述與業(yè)務(wù)規(guī)則能幫助理解各模塊職責(zé)和數(shù)據(jù)流轉(zhuǎn)降低溝通與設(shè)計變更成本。已有1298人學(xué)習(xí)下載對美和易思大一卓越項目A類需求文檔撰寫或?qū)嶋HLIMS建設(shè)有直接參考價值。1. 一份LIMS需求說明書到底能拆出多少開發(fā)量接到這份《實驗室信息管理系統(tǒng)用戶需求說明書》時我一開始以為又是一份應(yīng)付答辯的文檔模板翻到第六章才發(fā)現(xiàn)它把 LIMS 的十二個功能域拆得清清楚楚甚至細到“量綱要能顯示上下標”“培訓(xùn)過期后人員不能修改成正常狀態(tài)”這種級別。需求規(guī)格說明書能寫到這個粒度已經(jīng)可以直接作為項目開發(fā)的需求基線。如果你正要接手一個實驗室信息管理系統(tǒng)項目或者正在為某高校大一卓越項目 A 類的選題準備落地材料這份文檔就是你最好的起點——它不是代碼但比代碼更值錢因為它先把“你到底要做什么”這件事釘死了。2. 系統(tǒng)架構(gòu)與角色設(shè)計從 ISO 17025 到七大角色怎么落地2.1 系統(tǒng)目標和范圍先搞清楚要做什么文檔開篇給出的系統(tǒng)目標只有兩句話第一重新定義 LIMS 業(yè)務(wù)模塊第二實現(xiàn)能夠支持舊版 LIMS 使用某商業(yè)LIMS產(chǎn)品的核心功能。注意這里的關(guān)鍵詞是“支持”和“優(yōu)化”不是“從零開發(fā)”。它要在一個已有的框架之上把實驗室信息化系統(tǒng)做得更貼合煉化企業(yè)的檢測業(yè)務(wù)。系統(tǒng)說明里也明確寫著“針對目前的 LIMS 進行優(yōu)化實現(xiàn)基礎(chǔ)的煉化企業(yè)的 LIMS 系統(tǒng)功能”。范圍列表一共十一項實驗室基礎(chǔ)信息管理、工作流管理、自動排程管理、儀器管理、物資管理、編碼規(guī)則管理、標準與方法管理、檢測業(yè)務(wù)管理、首頁、報表、系統(tǒng)管理優(yōu)化。這十一項就是系統(tǒng)的邊界。對于開發(fā)團隊這份文檔最大的價值在于它告訴你“本次不做哪些事”——比如設(shè)備數(shù)據(jù)采集接口、與外部LIMS系統(tǒng)的集成、客戶門戶都沒有列入范圍。把范圍切開才不會被需求蔓延拖垮。文檔同時給出了一個硬約束系統(tǒng)要求 2016 年 12 月底前完成。結(jié)合“復(fù)用框架 1.0”的說明可以推斷出項目采用的是成熟框架加定制模塊的策略而不是從空地上建樓。時間緊、范圍大這決定了開發(fā)必須優(yōu)先打通主干流程再逐步補邊緣功能。我在拆這份文檔時第一件事就是把范圍列表轉(zhuǎn)成優(yōu)先級矩陣檢測業(yè)務(wù)全流程是第一優(yōu)先級基礎(chǔ)信息管理是支撐自動排程和報表排第二梯隊。2.2 角色權(quán)限矩陣誰來定義和執(zhí)行數(shù)據(jù)隔離第五章定義了系統(tǒng)涉及的七種角色系統(tǒng)管理員、設(shè)備管理員、物資管理員、樣品管理員、實驗室負責(zé)人、檢驗人員、實驗室主任。系統(tǒng)管理員擁有最高權(quán)限負責(zé)系統(tǒng)全局設(shè)備管理員只對設(shè)備維護負責(zé)物資管理員管理耗材和物資樣品管理員負責(zé)樣品生命周期的管理實驗室負責(zé)人管理實驗室整體運營檢驗人員做具體檢測任務(wù)實驗室主任管理各科室。這里最容易被忽略的是“角色”和“數(shù)據(jù)權(quán)限”的關(guān)系。文檔在位置管理、采樣點管理、文檔管理中反復(fù)提到“群組權(quán)限”——只有屬于該群組的人員才能查看、編輯、修改。這說明本系統(tǒng)的權(quán)限模型不是簡單的“角色比功能”菜單而是疊加了縱向的數(shù)據(jù)隔離維度。比如一個在煉化企業(yè)一廠化驗室的檢驗人員只能看到一廠裝置下的采樣點和樣品數(shù)據(jù)二廠的數(shù)據(jù)對他不可見。從架構(gòu)角度我是這樣理解的功能權(quán)限控制“能不能點這個按鈕”分配給角色數(shù)據(jù)權(quán)限控制“能看到哪些行記錄”通過群組過濾群組可以對應(yīng)部門、科室或自定義組織單元可嵌套。實現(xiàn)時每張業(yè)務(wù)表都要冗余一個group_id字段查詢時用當(dāng)前用戶所屬群組的 ID 集合做過濾。這個設(shè)計比單存create_by要麻煩但它是 LIMS 數(shù)據(jù)安全的基礎(chǔ)。文檔沒有給出權(quán)限模型圖但“群組權(quán)限”這四個字已經(jīng)足夠讓后端架構(gòu)師畫出表結(jié)構(gòu)了。2.3 遵循的規(guī)范ISO/IEC 17025 對 LIMS 的硬約束文檔第四章明確了系統(tǒng)應(yīng)當(dāng)遵循 ISO/IEC 17025:2005《檢測和校準實驗室能力的通用要求》。這個標準是整個 LIMS 的質(zhì)量底座它不是用來裝飾的。ISO 17025 要求實驗室對人員、設(shè)備、方法、環(huán)境、樣品、記錄進行受控管理那么系統(tǒng)至少需要滿足以下隱含需求人員培訓(xùn)過期后不能上崗數(shù)據(jù)要達到“可追溯”設(shè)備校準、維護、期間核查要有記錄和提醒檢測方法要有版本控制原始數(shù)據(jù)和檢測結(jié)果不能被隨意修改修改需留痕樣品從登錄到出具報告的狀態(tài)流轉(zhuǎn)要完整。這些隱含需求并沒有在功能需求列表中單獨成章而是散落在各個模塊里。比如人員管理里“培訓(xùn)過期自動計算”設(shè)備管理里“期間核查”標準方法管理里“分析項目關(guān)聯(lián)分析方法”。如果你只照著需求列表開發(fā)不做 ISO 17025 映射最后大概率會漏掉“數(shù)據(jù)完整性審計”和“修改留痕”這兩個非功能性內(nèi)容。2.4 非功能性需求可用性、可靠性、性能、安全性怎么落地文檔第七章列出了非功能性需求但只有標題沒有具體數(shù)值。這很常見需求說明書只提維度具體指標要靠開發(fā)團隊和客戶談判確定。按 LIMS 場景我一般會建議這樣的量化指標可用性常見操作頁面無卡頓報表查詢響應(yīng)不超過 5 秒可靠性核心數(shù)據(jù)每日備份樣品流轉(zhuǎn)狀態(tài)不丟失性能支持 200 并發(fā)用戶登錄響應(yīng)不超過 3 秒安全性密碼加密存儲操作日志保留 180 天關(guān)鍵表防篡改。安全性方面LIMS 特別強調(diào)“修改留痕”。比如檢測結(jié)果錄入后檢驗人員不能直接改數(shù)值只能走“退回重錄”流程或者所有修改自動記錄到審計表中。文檔在障礙檢測業(yè)務(wù)模塊里提到“審核能夠退回整個樣品也可以退回單個測試項目”這個退回機制本身就是數(shù)據(jù)完整性的保護手段。開發(fā)時要在樣品結(jié)果表上增加result_status字段配合audit_log表記錄每次變更。2.5 復(fù)用與新建框架系統(tǒng)管理的邊界文檔最后一部分是“框架系統(tǒng)管理復(fù)用框架 1.0”。這句話信息量很大意味著用戶管理、組織管理、菜單管理、角色管理這些通用能力不需要從零開發(fā)而是直接復(fù)用已有框架。這部分功能通常包括人員自動從系統(tǒng)用戶中獲取、文檔管理、提醒管理等基礎(chǔ)能力。復(fù)用框架能節(jié)省大量時間但也帶來風(fēng)險你不能隨意改框架的表結(jié)構(gòu)否則框架升級會沖突。我處理這類項目時會在獨立 schema 下建 LIMS 業(yè)務(wù)表框架表只讀引用。比如人員管理中的“姓名”“部門群組”是從框架用戶表自動獲取的不可修改而“工號”“學(xué)歷”“技術(shù)職稱”需要擴展則新建lab_person_ext擴展表與框架用戶表一對一關(guān)聯(lián)。這是很成熟的“擴展表”模式能同時滿足復(fù)用和定制。3. 核心功能模塊拆解十二個功能域的業(yè)務(wù)邏輯3.1 實驗室基礎(chǔ)信息管理位置、采樣點、企業(yè)、培訓(xùn)、樣品類型、量綱、人員“基礎(chǔ)信息”聽起來簡單實際是 LIMS 里最容易被低估的模塊。位置管理U009要求支持多層級子位置比如“一廠”下有三條生產(chǎn)線這意味著表結(jié)構(gòu)要支持父子級聯(lián)。業(yè)務(wù)規(guī)則還要求位置具有群組權(quán)限只有屬于該群組的人員才能查看和編輯并且人員只能添加自己有權(quán)限的數(shù)據(jù)。實現(xiàn)時lab_location表需要id, parent_id, code, name, description, sort, group_id這些字段查詢時先把當(dāng)前用戶的群組列表取出來再拼WHERE group_id IN (...)。采樣點管理U010與位置類似但業(yè)務(wù)上更強調(diào)與“位置”的關(guān)聯(lián)。采樣點內(nèi)容包含代號、名稱、描述非必填、所屬群組非必填、所屬位置非必填。支持代號、名稱、描述模糊搜索。這里的模糊搜索要注意性能不能全表掃只要數(shù)據(jù)量不大用 LIKE 也能接受。企業(yè)管理U011的亮點是“企業(yè)類型多選”和“邏輯刪除”。企業(yè)類型包含供應(yīng)商、客戶、分包商注意一個企業(yè)可以在不同業(yè)務(wù)中扮演不同角色所以類型應(yīng)該是多選。邏輯刪除意味著刪除只是打標記避免已關(guān)聯(lián)的樣品、訂單、報告失去企業(yè)信息。字段包含企業(yè)簡稱、中文名、英文名、聯(lián)系人、電話、傳真、郵件、國家、省份、城市、地址、網(wǎng)址、企業(yè)代碼。企業(yè)代碼是必填且唯一的。培訓(xùn)管理U014給出了完整的數(shù)據(jù)模型課程代號必填且唯一課程類型必選內(nèi)部/外部學(xué)時保留一位小數(shù)有效期和重測提醒日期都是整數(shù)天可以為空。這里最核心的是有效期邏輯——培訓(xùn)的有效期是用來驅(qū)動人員資質(zhì)過期的所以課程表必須存有效天數(shù)。人員培訓(xùn)記錄中過期時間根據(jù)獲取時間自動計算如果當(dāng)前時間超過過期時間培訓(xùn)狀態(tài)顯示已過期并且人員不能修改成正常狀態(tài)。這是一個非常典型的定時任務(wù) 狀態(tài)機場景規(guī)則在需求里寫得很清楚實現(xiàn)時不能漏掉“自動計算”這四個字。樣品類型管理U015支持子類嵌套如水下面包含污水、地表水、廢水。同時樣品類型能設(shè)定對應(yīng)的分析項目排序。這個功能的本質(zhì)是建立“樣品類型 - 測試項目模板”的關(guān)聯(lián)樣品登錄時根據(jù)樣品類型自動帶出需要檢測的項目省去手工勾選。量綱管理U017要求顯示上下標比如立方厘米顯示為 m3這需要前端在輸入時存儲 Unicode 或特殊格式化后端不用管顯示只管單位名稱和編號。人員管理U024最復(fù)雜的部分是“培訓(xùn)記錄”和“工作經(jīng)歷”兩塊。人員基礎(chǔ)信息中的“姓名”“部門群組”“性別”是自動獲取的不能改“工號”“最高學(xué)歷”“畢業(yè)院?!薄凹夹g(shù)職稱”“技術(shù)職稱獲取日期”“公司郵箱”“入職日期”“技術(shù)能力”等是擴展屬性。培訓(xùn)記錄要關(guān)聯(lián)培訓(xùn)課程記錄獲取時間和過期時間能力等級分為了解、熟練、掌握、精通。工作經(jīng)歷默認按時間排序結(jié)束時間不填寫表示至今。3.2 儀器設(shè)備與物資管理維修流程、報廢流程、領(lǐng)用結(jié)合工作流儀器設(shè)備管理模塊主要包括設(shè)備信息維護、配件維護、維修流程、報廢流程。設(shè)備信息維護不只是靜態(tài)臺賬還要包含使用記錄、校準記錄、維護記錄、期間核查記錄。這在數(shù)據(jù)庫設(shè)計中至少需要四張子表equipment設(shè)備主表、equipment_usage_log使用記錄、equipment_calibration校準記錄、equipment_maintenance維護/期間核查記錄。期間核查是 LIMS 特有的動作很多人會忽略。ISO 17025 要求在兩次校準之間對設(shè)備進行核查以保證結(jié)果有效性。系統(tǒng)需要能錄入核查結(jié)果并對即將到期的核查任務(wù)進行提醒。這個提醒要掛在“提醒管理”模塊里設(shè)備類型提醒就是其中之一。物資管理更貼近 ERP。物資基本信息管理耗材品類庫存明細要記錄入庫、驗收、出庫、返還等操作。這里的關(guān)鍵是庫存流水賬不能用“當(dāng)前庫存”一個字段解決問題。每次入庫和出庫都要生成一條流水記錄通過匯總流水得到實時庫存才能支持追溯。物資領(lǐng)用流程必須結(jié)合工作流也就是說領(lǐng)用申請?zhí)峤缓笠?jīng)過一級或多級審批審批通過后才扣減庫存。庫房管理和庫位管理是兩個層次當(dāng)實驗室只有一個庫房時不需要庫位但當(dāng)有多個庫房且存在貴重物品需要精確定位時就要啟用庫位管理。庫位可以理解為庫房下的子位置例如“一號庫房-第二排-第三列”。3.3 標準與方法管理分析項目、分析方法、測試項目、群組、控制指標這一塊是整個 LIMS 的“靈魂”也是最難設(shè)計的地方。文檔里這幾個概念的關(guān)系是這樣的分析項目是實驗室具備的檢測能力比如“水中的 pH 值”分析方法是具體使用的實驗方法比如“GB/T 某標準方法”分析項目關(guān)聯(lián)分析方法后形成一個“測試項目”也就是樣品上真實要做的檢測項測試項目關(guān)聯(lián)控制指標后就可以在錄入結(jié)果時自動判定合格與否。方法群組的概念要特別注意它不是測試項目的分組而是“樣品全流程”的檢測項目集合。比如樣品類型“廢水”對應(yīng)一個方法群組群組里包含 pH、COD、氨氮等多個測試項目。當(dāng)用戶在樣品登錄時選擇“廢水”類型系統(tǒng)自動把該群組下的全部測試項目帶到樣品上。這樣極大簡化了檢驗人員的操作。分析項目排序用于客戶報表和客戶查詢。因為不同實驗室關(guān)注的分析項目順序不同所以不能按創(chuàng)建時間排序而是要給每個分析項目一個可維護的排序字段??刂浦笜说燃壘S護則是對指標指定等級比如“合格”“不合格”“臨界”等。控制指標參數(shù)管理需要支持配置檢測結(jié)果的單位上下限方便系統(tǒng)自動判讀。從實現(xiàn)角度我建議形成這樣的表關(guān)系analysis_item分析項目表analysis_method分析方法表test_project測試項目表關(guān)聯(lián)分析項目和方法冗余控制指標method_group方法群組表method_group_detail群組明細關(guān)聯(lián)測試項目并排序這個模型一旦建好后續(xù)檢測業(yè)務(wù)模塊會順暢很多。樣品登錄時通過樣品類型找到默認方法群組再展開細項。3.4 檢測業(yè)務(wù)全流程樣品登錄、結(jié)果錄入、審核、審批檢測業(yè)務(wù)管理是 LIMS 的主業(yè)務(wù)線。樣品登錄是樣品的初始化操作支持通過模板登錄。這里“模板”等于把樣品類型、方法群組、采樣點、客戶等常用信息封裝好登錄時只需選擇模板并填入樣品編號和時間。分析結(jié)果錄入由檢驗人員填寫檢測結(jié)果系統(tǒng)根據(jù)控制指標自動展示是否合格。審核和審批都是對樣品的質(zhì)量把關(guān)區(qū)別在于審核一般是檢驗科室內(nèi)部的確認審批是管理層級上的放行。兩者都可以“退回整個樣品”或“退回單個測試項目”。這種“整單退回”和“單項退回”并存的邏輯決定了樣品狀態(tài)不能只用一個主表字段。我的設(shè)計建議是sample主表放整體狀態(tài)比如“已登錄、檢測中、已審核、已審批、已退回”sample_test_result子表放每一個測試項目的結(jié)果和審批狀態(tài)主表的整體狀態(tài)由子表狀態(tài)匯總計算得出。例如兩個測試項目都“審核通過”主表才是“已審核”如果一個通過、一個退回主表狀態(tài)就要回到“檢測中”或“部分退回”。這樣才能正確處理“退回單個測試項目”后另一個項目不受影響。3.5 工作流與自動排程拖拽流程圖和定時任務(wù)怎么設(shè)計工作流模塊包含基礎(chǔ)信息管理和流程圖設(shè)計?;A(chǔ)信息管理要求流程名稱必填、流程類型必填、可配置監(jiān)控人員多選、查詢?nèi)藛T多選、排序必填。查詢條件包含流程類型和關(guān)鍵字還能查詢待處理、我申請、我參與、相關(guān)流程信息。監(jiān)控人員對于未完成的流程可以強制關(guān)閉。這說明工作流引擎不僅要驅(qū)動節(jié)點跳轉(zhuǎn)還要提供“代理”和“干預(yù)”能力。流程圖設(shè)計采用 B/S 端拖拽方式包含兩類樣品全流程和一般工作流。樣品全流程要覆蓋樣品從登錄到報告發(fā)出的完整鏈路一般工作流用于物資領(lǐng)用、設(shè)備維修、人員培訓(xùn)申請等普通業(yè)務(wù)流程。文檔還提到“能夠?qū)I(yè)務(wù)流程驅(qū)動進行二次開發(fā)”這句話的意思是工作流引擎要預(yù)留監(jiān)聽器和 Java 回調(diào)接口允許在流程節(jié)點進入和離開時執(zhí)行自定義業(yè)務(wù)邏輯。自動排程實現(xiàn)通用的自動排程管理比如樣品自動登錄、自動發(fā)送郵件。這里說的“自動排程”不是簡單的 Quartz 固定任務(wù)而是允許用戶在界面上配置任務(wù)類型、執(zhí)行頻率、執(zhí)行參數(shù)。配置要存數(shù)據(jù)庫執(zhí)行時由調(diào)度框架讀取配置并觸發(fā)執(zhí)行器。日志表要記錄每次任務(wù)的開始時間、結(jié)束時間、執(zhí)行狀態(tài)和異常信息。4. 從文檔到代碼需求怎么映射到數(shù)據(jù)模型與接口4.1 需求條目的結(jié)構(gòu)化提取標識號、優(yōu)先級、業(yè)務(wù)規(guī)則拿到這份 SRS我建議先做一個需求登記表把文檔里每一條需求條目變成可跟蹤的工作項。這里說的“工作項”不是一句話描述而是要包含標識號、功能名稱、優(yōu)先級、執(zhí)行者、業(yè)務(wù)規(guī)則、功能需求、數(shù)據(jù)模型字段。文檔里的標識號非常規(guī)范如 U009、U010這些標識號可以直接作為開發(fā)任務(wù)編號和測試用例的前綴。下面用培訓(xùn)管理 U014 做一個提取示例字段內(nèi)容標識號U014功能名稱培訓(xùn)管理優(yōu)先級高執(zhí)行者系統(tǒng)管理員業(yè)務(wù)規(guī)則課程代號必填且唯一課程類型必填內(nèi)部/外部學(xué)時保留一位小數(shù)有效期可為空表示一直有效重測提醒日期可為空功能需求對培訓(xùn)課程基礎(chǔ)資料增刪改查查看有多少人員通過該培訓(xùn)課程數(shù)據(jù)模型字段課程代號、課程名稱、課程類型、學(xué)時、培訓(xùn)講師、有效期、重測提醒日期、備注做完這個表格你就有了一張需求追蹤矩陣。開發(fā)時每完成一個需求就在對應(yīng)行打勾測試時也按這個表寫用例。這樣可以避免“文檔是文檔、代碼是代碼、測試是測試”的三張皮問題。4.2 數(shù)據(jù)模型設(shè)計示例培訓(xùn)管理、人員管理的字段拆解文檔對培訓(xùn)管理和人員管理的數(shù)據(jù)模型描述得很細可以直接轉(zhuǎn)成 SQL 建表語句。下面是培訓(xùn)課程表CREATE TABLE training_course ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 主鍵, course_code VARCHAR(50) NOT NULL UNIQUE COMMENT 課程代號必填且唯一, course_name VARCHAR(200) NOT NULL COMMENT 課程名稱, course_type TINYINT NOT NULL COMMENT 課程類型1內(nèi)部培訓(xùn)2外部培訓(xùn), hours DECIMAL(4, 1) COMMENT 學(xué)時單位小時保留一位小數(shù), lecturer VARCHAR(100) COMMENT 培訓(xùn)講師可以是外部人員, valid_days INT COMMENT 有效期單位天為空表示一直有效, remind_days INT COMMENT 重測提醒日期單位天為空表示不提醒, remark VARCHAR(500) COMMENT 備注, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) COMMENT 培訓(xùn)課程表;這里的course_code設(shè)為唯一約束對應(yīng)“必填且唯一”。hours用DECIMAL(4,1)保證一位小數(shù)。valid_days為空表示一直有效這個空值邏輯必須在代碼里處理不能簡單用 0 表示。重測提醒日期remind_days用于定時任務(wù)生成提醒記錄。再來是人員培訓(xùn)記錄表CREATE TABLE person_training ( id BIGINT PRIMARY KEY AUTO_INCREMENT, user_id BIGINT NOT NULL COMMENT 人員ID關(guān)聯(lián)框架用戶表, course_id BIGINT NOT NULL COMMENT 培訓(xùn)課程ID, acquire_date DATE NOT NULL COMMENT 獲取培訓(xùn)的日期默認當(dāng)天, expire_date DATE COMMENT 過期時間根據(jù)課程有效期自動計算, status TINYINT DEFAULT 0 COMMENT 0正常1已過期, ability_level TINYINT COMMENT 能力等級1了解2熟練3掌握4精通, FOREIGN KEY (course_id) REFERENCES training_course(id), UNIQUE KEY uk_user_course (user_id, course_id) ) COMMENT 人員培訓(xùn)記錄表;expire_date的值是acquire_date valid_days如果valid_days為空則expire_date為空表示一直有效。status不能靠人工維護要用定時任務(wù)每天跑一次把expire_date CURDATE()的記錄狀態(tài)置為 1。同時當(dāng)人員培訓(xùn)狀態(tài)為已過期時業(yè)務(wù)代碼要攔截該人員被安排為檢測項負責(zé)人。4.3 功能需求到接口設(shè)計的映射表功能需求明確后接口設(shè)計就是水到渠成的事。下面列出幾個關(guān)鍵模塊的 REST 接口設(shè)計供二次開發(fā)時參考功能模塊方法路徑說明權(quán)限位置管理GET/api/locations?parentId查詢位置樹或子位置群組成員位置管理POST/api/locations新增位置群組成員位置管理PUT/api/locations/{id}修改位置群組成員采樣點管理GET/api/sample-points?codename模糊查詢采樣點群組成員培訓(xùn)管理GET/api/training-courses分頁查詢課程系統(tǒng)管理員培訓(xùn)管理POST/api/training-courses添加課程系統(tǒng)管理員樣品登錄POST/api/samples登錄樣品服務(wù)端根據(jù)模板展開測試項目樣品管理員結(jié)果錄入PUT/api/samples/{sampleId}/results批量錄入檢測結(jié)果檢驗人員審核POST/api/samples/{sampleId}/audit?wholefalse審核樣品支持單項退回實驗室負責(zé)人審批POST/api/samples/{sampleId}/approve審批放行實驗室主任接口設(shè)計要遵循一個原則基礎(chǔ)信息管理走通用 CRUD檢測業(yè)務(wù)走“狀態(tài)機驅(qū)動”的專用接口。比如審核接口不是簡單地 PUT 一個字段而是要在后端校驗當(dāng)前狀態(tài)是否允許審核并同步更新所有測試項目狀態(tài)。這些校驗邏輯就是需求中“業(yè)務(wù)規(guī)則”的代碼化表達。5. 避坑清單需求說明書落地時最容易翻車的五個注意點5.1 群組權(quán)限被當(dāng)成角色權(quán)限做導(dǎo)致數(shù)據(jù)越權(quán)現(xiàn)象系統(tǒng)上線后A 科室的檢驗人員能在下拉框里看到 B 科室的采樣點甚至能打開別人的樣品詳情。但菜單權(quán)限明明已經(jīng)控制得很好了。原因需求中反復(fù)強調(diào)“位置具有群組權(quán)限只有屬于該群組的人員才能查看、編輯、修改”。很多開發(fā)團隊把“群組”理解成了“角色”只做了功能權(quán)限控制沒有在數(shù)據(jù)查詢時增加群組過濾。結(jié)果就是每個按鈕都有權(quán)限但列表數(shù)據(jù)是全量的。解決所有業(yè)務(wù)表增加group_id字段并在查詢服務(wù)中統(tǒng)一增加數(shù)據(jù)權(quán)限過濾器。后端在訪問每個帶群組的實體時先從當(dāng)前用戶上下文取出group_ids然后強制拼上WHERE group_id IN (:group_ids)。如果用戶有跨群組查看需求再單獨走白名單接口而不是默認放開。5.2 樣品“單項退回”后主表狀態(tài)亂掉現(xiàn)象樣品有多個測試項目審核時退回其中一個項目結(jié)果整個樣品的狀態(tài)變成了“已退回”其他項目也無法繼續(xù)操作。原因需求寫明“能夠退回整個樣品也可以退回單個測試項目”但開發(fā)時只給sample主表設(shè)計了一個status字段。單項退回沒有地方記錄只能硬把主表狀態(tài)改成退回導(dǎo)致所有子項都被凍結(jié)。解決把審核狀態(tài)放到sample_test_result子表上每個測試項目都有自己的audit_status待審核、通過、退回。主表sample.status由子表匯總計算得出。你可以在狀態(tài)變更后執(zhí)行一個聚合SQLUPDATE sample s SET s.status (SELECT CASE WHEN COUNT(*) SUM(CASE WHEN r.audit_status通過 THEN 1 ELSE 0 END) THEN 已審核 WHEN EXISTS(SELECT 1 FROM sample_test_result r WHERE r.sample_id s.id AND r.audit_status退回) THEN 部分退回 ELSE 檢測中 END FROM sample_test_result r WHERE r.sample_id s.id) WHERE s.id ?。這樣單項退回只會影響對應(yīng)的測試項目其他項目可以繼續(xù)審核。5.3 培訓(xùn)過期時間手動維護導(dǎo)致過期人員還在干活現(xiàn)象人員的培訓(xùn)記錄顯示已經(jīng)過了有效期但人員狀態(tài)還是“正?!毕到y(tǒng)還能把他安排為檢測項目負責(zé)人。原因需求里寫了“培訓(xùn)過期時間根據(jù)培訓(xùn)獲取時間自動計算”但開發(fā)時為了趕進度把過期時間做成了手動選擇字段甚至默認不給值。人員狀態(tài)也是人工修改一忙就忘了更新。解決培訓(xùn)記錄的服務(wù)層在新增或修改記錄時強制計算過期時間不提供手動錄入過期時間的入口。同時寫一個定時任務(wù)每天凌晨掃描person_training表把expire_date IS NOT NULL AND expire_date CURDATE()的記錄狀態(tài)更新為已過期。另外在人員分配檢測任務(wù)時還要即時校驗該人員的核心培訓(xùn)是否在有效期內(nèi)如果過期則攔截分配操作。5.4 “文檔管理”和“文檔查詢”做成兩套模塊邏輯重復(fù)現(xiàn)象系統(tǒng)里出現(xiàn)兩個文檔功能入口一個叫“文檔管理”一個叫“文檔查詢”都能上傳、編輯、刪除文檔但數(shù)據(jù)不互通維護很痛苦。原因文檔第六章分別列了 U018 文檔管理和 U023 文檔查詢看上去是兩個功能。實際上 U023 是 U018 的查詢和操作入口本質(zhì)是同一個實體。開發(fā)時沒有識別出它們的實體相同直接建了兩張表。解決統(tǒng)一建模為一個doc_file表文檔管理后臺提供增刪改和目錄維護文檔查詢頁提供模糊搜索、預(yù)覽、下載、編輯。兩個入口走同一個 service 層只是頁面布局和功能按鈕不同。我在做需求拆解時會先畫一張實體清單發(fā)現(xiàn)兩個需求條目描述同樣的實體立即合并。5.5 自動排程日志只記錄成功不記錄失敗現(xiàn)象某個排程任務(wù)比如自動發(fā)送樣品通知郵件執(zhí)行失敗但日志表里一片空白無法定位問題。原因需求只寫了“自動排程日志查看排程日志”開發(fā)時日志表只記錄了任務(wù)執(zhí)行成功的時間異常信息沒捕獲。結(jié)果任務(wù)掛了你根本不知道是哪一步出錯。解決日志表至少包含task_name, execute_time, status(0成功/1失敗), error_message, exception_stack, duration_ms字段。任務(wù)統(tǒng)一走執(zhí)行器包裝類在try-catch中把異常棧寫入日志表失敗狀態(tài)還要觸發(fā)提醒管理給系統(tǒng)管理員發(fā)站內(nèi)通知。如果是不允許失敗的定時任務(wù)增加重試次數(shù)和失敗告警。6. 二次開發(fā)把這份 SRS 變成你自己的 LIMS 骨架拿到這份需求說明書我建議你不要急著打開 IDE 寫實體類。先做三件事第一把文檔里的“標識號”整理成需求追蹤矩陣標記出“復(fù)用框架”和“新建模塊”的邊界第二把文檔中“數(shù)據(jù)模型”部分直接轉(zhuǎn)換成 SQL 腳本作為數(shù)據(jù)庫表的初版第三用一份原型工具把六個核心頁面的草圖補出來——位置管理、樣品登錄、結(jié)果錄入、審核、審批、自動排程配置。改造時優(yōu)先按“樣品全流程”打通最小閉環(huán)配置好基礎(chǔ)信息中的位置、采樣點、企業(yè)、樣品類型、量綱維護幾個分析項目和方法組合成測試項目建好方法群組然后做一次完整的樣品登錄到審批通過的操作。這條鏈路一旦通了整個系統(tǒng)的骨架就立住了。其他模塊比如物資、設(shè)備、培訓(xùn)本質(zhì)上都是圍繞這個主線的支撐數(shù)據(jù)。我會把控制邏輯拆成三層基礎(chǔ)數(shù)據(jù)層只提供 CRUD業(yè)務(wù)服務(wù)層處理狀態(tài)機、群組權(quán)限、自動計算過期時間流程驅(qū)動層走工作流引擎。如果需要快速驗證可以給每個接口寫一個測試用例重點測“單項退回”和“培訓(xùn)過期攔截”這兩個最容易錯的業(yè)務(wù)規(guī)則。說一點我的血淚經(jīng)驗我曾經(jīng)把一份類似的需求文檔直接扔給剛?cè)肼毜耐抡罩鴮懡Y(jié)果兩個月后因為數(shù)據(jù)權(quán)限沒做群組隔離所有接口返工重來。從那以后我每次拿到 SRS 都會先花一周做需求拆解和實體識別把群組權(quán)限和狀態(tài)轉(zhuǎn)換規(guī)則畫成表再讓開發(fā)動手。希望這份文檔的解析能幫你少走我當(dāng)時走過的彎路也希望你項目順利。本文還有配套的精品資源點擊獲取