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