實(shí)戰(zhàn):一天交付疾控應(yīng)急管理系統(tǒng))
早上9點(diǎn)疾控中心信息科的老師發(fā)來(lái)消息領(lǐng)導(dǎo)催著要應(yīng)急管理的系統(tǒng)化方案下周演示你們能不能做換成以前從需求調(diào)研到演示環(huán)境排期少說(shuō)一周。但這回我只排了一天而且把核心工作交給了兩個(gè)AI工具Hermes負(fù)責(zé)任務(wù)拆解、需求設(shè)計(jì)和數(shù)據(jù)建模Cursor負(fù)責(zé)把設(shè)計(jì)翻譯成代碼。做完之后我特意復(fù)盤了一遍發(fā)現(xiàn)這個(gè)一天交付不是運(yùn)氣而是一套新工作流帶來(lái)的必然結(jié)果。先說(shuō)明這個(gè)項(xiàng)目到底做了什么疾控應(yīng)急管理系統(tǒng)覆蓋突發(fā)事件上報(bào)、應(yīng)急物資臺(tái)賬與調(diào)撥、應(yīng)急隊(duì)伍調(diào)度、處置流程跟蹤外加一個(gè)指揮大屏展示和一套基礎(chǔ)權(quán)限管理。系統(tǒng)本身不是高并發(fā)高復(fù)雜度的互聯(lián)網(wǎng)產(chǎn)品但業(yè)務(wù)流程瑣碎、狀態(tài)流轉(zhuǎn)多、報(bào)表口徑多這正是AI Agent最擅長(zhǎng)處理的場(chǎng)景。這篇文章把Hermes和Cursor的分工、提示詞怎么設(shè)計(jì)、代碼怎么落地、聯(lián)調(diào)時(shí)哪些環(huán)節(jié)最坑完整寫出來(lái)供想做類似項(xiàng)目的團(tuán)隊(duì)參考。1. 為什么選Hermes Cursor而不是傳統(tǒng)協(xié)作方式1.1 疾控應(yīng)急需求的真實(shí)痛點(diǎn)疾控行業(yè)的應(yīng)急管理系統(tǒng)需求來(lái)源往往很原始。信息科老師給你的不是PRD而是幾句話現(xiàn)在發(fā)生突發(fā)公共衛(wèi)生事件都是打電話、發(fā)Excel領(lǐng)導(dǎo)要看實(shí)時(shí)進(jìn)展物資調(diào)撥也要能查。真正開始梳理的時(shí)候會(huì)發(fā)現(xiàn)這里邊牽扯的角色很雜一線報(bào)告人員、應(yīng)急辦審核人員、物資管理員、應(yīng)急隊(duì)伍隊(duì)長(zhǎng)、中心領(lǐng)導(dǎo)。每個(gè)角色關(guān)心的數(shù)據(jù)維度都不一樣。傳統(tǒng)開發(fā)流程在這種場(chǎng)景下有天然短板。需求靠口頭加Excel傳遞等開發(fā)把原型做出來(lái)業(yè)務(wù)人員才反應(yīng)過(guò)來(lái)哦我要的不是這個(gè)。一版一版改時(shí)間全耗在需求確認(rèn)上。而且疾控應(yīng)急有個(gè)特點(diǎn)流程不能隨便設(shè)計(jì)必須跟上實(shí)際的應(yīng)急預(yù)案口徑比如事件分級(jí)、響應(yīng)時(shí)間節(jié)點(diǎn)、物資分類編碼這些都不是拍腦袋能定的。所以我這次刻意把流程倒過(guò)來(lái)先讓AI Agent把模糊需求逼成結(jié)構(gòu)化需求再讓人做業(yè)務(wù)口徑把關(guān)最后才交給代碼生成工具去寫。這套順序是項(xiàng)目和傳統(tǒng)方式最不一樣的地方。1.2 Hermes和Cursor的分工邏輯很多團(tuán)隊(duì)用AI編程的姿勢(shì)是打開Cursor讓AI直接生成整個(gè)項(xiàng)目。我試過(guò)結(jié)果是一堆看似能跑但邏輯殘缺的代碼尤其是表結(jié)構(gòu)設(shè)計(jì)前后矛盾改起來(lái)比重寫還費(fèi)勁。原因很簡(jiǎn)單代碼生成工具擅長(zhǎng)在明確任務(wù)下執(zhí)行不擅長(zhǎng)幫你把需求想清楚。需求都沒(méi)收斂代碼只會(huì)越寫越亂。Hermes在這里承擔(dān)的是需求Agent的角色。我給它喂原始訴求它會(huì)基于公開行業(yè)知識(shí)庫(kù)補(bǔ)全出功能清單、角色權(quán)限、狀態(tài)流轉(zhuǎn)、數(shù)據(jù)實(shí)體。它不是人類業(yè)務(wù)專家但它能把該設(shè)計(jì)什么東西這件事窮舉得比較完整。我再基于對(duì)疾控業(yè)務(wù)的理解把里面不符合實(shí)際口徑的東西刪掉或修正。這一步做完數(shù)據(jù)庫(kù)表、接口清單、頁(yè)面清單基本就穩(wěn)定了。Cursor承擔(dān)的是編碼執(zhí)行的角色。設(shè)計(jì)定稿之后把功能描述、表結(jié)構(gòu)、接口約定喂給Cursor讓它生成代碼。因?yàn)檩斎胍呀?jīng)很明確它輸出的代碼質(zhì)量遠(yuǎn)高于從零直接寫。說(shuō)白了Hermes做的是想清楚做什么Cursor做的是快速做完。1.3 一天的排期長(zhǎng)什么樣很多人聽到1天做完第一反應(yīng)是通宵。實(shí)際排下來(lái)我基本是正常上下班晚上7點(diǎn)前收工。節(jié)奏如下時(shí)間段任務(wù)使用工具08:30-10:30需求梳理、功能清單、數(shù)據(jù)建模Hermes10:30-12:00項(xiàng)目初始化、用戶權(quán)限模塊Cursor13:30-16:30事件、物資、隊(duì)伍、大屏四大模塊Cursor16:30-18:00聯(lián)調(diào)自測(cè)、修復(fù)BugCursor 人工Review18:00-19:00造演示數(shù)據(jù)、跑通演示流程人工這個(gè)排期能成立的前提是上午的設(shè)計(jì)階段真的想清楚了而不是花一上午討論這個(gè)按鈕放左邊還是右邊。AI的價(jià)值之一就是幫你快速跳過(guò)無(wú)意義的糾結(jié)。技術(shù)棧選擇上也說(shuō)下我的考慮后端用Spring Boot 3 MyBatis-Plus MySQL 8前端用Vue3 Element Plus ECharts。為什么不用Python系因?yàn)榧部匦袠I(yè)的信息科后續(xù)大概率要自己維護(hù)Java體系在國(guó)內(nèi)最普及交接成本最低。而且Cursor對(duì)Spring Boot的生態(tài)理解足夠深生成出來(lái)的代碼風(fēng)格統(tǒng)一接手的人不會(huì)覺(jué)得陌生。2. 用Hermes做需求梳理與數(shù)據(jù)建模的完整過(guò)程2.1 第一輪對(duì)話把口頭需求變成功能清單我一開始沒(méi)有指望Hermes一步到位。第一輪對(duì)話我做的事情很簡(jiǎn)單給它一個(gè)角色設(shè)定和一段原始訴求然后讓它窮舉。你現(xiàn)在是一名有十年經(jīng)驗(yàn)的疾控信息系統(tǒng)產(chǎn)品經(jīng)理。我們需要開發(fā)一套疾控應(yīng)急管理系統(tǒng)使用方包括一線報(bào)告人員、應(yīng)急辦、物資管理員、應(yīng)急隊(duì)伍、中心領(lǐng)導(dǎo)。請(qǐng)基于疾控中心實(shí)際的突發(fā)公共衛(wèi)生事件應(yīng)急業(yè)務(wù)先輸出完整的功能清單包括事件管理、物資管理、應(yīng)急隊(duì)伍管理、指揮大屏、系統(tǒng)管理每個(gè)模塊下列出核心功能點(diǎn)并說(shuō)明每個(gè)功能點(diǎn)的使用角色。Hermes第一輪輸出大概有8000多字把業(yè)務(wù)框架搭得很全。它列出的功能模塊遠(yuǎn)遠(yuǎn)超出我原始的訴求例如事件管理里補(bǔ)充了事件分級(jí)動(dòng)態(tài)調(diào)整事件關(guān)聯(lián)報(bào)告結(jié)案審核歸檔物資里補(bǔ)充了安全庫(kù)存預(yù)警批次效期管理隊(duì)伍里補(bǔ)充了值班排班出勤記錄。這些其實(shí)是行業(yè)里已經(jīng)有的標(biāo)準(zhǔn)做法但如果你不是這個(gè)業(yè)務(wù)背景的人很容易漏。這一步的產(chǎn)出是一份功能清單。我不關(guān)心格式漂不漂亮只關(guān)心一件事還有哪些功能是業(yè)務(wù)方會(huì)問(wèn)這個(gè)有沒(méi)有的。2.2 第二輪對(duì)話從功能清單到數(shù)據(jù)庫(kù)表結(jié)構(gòu)功能清單確認(rèn)后我繼續(xù)讓Hermes做數(shù)據(jù)建模基于以上功能清單請(qǐng)?jiān)O(shè)計(jì)MySQL數(shù)據(jù)庫(kù)表結(jié)構(gòu)。要求每張表給出表名、字段名、類型、注釋、主鍵策略標(biāo)注表之間的外鍵關(guān)系事件、用戶、物資、隊(duì)伍之間如果有關(guān)聯(lián)需要給出關(guān)聯(lián)表設(shè)計(jì)考慮到應(yīng)急管理系統(tǒng)需要審計(jì)追溯操作日志、狀態(tài)變更記錄不能缺失。它給出的核心表大致如下節(jié)選關(guān)鍵字段CREATE TABLE event_info ( id BIGINT PRIMARY KEY AUTO_INCREMENT, event_code VARCHAR(32) NOT NULL COMMENT 事件編號(hào), event_name VARCHAR(200) NOT NULL COMMENT 事件名稱, event_type VARCHAR(50) COMMENT 事件類型編碼, event_level VARCHAR(10) COMMENT 事件等級(jí)一般/較大/重大/特別重大, address VARCHAR(255) COMMENT 事發(fā)地址, report_user_id BIGINT COMMENT 報(bào)告人ID, report_time DATETIME COMMENT 報(bào)告時(shí)間, status TINYINT COMMENT 0草稿 1待審核 2處置中 3已結(jié)案 4已退回, description TEXT COMMENT 事件描述, UNIQUE KEY uk_event_code (event_code) );這版設(shè)計(jì)覆蓋了主要實(shí)體事件、事件處置記錄、物資信息、出入庫(kù)流水、調(diào)撥單、隊(duì)伍、隊(duì)員、系統(tǒng)用戶、角色、菜單、操作日志。但我看過(guò)之后發(fā)現(xiàn)幾個(gè)問(wèn)題一是事件和調(diào)撥單、事件和隊(duì)伍派單之間沒(méi)有關(guān)聯(lián)表這會(huì)導(dǎo)致這個(gè)事件動(dòng)了哪些物資、派了哪支隊(duì)伍查不到二是缺少事件附件表實(shí)際業(yè)務(wù)里現(xiàn)場(chǎng)照片、檢測(cè)報(bào)告都是要留檔的三是沒(méi)有考慮物資批次效期疾控物資是有失效日期的。我又讓Hermes補(bǔ)了一輪加了三張表event_material_rel事件物資關(guān)聯(lián)表、event_team_rel事件隊(duì)伍關(guān)聯(lián)表、attach_file附件表。到這一步數(shù)據(jù)模型才算真正能落地。2.3 人工把關(guān)清單哪些不能全信AI這是我最想強(qiáng)調(diào)的部分。AI建模速度快但它不知道你所在地區(qū)的實(shí)際業(yè)務(wù)口徑以下幾個(gè)地方必須人工過(guò)一遍檢查點(diǎn)AI容易出的問(wèn)題人工把關(guān)方式權(quán)限模型只設(shè)計(jì)了菜單權(quán)限漏了按鈕權(quán)限逐角色確認(rèn)誰(shuí)能新增、誰(shuí)能審核、誰(shuí)能結(jié)案狀態(tài)流轉(zhuǎn)狀態(tài)枚舉隨意定義沒(méi)有閉環(huán)對(duì)照應(yīng)急預(yù)案確認(rèn)事件必須經(jīng)過(guò)哪些狀態(tài)字段字典事件類型、物資分類亂編替換成本地實(shí)際使用的編碼體系刪除策略喜歡物理刪除破壞審計(jì)鏈要求業(yè)務(wù)表一律邏輯刪除必填校驗(yàn)很多字段漏掉NOT NULL核對(duì)上報(bào)頁(yè)面必須填哪些項(xiàng)做完這輪把關(guān)設(shè)計(jì)階段才算結(jié)束。后面編碼快不快完全取決于這一步做得細(xì)不細(xì)。2.4 部署方式備注Hermes我是在Windows本機(jī)用Docker Desktop跑起來(lái)的沒(méi)有用遠(yuǎn)程API。本地部署的好處是文檔、SQL這些中間產(chǎn)物可以直接落盤不用來(lái)回復(fù)制隱私上也更踏實(shí)。配置要求不算高8G內(nèi)存的機(jī)器能流暢對(duì)話。實(shí)際使用中我發(fā)現(xiàn)對(duì)話上下文越長(zhǎng)越容易偏離主題所以建議一個(gè)大型任務(wù)拆成幾次獨(dú)立會(huì)話每次會(huì)話聚焦一個(gè)產(chǎn)出物比如本次會(huì)話只做數(shù)據(jù)建模。3. Cursor編碼落地核心模塊的實(shí)戰(zhàn)細(xì)節(jié)3.1 項(xiàng)目骨架和基建怎么搭設(shè)計(jì)稿定下來(lái)之后Cursor的工作從搭建骨架開始。我先讓它生成整個(gè)工程的基礎(chǔ)結(jié)構(gòu)包括pom依賴、application.yml、統(tǒng)一返回對(duì)象R、全局異常處理器、MyBatis-Plus分頁(yè)配置、JWT登錄攔截器。給Cursor的指令要非常具體比如創(chuàng)建一個(gè)Spring Boot 3項(xiàng)目要求引入spring-boot-starter-web、mybatis-plus-boot-starter、mysql-connector-j、lombok、jjwt、hutool寫一個(gè)統(tǒng)一的返回結(jié)果類R包含code、msg、data寫一個(gè)全局異常處理器處理業(yè)務(wù)異常和參數(shù)校驗(yàn)異常yml配置數(shù)據(jù)庫(kù)連接和mybatis-plus的邏輯刪除、駝峰映射。Cursor生成的代碼質(zhì)量在這個(gè)階段是最穩(wěn)定的因?yàn)槎际菢?biāo)準(zhǔn)模板。真正需要人工介入的是代碼組織方式。AI默認(rèn)會(huì)生成一個(gè)幾百行的Service類把所有方法堆在一起。我會(huì)讓它拆成EventService、MaterialService、TeamService、DashboardService每個(gè)Service只做自己領(lǐng)域的邏輯。這個(gè)拆分越早做后面越省事。3.2 應(yīng)急事件上報(bào)模塊的編碼事件模塊是整個(gè)系統(tǒng)的核心包含上報(bào)、審核、處置、結(jié)案、退回五個(gè)動(dòng)作。我讓Cursor按狀態(tài)機(jī)思路實(shí)現(xiàn)而不是隨手寫if-else。核心狀態(tài)流轉(zhuǎn)如下草稿 - 待審核 - 處置中 - 已結(jié)案待審核可以被退回成草稿。刪除只允許草稿狀態(tài)執(zhí)行。這個(gè)約束看起來(lái)簡(jiǎn)單但如果散落在各個(gè)方法里很容易漏。我讓Cursor生成的核心Service片段Transactional public void updateStatus(Long id, Byte targetStatus, Long operatorId) { EventInfo event getById(id); if (event null) { throw new BizException(事件不存在); } // 狀態(tài)流轉(zhuǎn)校驗(yàn)當(dāng)前狀態(tài)是否允許變更到目標(biāo)狀態(tài) if (!StatusFlow.canTransit(event.getStatus(), targetStatus)) { throw new BizException(非法狀態(tài)流轉(zhuǎn): event.getStatus() - targetStatus); } event.setStatus(targetStatus); updateById(event); // 寫入狀態(tài)變更記錄用于審計(jì) EventStatusLog log new EventStatusLog(); log.setEventId(id); log.setFromStatus(event.getStatus()); log.setToStatus(targetStatus); log.setOperatorId(operatorId); log.setOperateTime(LocalDateTime.now()); eventStatusLogMapper.insert(log); }這里有個(gè)值得注意的點(diǎn)Cursor默認(rèn)生成的狀態(tài)校驗(yàn)就是簡(jiǎn)單的if判斷比如if (!1.equals(status))。我要求它抽取一個(gè)StatusFlow.canTransit方法把所有合法流轉(zhuǎn)定義在同一個(gè)類里。這樣以后要調(diào)整流程只改一處不會(huì)出現(xiàn)這里能退、那里不能退的詭異情況。3.3 物資庫(kù)存和調(diào)撥并發(fā)控制不能省疾控應(yīng)急系統(tǒng)的并發(fā)量不大但不代表可以裸扣庫(kù)存。調(diào)撥、出庫(kù)、盤點(diǎn)幾個(gè)操作同時(shí)發(fā)生時(shí)庫(kù)存數(shù)據(jù)會(huì)出現(xiàn)偏差。我要求Cursor在扣減庫(kù)存時(shí)使用樂(lè)觀鎖用一條SQL完成扣減并校驗(yàn)庫(kù)存充足Transactional public void outbound(MaterialIoRecord record) { // 先扣庫(kù)存受影響行數(shù)為0說(shuō)明庫(kù)存不足或物料不存在 int rows materialInfoMapper.deductStock( record.getMaterialId(), record.getQuantity() ); if (rows 0) { throw new BizException(庫(kù)存不足扣減失敗); } // 再寫入庫(kù)流水 materialIoRecordMapper.insert(record); }對(duì)應(yīng)的Mapper方法Update(UPDATE material_info SET stock stock - #{quantity}, update_time NOW() WHERE id #{materialId} AND stock #{quantity}) int deductStock(Param(materialId) Long materialId, Param(quantity) Integer quantity);注意這里用了stock #{quantity}條件加上受影響行數(shù)判斷天然避免了負(fù)數(shù)庫(kù)存。調(diào)撥單邏輯類似但要同時(shí)處理調(diào)出倉(cāng)扣減和調(diào)入倉(cāng)增加兩個(gè)操作必須在同一個(gè)事務(wù)里。我給Cursor的要求是調(diào)撥單創(chuàng)建時(shí)同時(shí)生成兩條出入庫(kù)流水調(diào)出為出庫(kù)調(diào)入為入庫(kù)任何一步失敗全部回滾。這個(gè)約束是物資模塊的底線不能妥協(xié)。3.4 大屏統(tǒng)計(jì)和權(quán)限控制指揮大屏是這個(gè)項(xiàng)目的門面領(lǐng)導(dǎo)最先看的就是它。大屏需要展示的內(nèi)容包括待處置事件數(shù)、近7日事件趨勢(shì)、物資預(yù)警清單、應(yīng)急隊(duì)伍在崗狀態(tài)。我用一個(gè)DashboardController聚合四個(gè)統(tǒng)計(jì)接口。-- 近7日事件趨勢(shì) SELECT DATE_FORMAT(report_time, %Y-%m-%d) AS day, COUNT(*) AS cnt FROM event_info WHERE report_time DATE_SUB(CURDATE(), INTERVAL 7 DAY) GROUP BY DATE_FORMAT(report_time, %Y-%m-%d) ORDER BY day;這種統(tǒng)計(jì)SQL對(duì)數(shù)據(jù)庫(kù)壓力不大MySQL處理幾萬(wàn)行數(shù)據(jù)毫無(wú)壓力。但要注意給report_time和status建索引否則數(shù)據(jù)量上來(lái)后大屏響應(yīng)會(huì)變慢。這是AI容易忽略的地方它生成的Mapper可能不帶索引建議需要人工在Review時(shí)補(bǔ)上。權(quán)限控制方面Cursor可以生成基于注解的接口權(quán)限校驗(yàn)前端配合按鈕級(jí)指令。但這里有個(gè)隱蔽的問(wèn)題后面聯(lián)調(diào)時(shí)會(huì)詳細(xì)說(shuō)AI生成的菜單表和接口注解里的權(quán)限標(biāo)識(shí)經(jīng)常對(duì)不上。4. 聯(lián)調(diào)階段踩到的坑和驗(yàn)收清單4.1 坑一事件編號(hào)并發(fā)重復(fù)第一次聯(lián)調(diào)時(shí)我快速點(diǎn)擊兩次上報(bào)結(jié)果第二條數(shù)據(jù)直接插入失敗數(shù)據(jù)庫(kù)報(bào)唯一索引沖突。排查過(guò)程很快看日志發(fā)現(xiàn)報(bào)錯(cuò)指向uk_event_code再往前翻單號(hào)生成邏輯發(fā)現(xiàn)Cursor用new Date().getTime()加3位隨機(jī)數(shù)生成單號(hào)。理論上毫秒級(jí)時(shí)間戳一般不會(huì)重復(fù)但兩臺(tái)機(jī)器時(shí)間一致或者單線程快速調(diào)用時(shí)隨機(jī)數(shù)還是可能碰撞。修復(fù)分兩層一是單號(hào)規(guī)則加上業(yè)務(wù)前綴、時(shí)間戳精確到毫秒、隨機(jī)數(shù)擴(kuò)大到5位二是保留數(shù)據(jù)庫(kù)唯一索引作為最終兜底。這種問(wèn)題靠AI自己是發(fā)現(xiàn)不了的它生成代碼時(shí)看不到數(shù)據(jù)庫(kù)里有唯一索引這個(gè)約束必須人工在Review時(shí)盯住。4.2 坑二菜單權(quán)限標(biāo)識(shí)和接口注解不一致這個(gè)坑排查了將近40分鐘?,F(xiàn)象是給管理員賬號(hào)分配了事件審核菜單權(quán)限登錄后打開審核頁(yè)面點(diǎn)擊通過(guò)按鈕卻提示無(wú)權(quán)限。數(shù)據(jù)庫(kù)菜單表里權(quán)限標(biāo)識(shí)是event:audit接口上的注解也是event:audit看起來(lái)沒(méi)問(wèn)題。最后把SQL日志打開發(fā)現(xiàn)前端按鈕調(diào)用的接口路徑是/api/event/approve而這個(gè)接口上的注解寫的是event:approve。菜單權(quán)限標(biāo)識(shí)和接口權(quán)限標(biāo)識(shí)不一致自然被攔截器攔下來(lái)。修復(fù)方法就是統(tǒng)一命名。我讓Cursor全局搜索所有RequiresPermission注解列出一個(gè)菜單權(quán)限表和注解對(duì)照表逐個(gè)核對(duì)。這個(gè)工作不復(fù)雜但很煩瑣。經(jīng)驗(yàn)是權(quán)限標(biāo)識(shí)這種元數(shù)據(jù)從設(shè)計(jì)階段就要定好命名規(guī)范否則AI在不同位置生成的標(biāo)識(shí)很容易漂移。4.3 其他值得注意的小問(wèn)題時(shí)間格式化是另一個(gè)常見問(wèn)題。Spring Boot默認(rèn)的Jackson配置會(huì)把LocalDateTime序列化成數(shù)組或時(shí)間戳前端拿到根本沒(méi)法直接用。Cursor生成的代碼不會(huì)主動(dòng)處理這個(gè)問(wèn)題我手動(dòng)加了一個(gè)全局Jackson配置統(tǒng)一輸出yyyy-MM-dd HH:mm:ss。還有事務(wù)注解丟失的問(wèn)題。AI生成Service方法時(shí)有時(shí)會(huì)忘記加Transactional。我Review時(shí)發(fā)現(xiàn)物資調(diào)撥方法里扣減庫(kù)存和寫流水兩個(gè)操作沒(méi)有放在一個(gè)事務(wù)里如果流水寫入失敗庫(kù)存就憑空少了。排查方法是全局搜索所有涉及多表寫入的Service方法逐個(gè)確認(rèn)事務(wù)注解。聯(lián)調(diào)階段我整理了一份驗(yàn)收清單適合所有AI輔助開發(fā)的項(xiàng)目檢查項(xiàng)檢查方式狀態(tài)事務(wù)完整性搜索所有多表寫入方法檢查Transactional通過(guò)唯一性約束檢查業(yè)務(wù)唯一字段是否建唯一索引通過(guò)權(quán)限標(biāo)識(shí)菜單權(quán)限和接口注解逐項(xiàng)對(duì)照通過(guò)SQL性能檢查大屏統(tǒng)計(jì)SQL走索引通過(guò)時(shí)間格式前后端聯(lián)調(diào)確認(rèn)顯示正常通過(guò)邏輯刪除確認(rèn)所有業(yè)務(wù)表繼承邏輯刪除字段通過(guò)5. 這套工作流的邊界和后續(xù)演進(jìn)5.1 什么樣的項(xiàng)目適合1天AI交付這次做完之后我仔細(xì)想過(guò)適用范圍。任何工作流都有邊界不能拿錘子看什么都是釘子。適合做1天AI交付的項(xiàng)目特征比較明顯以CRUD為主、業(yè)務(wù)流程標(biāo)準(zhǔn)、數(shù)據(jù)量不大、演示級(jí)交付可接受、業(yè)務(wù)口徑相對(duì)固定。疾控應(yīng)急管理系統(tǒng)恰好都滿足事件、物資、隊(duì)伍都是標(biāo)準(zhǔn)實(shí)體沒(méi)有復(fù)雜的推薦算法沒(méi)有高并發(fā)交易領(lǐng)導(dǎo)要的是流程跑通和數(shù)據(jù)可視化。不適合的場(chǎng)景我列了個(gè)表不適合場(chǎng)景原因高并發(fā)交易系統(tǒng)AI生成的代碼缺少壓測(cè)和性能調(diào)優(yōu)經(jīng)驗(yàn)強(qiáng)合規(guī)審計(jì)系統(tǒng)審計(jì)要求、加密算法、留痕規(guī)則需要專人把關(guān)復(fù)雜算法模塊AI只能模仿常見算法精細(xì)調(diào)參仍需專家硬件對(duì)接系統(tǒng)設(shè)備協(xié)議、串口通信、離線容錯(cuò)需要專業(yè)開發(fā)5.2 疾控應(yīng)急系統(tǒng)還能往哪個(gè)方向演進(jìn)當(dāng)前版本是Web端管理系統(tǒng)單機(jī)部署滿足演示和基本使用沒(méi)問(wèn)題。后續(xù)如果有生產(chǎn)環(huán)境真實(shí)使用有幾個(gè)方向必然要補(bǔ)。第一是GIS地圖展示。突發(fā)公共衛(wèi)生事件天然帶空間屬性領(lǐng)導(dǎo)看的是哪個(gè)區(qū)、哪個(gè)街道、周圍什么情況。前端用Leaflet或MapBox接入地圖事件上報(bào)時(shí)記錄坐標(biāo)大屏上按點(diǎn)位展示。這個(gè)功能的前后端代碼都可以借助AI生成但地圖底圖和坐標(biāo)系轉(zhuǎn)換需要人工把關(guān)。第二是通知推送。系統(tǒng)目前靠站內(nèi)消息提醒真實(shí)場(chǎng)景下一線人員不可能一直盯著系統(tǒng)。對(duì)接企業(yè)微信或短信平臺(tái)事件升級(jí)、物資預(yù)警時(shí)自動(dòng)推送這個(gè)需求很實(shí)際。第三是數(shù)據(jù)交換。疾控體系上下級(jí)單位之間需要上報(bào)數(shù)據(jù)系統(tǒng)要預(yù)留標(biāo)準(zhǔn)數(shù)據(jù)交換接口。這不是簡(jiǎn)單加幾個(gè)接口的事涉及數(shù)據(jù)字段映射、傳輸加密、冪等控制建議在一個(gè)正式版本中專項(xiàng)處理不適合在1天交付里硬塞。5.3 這次實(shí)踐給我留下最深的一點(diǎn)體會(huì)這次用Hermes Cursor完成整個(gè)項(xiàng)目最大的收獲不是一天交付這個(gè)速度而是工作方式的轉(zhuǎn)變。上午用Hermes把需求、表結(jié)構(gòu)、字段口徑全部敲定下午用Cursor高速編碼人干的活就剩下兩件做決策、做驗(yàn)收。以前我會(huì)擔(dān)心AI寫出來(lái)的東西能不能用現(xiàn)在我的心態(tài)是AI代碼一定會(huì)有問(wèn)題所以更要主動(dòng)設(shè)計(jì)驗(yàn)收機(jī)制而不是靠它自己保證質(zhì)量。真正決定項(xiàng)目上限的還是你對(duì)自己所在業(yè)務(wù)的理解有多深。AI擅長(zhǎng)窮舉和生成但什么該做、什么不該做、做到什么程度最后還是得由人來(lái)拍板。