From a0d62d13f1d537e84e13d8ee4d8b37b27439fa00 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期二, 29 九月 2026 10:48:36 +0800
Subject: [PATCH] feat(finance): 对接课题经费拨付与财务报销模块
---
yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/dal/dataobject/fund/ResearchFundRecordDO.java | 15 +
yudao-module-research/pom.xml | 7
yudao-module-finance-api/pom.xml | 33 ++
docs/project-business/mermaid/08-module-relation.mmd | 6
docs/project-business/data/modules.json | 14
yudao-module-finance-api/src/main/java/cn/iocoder/yudao/module/finance/api/reimbursement/FinanceReimbursementApi.java | 51 +++
pom.xml | 1
yudao-module-finance/src/main/java/cn/iocoder/yudao/module/finance/enums/ErrorCodeConstants.java | 2
yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/dal/mysql/fund/ResearchFundRecordMapper.java | 4
docs/project-business/mermaid/09-data-flow.mmd | 9
docs/project-business/index.html | 76 +++--
yudao-module-finance/src/main/java/cn/iocoder/yudao/module/finance/api/reimbursement/FinanceReimbursementApiImpl.java | 133 ++++++++++
yudao-module-finance/pom.xml | 6
docs/project-business/data/flows.json | 4
docs/project-business/README.md | 10
docs/project-business/mermaid/12-finance-flow.mmd | 4
yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/controller/admin/fund/vo/ResearchFundRecordSaveReqVO.java | 4
yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/controller/admin/fund/vo/ResearchFundRecordRespVO.java | 14 +
yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/service/fund/listener/ResearchFundStatusListener.java | 54 ++++
yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/enums/ResearchFundStatusEnum.java | 2
docs/project-business/data/business.json | 12
docs/project-business/data/objects.json | 4
yudao-module-finance-api/src/main/java/cn/iocoder/yudao/module/finance/api/reimbursement/dto/FinanceReimbursementCreateReqDTO.java | 35 ++
yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/service/fund/ResearchFundRecordService.java | 9
yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/service/fund/ResearchFundRecordServiceImpl.java | 174 ++++++++++++-
yudao-module-finance-api/src/main/java/cn/iocoder/yudao/module/finance/api/reimbursement/dto/FinanceReimbursementUpdateReqDTO.java | 35 ++
yudao-module-finance-api/src/main/java/cn/iocoder/yudao/module/finance/api/reimbursement/dto/FinanceReimbursementRespDTO.java | 37 ++
docs/project-business/mermaid/10-business-object.mmd | 1
yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/enums/ErrorCodeConstants.java | 8
29 files changed, 681 insertions(+), 83 deletions(-)
diff --git a/docs/project-business/README.md b/docs/project-business/README.md
index cec9a39..f9b19a7 100644
--- a/docs/project-business/README.md
+++ b/docs/project-business/README.md
@@ -8,7 +8,7 @@
- **涓氬姟瀹氫綅**锛氱鏁e埗閫犲伐鍘備骇渚涢攢浜鸿储鐗╀竴浣撳寲锛氳鐩栥�庨攢鍞帴鍗� 鈫� 閲囪喘/鐢熶骇 鈫� 璐ㄦ 鈫� 浠撳偍 鈫� 鍙戣揣 鈫� 鍥炴 鈫� 鍞悗銆忓叏閾捐矾闂幆
- **鎶�鏈簳搴�**锛歽udao锛坮uoyi-vue-pro锛変簩寮�锛孲pring Boot + MyBatis + Flowable + Redis + MySQL 8.4 + Milvus + 閫氫箟鍗冮棶锛涘墠绔� mom-pro2-before锛圴ue3锛�
- **鏍稿績涓荤嚎**锛欳RM 鍚堝悓 鈫� ERP 閿�鍞鍗� 鈫� MES 涓昏鍒�/宸ュ崟/鎶ュ伐 鈫� 璐ㄦ涓庝粨鍌� 鈫� 閿�鍞嚭搴� 鈫� 寮�绁ㄥ洖娆� 鈫� 鍞悗闂幆
-- **鐙珛妯″潡**锛氳储鍔℃姤閿�锛坄yudao-module-finance`锛屾姤閿�鍗�/鏄庣粏/鍙戠エ闄勪欢/瀹℃壒/褰掓。锛変笌浼氬憳绠$悊锛坄yudao-module-ums`锛屽叆浼氱敵璇�/绉樹功澶勪笌鐞嗕簨浼氫袱绾у鎵�/浼氬憳/閫氳褰曪級鍚勮嚜鎴愪竴鏉¢摼璺紝鍧囦笉涓庡叾浠栦笟鍔℃ā鍧椾骇鐢熷崟鎹叧鑱旓紙UMS 渚嬪锛氬鎵归�氳繃浼氱粡 AdminUserApi 鍒涘缓绯荤粺鐧诲綍璐﹀彿锛夛紱璇鹃绠$悊锛坄yudao-module-research`锛岃棰樻寚鍗�/鍦ㄧ嚎鐢虫姤/涓撳璇勫/涓夌骇绔嬮」瀹℃壒/绔嬮」閫氱煡/缁忚垂鎷ㄤ粯锛変负鍙︿竴鏉$嫭绔嬬鐮斾富绾匡紝浠呭悜澶栧彇 `ums_member` 浣滀负鐢虫姤浜恒�佸悜鍐呭啓 `system_notice` 绔嬮」鍏憡
+- **鐙珛妯″潡**锛氳储鍔℃姤閿�锛坄yudao-module-finance`锛屾姤閿�鍗�/鏄庣粏/鍙戠エ闄勪欢/瀹℃壒/褰掓。锛屽澶栨彁渚� `yudao-module-finance-api` 渚涗粬妯″潡寤哄崟锛変笌浼氬憳绠$悊锛坄yudao-module-ums`锛屽叆浼氱敵璇�/绉樹功澶勪笌鐞嗕簨浼氫袱绾у鎵�/浼氬憳/閫氳褰曪級鍚勮嚜鎴愪竴鏉¢摼璺紙UMS 渚嬪锛氬鎵归�氳繃浼氱粡 AdminUserApi 鍒涘缓绯荤粺鐧诲綍璐﹀彿锛夛紱璇鹃绠$悊锛坄yudao-module-research`锛岃棰樻寚鍗�/鍦ㄧ嚎鐢虫姤/涓撳璇勫/涓夌骇绔嬮」瀹℃壒/绔嬮」閫氱煡/缁忚垂鎷ㄤ粯锛変负鍙︿竴鏉$嫭绔嬬鐮斾富绾匡紝鍚戝鍙� `ums_member` 浣滀负鐢虫姤浜恒�佸啓 `system_notice` 绔嬮」鍏憡锛�**骞跺凡瀵规帴璐㈠姟**锛氱粡璐规嫧浠� 1:1 鑷姩鐢熸垚璐㈠姟鎶ラ攢鍗曞苟鎻愪氦瀹℃壒锛屽鎵圭粨鏋滅粡 BPM 鐩戝惉鍣ㄥ洖鍐欒棰樹晶鎷ㄦ鍙拌处
## 2. 鐩綍缁撴瀯
@@ -46,9 +46,9 @@
| 09-data-flow | 璺ㄦā鍧楁暟鎹祦锛堝崟鎹敓鎴愩�佸瓧娈靛甫鍏ャ�佹暟閲忓洖鍐欍�佷簨浠讹級 |
| 10-business-object | 鏍稿績涓氬姟瀵硅薄 ER锛堝彧鍚笟鍔″璞★紝闈炲叏搴撹〃锛� |
| 11-ai-business-flow | AI 涓氬姟閾捐矾锛圤CR/璐ㄦ鍒ゅ畾/鍥涚被棰勬祴/RAG锛屽惈 API 渚濊禆锛� |
-| 12-finance-flow | 璐㈠姟鎶ラ攢锛堢嫭绔嬫ā鍧楋級锛氭姤閿�鍗�+鏄庣粏+鍙戠エ闄勪欢 鈫� 鎻愪氦 BPM 瀹℃壒 鈫� 閫氳繃/椹冲洖 鈫� 褰掓。缁堟�� |
+| 12-finance-flow | 璐㈠姟鎶ラ攢锛堢嫭绔嬫ā鍧楋級锛氭姤閿�鍗�+鏄庣粏+鍙戠エ闄勪欢 鈫� 鎻愪氦 BPM 瀹℃壒 鈫� 閫氳繃/椹冲洖 鈫� 褰掓。缁堟�侊紱鍗曟嵁鏉ユ簮鍚墜宸ユ柊寤轰笌銆岃棰樼粡璐规嫧浠樿嚜鍔ㄧ敓鎴愩�嶄袱绫� |
| 13-ums-membership-flow | 浼氬憳鍏ヤ細锛堢嫭绔嬫ā鍧楋級锛氬叆浼氱敵璇� + 鏉愭枡闄勪欢 鈫� 鎻愪氦 BPM 涓ょ骇瀹℃壒锛堢涔﹀鍒濆鈫掔悊浜嬩細瀹¤锛夆啋 閫氳繃鑷姩寤轰細鍛樹笌鐧诲綍璐﹀彿 鈫� 浼氬憳鍒楄〃/閫氳褰曟绱� |
-| 14-research-flow | 璇鹃绠$悊锛堢嫭绔嬫ā鍧楋級锛氭寚鍗楀彂甯�(閲嶇偣/涓�鑸�)鈫掑湪绾跨敵鎶�(閫変細鍛樺甫鍑虹敵鎶ヤ汉)鈫掍笓瀹惰瘎鍒嗘槑缁嗗姞鏉冩帓鍚嶁啋BPM 涓夌骇瀹℃壒(绉樹功澶勫舰寮忓鏌モ啋涓撳璇勫鈫掑浼氱珛椤瑰鎵�)鈫掔珛椤圭紪鍙蜂笌鍏憡鈫掔粡璐规嫧浠樿褰� |
+| 14-research-flow | 璇鹃绠$悊锛堢嫭绔嬫ā鍧楋級锛氭寚鍗楀彂甯�(閲嶇偣/涓�鑸�)鈫掑湪绾跨敵鎶�(閫変細鍛樺甫鍑虹敵鎶ヤ汉)鈫掍笓瀹惰瘎鍒嗘槑缁嗗姞鏉冩帓鍚嶁啋BPM 涓夌骇瀹℃壒(绉樹功澶勫舰寮忓鏌モ啋涓撳璇勫鈫掑浼氱珛椤瑰鎵�)鈫掔珛椤圭紪鍙蜂笌鍏憡鈫掔粡璐规嫧浠橈紙鍑瘉蹇呭~鈫�1:1 鑷姩鐢熸垚骞舵彁浜よ储鍔℃姤閿�鍗曗啋璐㈠姟瀹℃牳/璐㈠姟涓荤涓ょ骇瀹℃壒鈫掔粨鏋滅粡鐩戝惉鍣ㄥ洖鍐欏彴璐︼細閫氳繃宸叉嫧浠�/椹冲洖宸查┏鍥炲彲閲嶅彂/鎾ゅ洖鍥炲緟鎷ㄤ粯锛墊
鍥句腑鐘舵�佹暟瀛楀潎涓烘簮鐮佹灇涓剧湡瀹炲�硷紙濡傚伐鍗� 0鑽夌/1宸茬‘璁�/2瀹屾垚/3鍙栨秷锛汦RP 瀹℃壒 15瀹℃壒涓�/20宸插鏍革級銆�
@@ -69,8 +69,8 @@
- 鏈洰褰曠敱椤圭洰鎶�鑳� **project-business-analysis** 绠$悊锛坄.claude/skills/project-business-analysis/`锛夛紝骞舵湁瑙勫垯 `.claude/rules/business-visualization-maintenance.md` 寮哄埗锛氫笟鍔℃ā鍧�/娴佺▼/鐘舵��/瀵硅薄/瑙掕壊/AI 鍙樻洿鍚庨渶鍚屾缁存姢鏈洰褰曘��
- 澧為噺缁存姢锛氭敼瀵瑰簲鐨� `mermaid/*.mmd` + `data/*.json` 鈫� 杩愯涓婇潰鐨� sync 鑴氭湰 鈫� 娴忚鍣ㄩ獙璇佸彈褰卞搷鍥俱��
- 鍏ㄩ噺閲嶅仛锛堝亸宸繃澶ф椂锛夛細瀵� Claude 璇淬�岄噸鏂扮敓鎴愪笟鍔″叏鏅�嶏紝鎶�鑳戒細閲嶆柊璧拌婧愮爜骞舵寜鐢熸垚妯″紡閲嶅缓銆�
-- 鐢熸垚鍩虹嚎锛歞ev_business @ 87bf4a99锛�2026-09-10锛�2026-09-28 澧為噺琛ュ厖璐㈠姟鎶ラ攢妯″潡锛坄yudao-module-finance`锛夈�佷細鍛樼鐞嗘ā鍧楋紙`yudao-module-ums`锛変笌璇鹃绠$悊妯″潡锛坄yudao-module-research`锛屼竴鏈熼」 1~5锛涗簩鏈熺粨椤归獙鏀朵笌鎴愭灉褰掓。灏氭湭鍋氾紝鍥句腑宸叉爣娉ㄦ湭瑕嗙洊鑼冨洿锛夈��
+- 鐢熸垚鍩虹嚎锛歞ev_business @ 87bf4a99锛�2026-09-10锛�2026-09-28 澧為噺琛ュ厖璐㈠姟鎶ラ攢妯″潡锛坄yudao-module-finance`锛夈�佷細鍛樼鐞嗘ā鍧楋紙`yudao-module-ums`锛変笌璇鹃绠$悊妯″潡锛坄yudao-module-research`锛屼竴鏈熼」 1~5锛涗簩鏈熺粨椤归獙鏀朵笌鎴愭灉褰掓。灏氭湭鍋氾紝鍥句腑宸叉爣娉ㄦ湭瑕嗙洊鑼冨洿锛夛紱**2026-09-29 澧為噺**锛氳棰樼粡璐规嫧浠樺鎺ヨ储鍔℃姤閿�鈥斺�旀柊寤� `yudao-module-finance-api`锛坄FinanceReimbursementApi` 鏈湴 Bean 璋冪敤锛氬缓鍗�+鎻愪氦/鏀瑰崟+閲嶆彁/鍒犻櫎/鏌ヨ锛夛紝鐧昏鎷ㄦ鏃� 1:1 鑷姩鐢熸垚 `finance_reimbursement`锛堢郴缁熺敓鎴� 1 琛屾槑缁嗭級骞惰嚜鍔ㄦ彁浜� `finance_reimbursement_approve` 涓ょ骇瀹℃壒锛屾柊澧炵 15 涓笟鍔$洃鍚櫒 `ResearchFundStatusListener` 鎸夊鎵圭粨鏋滃洖鍐欒棰樻嫧娆惧彴璐︼紙閫氳繃 20 / 椹冲洖 30 / 鎾ゅ洖 0锛夛紝褰卞搷鍥� 08 / 09 / 10 / 14 涓� data 鍏ㄩ儴鍥涗唤 json銆�
## 7. 宸茬煡寰呯‘璁や笟鍔�
-瑙� `data/business.json` 鐨� `pendingConfirm`锛堥〉闈€�屽緟纭浜嬮」銆嶆爮锛夛紝瑕佺偣锛氫粨搴撶被鍨�/鍚堟牸浠撴敼閫犳湭钀藉湴銆丠RM 浜ゆ帴 expandUserIds 灏氭湭琚笟鍔℃煡璇㈡帴鍏ャ�佸洖娆句笌鏀舵鍗曟湭璧� BPM銆佽储鍔″嬀绋藉洖鍐欐柟娉曚负绌恒�丯CR 澶勭疆涓嶅洖鍐欐簮鍗曘�佽储鍔℃姤閿�鐨� BPM 娴佺▼瀹氫箟鏈彂甯冧笌鏅�氳鑹叉湭鎺堣彍鍗曘�佷細鍛樼鐞嗙殑 BPM 娴佺▼鏈彂甯冧笖缂哄鎵硅嚜瀹氫箟琛ㄥ崟椤点�佽嚜鍔ㄥ缓璐﹀彿鐢ㄦ墜鏈哄彿浣滃垵濮嬪瘑鐮佸瓨鍦ㄥ急鍙d护椋庨櫓銆佽棰樼鐞嗙殑璇勫垎鏉冮噸涓庨�氳繃闃堝�间负鍗犱綅瑙勫垯寰呭浼氱‘璁ゃ�佷竴鏈熺粡璐规嫧浠樹笌璐㈠姟妯″潡鏃犳暟鎹悓姝ャ�佺敵鎶ュ崟涓庝細鍛樹负杞叧鑱斿彲鑳芥偓绌虹瓑銆�
+瑙� `data/business.json` 鐨� `pendingConfirm`锛堥〉闈€�屽緟纭浜嬮」銆嶆爮锛夛紝瑕佺偣锛氫粨搴撶被鍨�/鍚堟牸浠撴敼閫犳湭钀藉湴銆丠RM 浜ゆ帴 expandUserIds 灏氭湭琚笟鍔℃煡璇㈡帴鍏ャ�佸洖娆句笌鏀舵鍗曟湭璧� BPM銆佽储鍔″嬀绋藉洖鍐欐柟娉曚负绌恒�丯CR 澶勭疆涓嶅洖鍐欐簮鍗曘�佽储鍔℃姤閿�鐨� BPM 娴佺▼瀹氫箟鏈彂甯冧笌鏅�氳鑹叉湭鎺堣彍鍗曘�佷細鍛樼鐞嗙殑 BPM 娴佺▼鏈彂甯冧笖缂哄鎵硅嚜瀹氫箟琛ㄥ崟椤点�佽嚜鍔ㄥ缓璐﹀彿鐢ㄦ墜鏈哄彿浣滃垵濮嬪瘑鐮佸瓨鍦ㄥ急鍙d护椋庨櫓銆佽棰樼鐞嗙殑璇勫垎鏉冮噸涓庨�氳繃闃堝�间负鍗犱綅瑙勫垯寰呭浼氱‘璁ゃ�佽棰樼粡璐规嫧浠樿櫧宸插鎺ヨ储鍔℃姤閿�浣嗗彴璐︿笌鎶ラ攢鍗曚负杞叧鑱旓紙璐㈠姟渚у垹鍗曚細鐣欐偓绌� `reimbursement_id`锛夈�佹柊寤虹殑璐㈠姟鎶ラ攢瀹℃壒娴佺▼鑺傜偣瀹℃壒浜洪渶涓婄嚎鍓嶅湪 BPM 璁捐鍣ㄦ寜瀹為檯缁勭粐璋冩暣銆佺敵鎶ュ崟涓庝細鍛樹负杞叧鑱斿彲鑳芥偓绌虹瓑銆�
diff --git a/docs/project-business/data/business.json b/docs/project-business/data/business.json
index 7950bd5..6af4a08 100644
--- a/docs/project-business/data/business.json
+++ b/docs/project-business/data/business.json
@@ -27,7 +27,7 @@
"businessModules": 16,
"coreObjects": 56,
"documentFlows": 9,
- "approvalListeners": 14,
+ "approvalListeners": 15,
"aiCapabilities": 8,
"wmBillTypes": 15
},
@@ -147,18 +147,20 @@
"杞鐢宠(hrm_regularize_application)銆佸煿璁瘉涔︾瓑浠呮湁 SQL 涓庤彍鍗曞垵濮嬪寲锛孞ava 渚� Service/Controller 鏈疄鐜�",
"NCR 澶勭疆缁撴灉锛堣繑宸�/閫�璐э級鏈洖鍐欒Е鍙戞簮鍗曟嵁锛屼粎鍙拌处璁板綍",
"MPS 鐘舵�佹灇涓剧嫭绔嬬紪鍙�(0/1/2/3)锛屼笌閫氱敤鍗曟嵁甯搁噺(0/1/4/5)涓嶄竴鑷�",
- "璐㈠姟鎶ラ攢锛欱PM 鍒嗙被 finance_reimbursement_approve 涓嬪皻鏃犲凡鍙戝竷鐨勬祦绋嬪畾涔夛紙act_re_cprocdef 涓虹┖锛夛紝涓旀祦绋嬮渶鎶娿�岃嚜瀹氫箟琛ㄥ崟璺緞銆嶉厤涓� /finance/reimbursement/detail/approve/index.vue锛屽惁鍒欏墠绔�屾彁浜ゅ鎵广�嶈绂佺敤銆佸鎵逛腑蹇冪湅涓嶅埌鎶ラ攢鍗曞唴瀹广�愰渶 BPM 璁捐鍣ㄤ晶閰嶇疆銆�",
+ "璐㈠姟鎶ラ攢锛欱PM 鍒嗙被 finance_reimbursement_approve 涓嬪皻鏃犲凡鍙戝竷鐨勬祦绋嬪畾涔夛紙act_re_procdef 涓虹┖锛夆�斺�旇娴佺▼鐜板凡鏄�岃棰樼粡璐规嫧浠樿嚜鍔ㄥ缓鍗曞苟鎻愪氦銆嶇殑纭墠缃紝鏈柟妗堝凡鎵嬪啓 2 鑺傜偣 BPMN锛坉ocs/sql/finance_reimbursement_approve.bpmn锛氳储鍔″鏍� 鈫� 璐㈠姟涓荤瀹℃壒锛夊緟閮ㄧ讲锛涢儴缃插悗杩橀渶鎶娿�岃嚜瀹氫箟琛ㄥ崟璺緞銆嶉厤涓� /finance/reimbursement/detail/approve/index.vue锛坒orm_type=20锛夛紝鍚﹀垯鍓嶇銆屾彁浜ゅ鎵广�嶈绂佺敤銆佸鎵逛腑蹇冪湅涓嶅埌鎶ラ攢鍗曞唴瀹广�愰渶 BPM 璁捐鍣ㄤ晶閰嶇疆銆�",
"璐㈠姟鎶ラ攢锛氳彍鍗曚粎鎺堜簣 super_admin锛堣秴绠$敱浠g爜鐩磋繑鍏ㄩ儴鑿滃崟锛夛紝鏅�氳鑹叉湭閰� system_role_menu锛岄潪瓒呯鐧诲綍鐪嬩笉鍒般�屾姤閿�鍗曘�嶈彍鍗曘�愬緟纭鏄惁琛ユ巿鏉冦��",
"浼氬憳绠$悊锛氫細鍛樼鐞嗚彍鍗�(1075490~1075503)浠� super_admin 鍙锛屾櫘閫氳鑹叉湭閰� system_role_menu锛岄潪瓒呯鐧诲綍鐪嬩笉鍒颁細鍛樼鐞嗙洰褰曘�愬緟纭鏄惁琛ユ巿鏉冦��",
"浼氬憳绠$悊锛氬鎵归�氳繃鑷姩寤虹郴缁熻处鍙风敤銆岃仈绯荤數璇濄�嶅悓鏃朵綔鐢ㄦ埛鍚嶄笌鍒濆瀵嗙爜锛岃嫢鑱旂郴鐢佃瘽涓虹┖浼氱敤瀛楅潰閲� unknown 鍏滃簳锛屽瓨鍦ㄥ急鍙d护涓庨噸鍚嶉闄┿�愬緟纭鏄惁鏀归�犮��",
"浼氬憳绠$悊锛氳嚜鍔ㄥ缓妗d笉鎼繍 contactUser/unitIntro/expireDate锛坲ms_application 鏃犲搴斿瓧娈碉級锛屽崟浣嶄細鍛樼殑銆岃仈绯讳汉/鍗曚綅绠�浠�/鏈夋晥鏈熴�嶅彧鑳藉湪浼氬憳鍒楄〃鎵嬪伐琛ュ綍銆愬緟纭鏄惁闇�瑕佺敵璇峰崟澧炲瓧娈点��",
"浼氬憳绠$悊锛氬崟浣嶄細鍛樼殑绛夌骇瀛楀吀 ums_unit_grade 浠呭埌銆屼細闀垮崟浣嶃��(4)锛屼絾鏍¢獙閫昏緫棰濆纭紪鐮佺姝㈠崟浣嶉�夈�岀悊浜嬮暱銆�(grade=5)鈥斺�旇鍊兼湰涓嶅湪鍗曚綅瀛楀吀鍐咃紝灞為槻寰℃�у啑浣欐牎楠屻�愬緟纭鏄惁绮剧畝銆�",
"璇鹃绠$悊锛氫笓瀹惰瘎鍒嗘潈閲嶏紙閫夐0.3/鏂规0.3/鍥㈤槦0.2/鎴愭灉0.2锛変笌銆屽姞鏉冨潎鍒嗏墺60 涓� 澶氭暟缁撹涓烘帹鑽愮珛椤广�嶇殑閫氳繃闃堝�兼槸鍗犱綅瑙勫垯锛岄渶瀛︿細鏈�缁堢‘璁わ紱宸查泦涓负甯搁噺渚夸簬璋冩暣銆愬緟纭锛屾敼鍔ㄥ彧闇�鏀瑰父閲忋��",
- "璇鹃绠$悊锛氫竴鏈熺粡璐规嫧浠樺彧鍦ㄦ湰妯″潡钀芥嫧娆捐褰曪紝涓庤储鍔℃ā鍧楁棤浠讳綍鏁版嵁鍚屾锛屽悓涓�绗旈挶鍦ㄤ袱澶勮褰曞瓨鍦ㄤ笉涓�鑷撮闄╋紱浜屾湡瀵规帴鏃堕渶鏄庣‘浠ュ摢渚т负鍑嗐�愬緟纭銆�",
+ "璇鹃绠$悊锛氱粡璐规嫧浠樺凡瀵规帴璐㈠姟鎶ラ攢锛�1:1 鐢熸垚 finance_reimbursement 骞惰嚜鍔ㄦ彁浜ゅ鎵癸級锛屼絾鍙拌处涓庢姤閿�鍗曟槸杞叧鑱旓紙鏃犲閿紝浠呴潬 reimbursement_id锛夛紝璐㈠姟渚х洿鎺ュ垹闄ゆ姤閿�鍗曚細鐣欎笅鍙拌处鐨勬偓绌� reimbursement_id锛涘凡鐢� FUND_REIMBURSEMENT_NOT_EXISTS 绮剧‘鎻愮ず鍏滃簳锛屼笉鍋氭暟鎹簱绾х害鏉熴�愬凡鎺ュ彈鐨勯闄┿��",
+ "璇鹃绠$悊锛氭柊寤虹殑璐㈠姟鎶ラ攢瀹℃壒娴佺▼ finance_reimbursement_approve 涓� 2 鑺傜偣锛堣储鍔″鏍� 鈫� 璐㈠姟涓荤瀹℃壒锛夛紝鑺傜偣榛樿瀹℃壒浜虹瓥鐣ヤ负銆岃鑹� = 瓒呯骇绠$悊鍛�(1)銆佷緷娆″鎵广�嶏紱涓婄嚎鍓嶉渶鍦� BPM 璁捐鍣ㄤ腑鎸夊浼�/璐㈠姟瀹為檯瀹℃壒浜鸿皟鏁达紝鍚﹀垯璇ヨ鑹蹭笅澶氱敤鎴蜂細鍙樻垚閫愪汉浼氱銆愮幆澧冮厤缃」锛岄潪浠g爜缂洪櫡銆�",
+ "璇鹃绠$悊锛氱粡璐规嫧浠樺彴璐︾殑銆屽凡鎷ㄤ粯(20)銆嶇瓑浠蜂簬鎶ラ攢鍗曘�屽凡閫氳繃(20)銆嶏紝涓嶅惈鍑虹撼瀹為檯浠樻鍔ㄤ綔锛涜嫢鏃ュ悗闇�瑕佺嫭绔嬬殑銆屽凡浠樻銆嶇姸鎬侊紝闇�鍙﹀鐘舵�佷笌瀹℃壒鑺傜偣銆愪簩鏈熷彲鎵╁睍銆�",
"璇鹃绠$悊锛氱敵鎶ュ崟涓� ums_member 鏄蒋鍏宠仈锛堟棤澶栭敭锛夛紝浼氬憳琚垹闄ゅ悗鐢虫姤鍗曚細鐣欎笅鎮┖ memberId锛涙垚鍛樺垪琛ㄩ渶瀹归敊灞曠ず銆屼細鍛樺凡鍒犻櫎銆嶃�愬緟纭鏄惁鍔犲閿垨鍒犻櫎淇濇姢銆�",
"璇鹃绠$悊锛欱PM 娴佺▼ research_topic_approve 涓夎妭鐐归粯璁ゅ鎵逛汉涓恒�岃鑹�=瓒呯骇绠$悊鍛�(1) + 渚濇瀹℃壒銆嶏紝璇� dev 搴撹秴绾х鐞嗗憳瑙掕壊涓嬫湁 4 涓敤鎴凤紙admin/寮犲/椹姵/椹礊锛夛紝姣忎釜鑺傜偣闇� 4 浜轰細绛炬墠鎺ㄨ繘锛涘叏鏂板畨瑁呭簱璇ヨ鑹蹭粎 admin 涓�浜恒�佹祦绋嬪彲寮�绠卞嵆鐢ㄣ�俤ev 搴撻渶鍑忓皯瓒呯骇绠$悊鍛樼敤鎴锋垨鏀瑰湪 BPM 璁捐鍣ㄤ腑涓烘瘡鑺傜偣鎸囧畾瀹℃壒浜恒�愮幆澧冮厤缃」锛岄潪浠g爜缂洪櫡銆�",
"璇鹃绠$悊锛氱珛椤归�氱煡澶嶇敤 system_notice 绯荤粺鍏憡锛屼笉鏂板 system_notify_template銆佷笉鍙戠珯鍐呬俊锛涘闇�鐭俊/绔欏唴淇″畾鍚戦�氱煡闇�鍙﹁閰嶇疆銆愬緟纭閫氱煡娓犻亾銆�"
],
- "generatedAt": "2026-09-28",
- "analysisBasis": "鍩轰簬 dev_business 鍒嗘敮 87bf4a99 婧愮爜锛�6 缁勫苟琛屾簮鐮佽蛋璇伙紙MES 鐢熶骇璐ㄩ噺 / MES 浠撳偍 / ERP / CRM+SRM / 鍞悗+HRM / AI+BI+MDM+BPM+搴曞骇锛夛紱2026-09-28 澧為噺琛ュ厖 yudao-module-finance 鐙珛璐㈠姟鎶ラ攢妯″潡锛堟姤閿�鍗� + 鏄庣粏 + 鍙戠エ闄勪欢 + BPM 瀹℃壒 + 褰掓。锛変笌 yudao-module-ums 鐙珛浼氬憳绠$悊妯″潡锛堝叆浼氱敵璇� + BPM 涓ょ骇瀹℃壒 + 瀹℃壒閫氳繃鑷姩寤轰細鍛樹笌鐧诲綍璐﹀彿 + 浼氬憳鍒楄〃/閫氳褰曪級锛�2026-09-28 澧為噺锛欱PM 娴佺▼瀹氫箟 ums_membership_approve锛堝叆浼氬鎵癸級宸插湪 mom-jssm 閮ㄧ讲骞跺苟鍏� config_export_all 闃舵涓�锛堝垎绫� ums_membership_approve锛岀涔﹀鍒濆 鈫� 鐞嗕簨浼氬璁紝涓よ妭鐐瑰鎵逛汉鍧囦负銆岃鑹层�嶇瓥鐣ャ�佽鑹�=瓒呯骇绠$悊鍛�(1) 鍏滃簳锛岃〃鍗曠被鍨�=鑷畾涔夎〃鍗曪紝鏌ョ湅璺緞 /ums/application/detail/approve/index.vue锛夛紱鍚屾椂淇 mom-jssm 鐢� CREATE TABLE ... LIKE 鍏嬮殕瀵艰嚧鐨� 47 涓寚鍚� ruoyi-vue-pro 鐨� act_*/flw_* 璺ㄥ簱澶栭敭锛堥噸寤轰负鎸囧悜 mom-jssm 鑷韩锛屽鍎胯棰勬涓� 0锛夛紱2026-09-28 澧為噺锛氭柊澧� yudao-module-research 鐙珛绉戠爺璇鹃妯″潡涓�鏈燂紙璇鹃鎸囧崡鍙戝竷 + 鍦ㄧ嚎鐢虫姤 + 涓撳璇勫鏄庣粏 + BPM 涓夌骇绔嬮」瀹℃壒 + 绔嬮」閫氱煡鍏憡 + 缁忚垂鎷ㄤ粯璁板綍锛�4 寮� research_* 琛� / 5 涓瓧鍏� / bpm_category id=8002 / 娴佺▼ research_topic_approve / 鑿滃崟 1075510~1075553锛夛紝骞跺苟鍏� config_export_all_20260928 闃舵涓�锛涚敵鎶ヤ汉鍙� ums_member锛堣蒋鍏宠仈锛夈�佺珛椤归�氱煡澶嶇敤 system_notice 鍏憡銆佹嫧娆惧嚟璇佽蛋 system 闄勪欢涓績 recordType=research_fund_record"
+ "generatedAt": "2026-09-29",
+ "analysisBasis": "鍩轰簬 dev_business 鍒嗘敮 87bf4a99 婧愮爜锛�6 缁勫苟琛屾簮鐮佽蛋璇伙紙MES 鐢熶骇璐ㄩ噺 / MES 浠撳偍 / ERP / CRM+SRM / 鍞悗+HRM / AI+BI+MDM+BPM+搴曞骇锛夛紱2026-09-28 澧為噺琛ュ厖 yudao-module-finance 鐙珛璐㈠姟鎶ラ攢妯″潡锛堟姤閿�鍗� + 鏄庣粏 + 鍙戠エ闄勪欢 + BPM 瀹℃壒 + 褰掓。锛変笌 yudao-module-ums 鐙珛浼氬憳绠$悊妯″潡锛堝叆浼氱敵璇� + BPM 涓ょ骇瀹℃壒 + 瀹℃壒閫氳繃鑷姩寤轰細鍛樹笌鐧诲綍璐﹀彿 + 浼氬憳鍒楄〃/閫氳褰曪級锛�2026-09-28 澧為噺锛欱PM 娴佺▼瀹氫箟 ums_membership_approve锛堝叆浼氬鎵癸級宸插湪 mom-jssm 閮ㄧ讲骞跺苟鍏� config_export_all 闃舵涓�锛堝垎绫� ums_membership_approve锛岀涔﹀鍒濆 鈫� 鐞嗕簨浼氬璁紝涓よ妭鐐瑰鎵逛汉鍧囦负銆岃鑹层�嶇瓥鐣ャ�佽鑹�=瓒呯骇绠$悊鍛�(1) 鍏滃簳锛岃〃鍗曠被鍨�=鑷畾涔夎〃鍗曪紝鏌ョ湅璺緞 /ums/application/detail/approve/index.vue锛夛紱鍚屾椂淇 mom-jssm 鐢� CREATE TABLE ... LIKE 鍏嬮殕瀵艰嚧鐨� 47 涓寚鍚� ruoyi-vue-pro 鐨� act_*/flw_* 璺ㄥ簱澶栭敭锛堥噸寤轰负鎸囧悜 mom-jssm 鑷韩锛屽鍎胯棰勬涓� 0锛夛紱2026-09-28 澧為噺锛氭柊澧� yudao-module-research 鐙珛绉戠爺璇鹃妯″潡涓�鏈燂紙璇鹃鎸囧崡鍙戝竷 + 鍦ㄧ嚎鐢虫姤 + 涓撳璇勫鏄庣粏 + BPM 涓夌骇绔嬮」瀹℃壒 + 绔嬮」閫氱煡鍏憡 + 缁忚垂鎷ㄤ粯璁板綍锛�4 寮� research_* 琛� / 5 涓瓧鍏� / bpm_category id=8002 / 娴佺▼ research_topic_approve / 鑿滃崟 1075510~1075553锛夛紝骞跺苟鍏� config_export_all_20260928 闃舵涓�锛涚敵鎶ヤ汉鍙� ums_member锛堣蒋鍏宠仈锛夈�佺珛椤归�氱煡澶嶇敤 system_notice 鍏憡銆佹嫧娆惧嚟璇佽蛋 system 闄勪欢涓績 recordType=research_fund_record锛�2026-09-29 澧為噺锛氳棰樼粡璐规嫧浠樺鎺ヨ储鍔℃姤閿�鈥斺�旀柊寤� yudao-module-finance-api锛團inanceReimbursementApi锛氬缓鍗�+鎻愪氦/鏀瑰崟+閲嶆彁/鍒犻櫎/鏌ヨ鍥涙柟娉曪紝鏈湴 Spring Bean 璋冪敤锛屾棤闇� Feign锛夛紝璇鹃渚х櫥璁版嫧娆炬椂 1:1 鑷姩鐢熸垚 finance_reimbursement锛堢郴缁熺敓鎴� 1 琛屾槑缁嗭細璐圭敤绫诲瀷=鍏朵粬 5銆佸彂绁ㄩ噾棰�=鎷ㄤ粯閲戦銆佸彂绁ㄦ棩鏈�=鎷ㄤ粯鏃ユ湡銆佽鏄�=銆岃棰樸�斿悕銆曠 N 鏈熸嫧娆俱�嶏級骞剁珛鍗虫彁浜� BPM锛屽洖鍐� reimbursement_id/reimbursement_no銆佸彴璐︾疆銆屾姤閿�瀹℃壒涓�(15)銆嶏紱鍑瘉鏀逛负鐧昏鏃跺繀濉苟鍙岀粦锛坮esearch_fund_record + finance_reimbursement锛夛紱鏂板 ResearchFundStatusListener锛堢 15 涓笟鍔$洃鍚櫒锛屼笌 finance 鑷繁鐨� FinanceReimbursementStatusListener 璁㈤槄鍚屼竴娴佺▼ key 骞惰瑙﹀彂锛夋寜瀹℃壒缁撴灉鍥炲啓鍙拌处锛氶�氳繃鈫掑凡鎷ㄤ粯(20)銆侀┏鍥炩啋宸查┏鍥�(30)+椹冲洖鍘熷洜/鏃堕棿銆佹挙鍥炴垨鍙栨秷鈫掗��鍥炲緟鎷ㄤ粯(0)鍙敼鍚庡彲閲嶆柊鍙戣捣锛涙柊閫� 2 鑺傜偣 BPMN docs/sql/finance_reimbursement_approve.bpmn锛堣储鍔″鏍� 鈫� 璐㈠姟涓荤瀹℃壒锛宑ategory id=216 宸插瓨鍦ㄤ絾娴佺▼瀹氫箟寰呴儴缃诧級"
}
diff --git a/docs/project-business/data/flows.json b/docs/project-business/data/flows.json
index 45405c4..18dd9d3 100644
--- a/docs/project-business/data/flows.json
+++ b/docs/project-business/data/flows.json
@@ -74,7 +74,7 @@
{"stage": "寤烘。", "action": "瀹℃壒閫氳繃閽╁瓙鑷姩寤轰細鍛橈細鈶犵敓鎴愪細鍛樼紪鍙� HY+yyyyMMdd+6浣嶆祦姘� 鈶dminUserApi.createUser 寤虹郴缁熻处鍙凤紙鐢ㄦ埛鍚嶄笌鍒濆瀵嗙爜=鑱旂郴鐢佃瘽銆佹樀绉�=鐢宠浜哄鍚嶃�侀儴闂�=瀛︿細浼氬憳锛夆憿浼氬憳钀藉簱锛堝叆浼氭棩鏈�=褰撳ぉ銆佺姸鎬� 1 姝e父銆乤pplicationId 鍥炲~鏉ユ簮鐢宠鍗曪級锛涙墜鏈哄彿閲嶅浼氭槑纭姤閿�", "roles": ["绯荤粺鑷姩"]},
{"stage": "绠$悊涓庢绱�", "action": "浼氬憳鍒楄〃鏀寔鎵嬪伐鏂板/缂栬緫/鍒犻櫎锛堢瓑绾т笌绫诲瀷鏍¢獙锛氬崟浣嶄細鍛樹笉鍙�夈�庣悊浜嬮暱銆忥級锛涗細鍛橀�氳褰曚负鍙椤碉紝鎸夊湴鍖虹紪鐮佷笌琛屼笟妫�绱�", "roles": ["浼氬憳绠$悊鍛�", "鍏ㄤ綋鍙煡閫氳褰�"]}]},
{"id": "research", "name": "璇鹃绠$悊娴佺▼", "mermaid": "mermaid/14-research-flow.mmd", "color": "#e070a8",
- "summary": "鐙珛绉戠爺妯″潡锛坹udao-module-research锛夛細瀛︿細鍙戝竷璇鹃鎸囧崡锛堥噸鐐�/涓�鑸垎绫伙級鈫� 浼氬憳鍦ㄧ嚎鎻愪氦璇鹃鐢虫姤涔� 鈫� 鎻愪氦 BPM 涓夌骇瀹℃壒锛堢涔﹀褰㈠紡瀹℃煡 鈫� 涓撳璇勫 鈫� 瀛︿細绔嬮」瀹℃壒锛夛紝涓撳璇勫垎浠ョ粨鏋勫寲鏄庣粏瀛愯〃璁板綍骞剁敱鍚庣鑷姩姹囨�诲姞鏉冨潎鍒嗐�佹帓鍚嶄笌鎺ㄨ崘缁撹 鈫� 瀹℃壒閫氳繃鐢熸垚绔嬮」缂栧彿骞跺彂甯冪郴缁熷叕鍛� 鈫� 鎸夋壒娆$櫥璁扮粡璐规嫧浠樿褰曪紙鍚嚟璇侀檮浠讹級銆傞櫌绾т簩鏈熷啀琛ョ粨椤归獙鏀朵笌鎴愭灉褰掓。銆�",
+ "summary": "鐙珛绉戠爺妯″潡锛坹udao-module-research锛夛細瀛︿細鍙戝竷璇鹃鎸囧崡锛堥噸鐐�/涓�鑸垎绫伙級鈫� 浼氬憳鍦ㄧ嚎鎻愪氦璇鹃鐢虫姤涔� 鈫� 鎻愪氦 BPM 涓夌骇瀹℃壒锛堢涔﹀褰㈠紡瀹℃煡 鈫� 涓撳璇勫 鈫� 瀛︿細绔嬮」瀹℃壒锛夛紝涓撳璇勫垎浠ョ粨鏋勫寲鏄庣粏瀛愯〃璁板綍骞剁敱鍚庣鑷姩姹囨�诲姞鏉冨潎鍒嗐�佹帓鍚嶄笌鎺ㄨ崘缁撹 鈫� 瀹℃壒閫氳繃鐢熸垚绔嬮」缂栧彿骞跺彂甯冪郴缁熷叕鍛� 鈫� 鎸夋壒娆$櫥璁扮粡璐规嫧浠橈紙鍑瘉蹇呭~锛夛紝姣忔潯鎷ㄦ璁板綍鑷姩鐢熸垚骞舵彁浜や竴寮� 1:1 鐨勮储鍔℃姤閿�鍗曪紙finance_reimbursement锛夛紝璧� BPM 涓ょ骇瀹℃壒鍚庣敱鐩戝惉鍣ㄦ妸缁撴灉鍥炲啓鍙拌处銆傞櫌绾т簩鏈熷啀琛ョ粨椤归獙鏀朵笌鎴愭灉褰掓。銆�",
"steps": [
{"stage": "鍙戝竷鎸囧崡", "action": "鏂板缓鎸囧崡閫夌被鍒� 1閲嶇偣璇鹃 / 2涓�鑸棰橈紝濉敵鎶ヨ捣姝㈡椂闂翠笌鎸囧崡姝f枃锛涚紪鍙� GL+yyyyMMdd+6浣嶆祦姘达紙Redis 姣忔棩閲嶇疆锛夛紱status: 0鑽夌/20宸插彂甯�/30宸叉埅姝€�備粎鑽夌鍙敼鍙垹锛屽彂甯冨悗鍗冲喕缁擄紱宸蹭骇鐢熺敵鎶ュ崟鐨勬寚鍗楃姝㈠垹闄わ紙鎻愮ず璇ユ寚鍗椾笅宸叉湁 N 寮犵敵鎶ュ崟锛�", "roles": ["瀛︿細绉樹功澶�", "璇鹃绠$悊鍛�"]},
{"stage": "鍦ㄧ嚎鐢虫姤", "action": "浠庡凡鍙戝竷涓斿湪鐢虫姤鏈熷唴鐨勬寚鍗楁柊寤虹敵鎶ヤ功锛涢�変細鍛橈紙ums_member锛夎嚜鍔ㄥ甫鍑哄鍚�/宸ヤ綔鍗曚綅/鑱岀О/鑱旂郴鐢佃瘽/閭锛屽彲鏀癸紱濉棰樺悕绉般�佽棰樼粍鎴愬憳銆佺敵璇风粡璐广�佺敵鎶ヤ功姝f枃锛涚紪鍙� SB+yyyyMMdd+6浣嶆祦姘达紱绫诲埆鍐椾綑鑷寚鍗楋紝涓嶄俊浠诲墠绔紶鍊硷紱status: 0鑽夌", "roles": ["璇鹃鐢虫姤浜猴紙浼氬憳锛�", "璇鹃绠$悊鍛�"]},
@@ -82,7 +82,7 @@
{"stage": "涓撳璇勫", "action": "鐢虫姤鍗曞浜庡鎵逛腑(15)鏃跺綍鍏ヤ笓瀹惰瘎鍒嗘槑缁嗭紙涓�浣嶄笓瀹朵竴琛岋細濮撳悕/鍗曚綅/鑱岀О + 閫夐浠峰��0.3/鐮旂┒鏂规0.3/鍥㈤槦鍩虹0.2/棰勬湡鎴愭灉0.2 鍥涢」鍒嗗�� + 缁撹 + 鎰忚锛夛紱鍚庣姣忔澧炲垹鏀瑰悗閲嶇畻 compositeScore 鍔犳潈鍚堣銆佹寜鍔犳潈鍒嗛檷搴忛噸鎺� ranking锛屽苟鍥炲啓涓诲崟 reviewAvgScore锛堝叏閮ㄤ笓瀹跺潎鍒嗭級涓� reviewPass锛堝潎鍒嗚揪鏍囦笖澶氭暟缁撹涓烘帹鑽愮珛椤癸級锛涙槑缁嗗叏閮ㄥ垹闄ゆ椂姹囨�诲�兼竻绌轰负鏈眹鎬伙紱鍥涢」鍒嗗�煎潎鍦� 0~100 涔嬪鏃舵彁绀烘寚鍑哄叿浣撶淮搴︿笌瀹為檯鍊�", "roles": ["璇勫涓撳", "瀛︿細绉樹功澶�", "璇鹃绠$悊鍛�"]},
{"stage": "绔嬮」瀹℃壒", "action": "BPM 娴佺▼ research_topic_approve 椤哄簭璧颁笁鑺傜偣锛氱涔﹀褰㈠紡瀹℃煡 鈫� 涓撳璇勫 鈫� 瀛︿細绔嬮」瀹℃壒銆傚鎵规柟娉曚笌瀹℃壒浜哄湪娴佺▼瀹氫箟鍐呴厤缃紝閮ㄧ讲鍚庣敱绠$悊鍛樺湪 BPM 娴佺▼璁捐鍣ㄦ寜瀛︿細瀹為檯缁勭粐璋冩暣锛涘鎵逛腑蹇冨唴鐨勮嚜瀹氫箟琛ㄥ崟鍙鍥炴樉鐢虫姤鍗� + 璇勫鏄庣粏 + 鎷ㄤ粯璁板綍銆傞�氳繃鈫�20 宸茬珛椤广�侀┏鍥炩啋35 宸查┏鍥炪�佸彇娑堚啋閫�鍥� 0 鑽夌", "roles": ["瀛︿細绉樹功澶勶紙褰㈠紡瀹℃煡锛�", "璇勫涓撳锛堣瘎瀹¤妭鐐癸級", "瀛︿細鐞嗕簨浼氾紙绔嬮」瀹℃壒锛�"]},
{"stage": "绔嬮」涓庨�氱煡", "action": "鐩戝惉鍣� ResearchApplicationStatusListener 鍏堝洖鍐欏鎵圭姸鎬侊紝瀹℃壒閫氳繃鍚庡啀璋� approveApplication锛氱敓鎴愮珛椤圭紪鍙� LX+yyyyMMdd+6浣嶆祦姘� 涓� approveTime锛堝凡鏈夌紪鍙峰垯骞傜瓑璺宠繃锛夈�傜偣銆屽彂甯冪珛椤归�氱煡銆嶇敓鎴� system_notice 鍏憡锛堟爣棰樸�庡叧浜庡叕甯冪珛椤硅棰樼殑閫氱煡銆忥紝姝f枃鍚棰樺悕/绔嬮」缂栧彿/绫诲埆/鐢虫姤浜�/鍗曚綅/璧勫姪閲戦锛夛紝鍐欏洖 noticeId 闃查噸澶嶁�斺�旈噸澶嶇偣鍑绘寜宸插彂甯冩嫤鎴苟鍛婄煡涓婃鍙戝竷鏃堕棿", "roles": ["璇鹃绠$悊鍛�", "瀛︿細绉樹功澶�"]},
- {"stage": "缁忚垂鎷ㄤ粯", "action": "浠呫�屽凡绔嬮」(20)銆嶇殑鐢虫姤鍗曞彲鐧昏鎷ㄦ璁板綍锛堟壒娆″悕绉�/鎷ㄤ粯閲戦/鎷ㄤ粯鏃ユ湡/鏀舵鍗曚綅/鐘舵��/澶囨敞/鍑瘉闄勪欢锛夛紱閲戦鏍¢獙锛氬凡鐧昏閲戦 + 鏈閲戦 涓嶅緱瓒呭嚭璇ュ崟鐢宠缁忚垂锛岃秴鍑烘椂鎻愮ず鎶ュ嚭鏈銆佸凡鐧昏銆佸悎璁°�侀绠楀洓椤规暟鍊硷紱status: 0寰呮嫧浠�/20宸叉嫧浠橈紝鍑瘉鏄庣粏璧� system 闄勪欢涓績 recordType=research_fund_record锛岀姸鎬佹敼涓哄凡鎷ㄤ粯鏃跺嚟璇佸繀濉紱浠呭緟鎷ㄤ粯鐘舵�佸彲鏀瑰彲鍒狅紝缂栬緫鏃朵細鎶婃湰琛岄噾棰濆姞鍥炰綑棰濇樉绀�", "roles": ["瀛︿細璐㈠姟", "璇鹃绠$悊鍛�"]}]},
+ {"stage": "缁忚垂鎷ㄤ粯", "action": "浠呫�屽凡绔嬮」(20)銆嶇殑鐢虫姤鍗曞彲鐧昏鎷ㄦ璁板綍锛堟壒娆″悕绉�/鎷ㄤ粯閲戦/鎷ㄤ粯鏃ユ湡/鏀舵鍗曚綅/澶囨敞/鍑瘉闄勪欢锛夛紝鍑瘉蹇呭~銆傜櫥璁版椂涓�鏉¢緳瀹屾垚锛氣憼 璇鹃渚ц惤 research_fund_record 鍙拌处锛堝厛缃緟鎷ㄤ粯锛夆憽 鍚屼竴鎵� blob 鍙岀粦鍒拌棰樺彴璐︿笌璐㈠姟鎶ラ攢鍗� 鈶� 缁� yudao-module-finance-api 鑷姩鐢熸垚 1:1 鐨� finance_reimbursement 鎶ラ攢鍗曪紙1 琛屾槑缁嗭細璐圭敤绫诲瀷=鍏朵粬銆佸彂绁ㄩ噾棰�=鎷ㄤ粯閲戦銆佸彂绁ㄦ棩鏈�=鎷ㄤ粯鏃ユ湡銆佽垂鐢ㄨ鏄�=銆岃棰樸�旇棰樺悕銆曠N鏈�/绗琋娆$粡璐规嫧娆俱�嶏級鈶� 绔嬪嵆鎻愪氦 BPM 鎶ラ攢瀹℃壒 鈶� 鍙拌处鍥炲啓鎶ラ攢鍗曞彿骞剁疆銆屾姤閿�瀹℃壒涓�(15)銆嶃�傞噾棰濇牎楠岋細宸茬櫥璁伴噾棰� + 鏈閲戦 涓嶅緱瓒呭嚭璇ュ崟鐢宠缁忚垂锛岃秴鍑烘椂鎻愮ず鎶ュ嚭鏈銆佸凡鐧昏銆佸悎璁°�侀绠楀洓椤规暟鍊笺�傜姸鎬佺敱绯荤粺椹卞姩锛�0寰呮嫧浠�/15鎶ラ攢瀹℃壒涓�/20宸叉嫧浠�/30宸查┏鍥烇紱鍙湁銆屽緟鎷ㄤ粯銆嶅彲鍒狅紙鍒犻櫎鑱斿姩娓呯悊璐㈠姟渚ц崏绋挎姤閿�鍗曪級锛屻�屽緟鎷ㄤ粯銆嶃�屽凡椹冲洖銆嶅彲鏀瑰苟閲嶆柊鍙戣捣鎶ラ攢锛堝凡椹冲洖鏀瑰悗娓呯┖椹冲洖鍘熷洜涓庢椂闂达級锛涜储鍔$鎾ゅ洖鎴栧彇娑堝垯閫�鍥炪�屽緟鎷ㄤ粯(0)銆嶃�傝储鍔″鎵瑰垎绫讳笅娌℃湁宸插彂甯冩祦绋嬫椂鐩存帴鎶ラ敊涓斾笉寤哄崟锛屼笉鐣欏鍎胯崏绋挎姤閿�鍗�", "roles": ["瀛︿細璐㈠姟", "璇鹃绠$悊鍛�", "璐㈠姟瀹℃牳浜�", "璐㈠姟涓荤"]}]},
{"id": "ai", "name": "AI 涓氬姟娴佺▼", "mermaid": "mermaid/11-ai-business-flow.mmd", "color": "#56c8d8",
"summary": "缁熶竴妯″紡锛氫笟鍔′晶鏀堕泦涓婁笅鏂�(蹇呰鏃惰皟 MDM/SRM/CRM API 鍙栧悕绉�)鈫掔粍瑁� Prompt鈫抍hat/chatWithImage鈫掕В鏋� JSON鈫掑墠绔濉垨寤鸿锛涙棤 Function Calling锛汻AG 鐭ヨ瘑搴撳凡寤烘垚浣嗘殏鏃犱笟鍔℃秷璐广��",
"steps": [
diff --git a/docs/project-business/data/modules.json b/docs/project-business/data/modules.json
index 49e6f0a..da70ea7 100644
--- a/docs/project-business/data/modules.json
+++ b/docs/project-business/data/modules.json
@@ -35,10 +35,10 @@
{"key": "fin", "name": "璐㈠姟鎶ラ攢锛堢嫭绔嬶級", "color": "#3ec9a7", "tag": "FIN", "flow": "finance",
"positioning": "鐙珛鐨勫彂绁ㄦ姤閿�鍗曟嵁涓庡綊妗�",
"problem": "绾歌川鍙戠エ闅惧綊闆嗐�佹姤閿�瀹℃壒鏃犵暀鐥曘�佸綊妗e悗鏃犳硶杩芥函",
- "features": ["鎶ラ攢鍗�(涓昏〃 + 1..n 鏄庣粏琛�)", "鍙戠エ闄勪欢澶氭枃浠朵笂浼�(闄勪欢涓績澶氭�佸叧鑱� storage_attachment)", "鍗曞彿 Redis 鐢熸垚 BX+yyyyMMdd+6浣嶆祦姘绰锋瘡鏃ラ噸缃�", "鏄庣粏闅忎富琛ㄤ竴娆℃�ф彁浜�(鍏堝垹鍚庡鍏ㄩ噺瑕嗙洊)", "BPM 瀹℃壒(閫氳繃20/椹冲洖35/鍙栨秷閫�鍥炶崏绋�0)", "宸查┏鍥炲彲鏀瑰彂绁ㄥ悗閲嶆柊鎻愪氦", "褰掓。缁堟�� 40 骞惰褰曞綊妗f椂闂�", "璐圭敤绫诲瀷/鎶ラ攢鐘舵�佸弻瀛楀吀 + Excel 瀵煎嚭"],
+ "features": ["鎶ラ攢鍗�(涓昏〃 + 1..n 鏄庣粏琛�)", "鍙戠エ闄勪欢澶氭枃浠朵笂浼�(闄勪欢涓績澶氭�佸叧鑱� storage_attachment)", "鍗曞彿 Redis 鐢熸垚 BX+yyyyMMdd+6浣嶆祦姘绰锋瘡鏃ラ噸缃�", "鏄庣粏闅忎富琛ㄤ竴娆℃�ф彁浜�(鍏堝垹鍚庡鍏ㄩ噺瑕嗙洊)", "BPM 瀹℃壒(閫氳繃20/椹冲洖35/鍙栨秷閫�鍥炶崏绋�0)", "宸查┏鍥炲彲鏀瑰彂绁ㄥ悗閲嶆柊鎻愪氦", "褰掓。缁堟�� 40 骞惰褰曞綊妗f椂闂�", "璐圭敤绫诲瀷/鎶ラ攢鐘舵�佸弻瀛楀吀 + Excel 瀵煎嚭", "瀵瑰鎻愪緵 FinanceReimbursementApi(yudao-module-finance-api)渚涜棰樼鐞嗙粡璐规嫧浠樿嚜鍔ㄥ缓鍗曞苟鎻愪氦(1 琛屾槑缁喡疯垂鐢ㄧ被鍨�=鍏朵粬路閲戦涓�鑷�)"],
"objects": ["鎶ラ攢鍗�", "鎶ラ攢鏄庣粏"],
"roles": ["鎶ラ攢浜�", "璐㈠姟", "瀹℃壒浜�"],
- "upstream": [], "downstream": [],
+ "upstream": ["璇鹃绠$悊(缁忚垂鎷ㄤ粯 1:1 鑷姩鐢熸垚鎶ラ攢鍗暵疯蛋 yudao-module-finance-api路鏈湴 Bean 璋冪敤)"], "downstream": [],
"coreTables": ["finance_reimbursement", "finance_reimbursement_item"]},
{"key": "pro", "name": "鐢熶骇绠$悊", "color": "#e0b34f", "tag": "MES-PRO", "flow": "production",
"positioning": "鐢熶骇鎵ц鏍稿績锛氳鍒�-宸ュ崟-浠诲姟-鎶ュ伐",
@@ -107,16 +107,16 @@
{"key": "res", "name": "璇鹃绠$悊锛堢嫭绔嬶級", "color": "#e070a8", "tag": "RES", "flow": "research",
"positioning": "瀛︿細/鍗忎細鍨嬬鐮旇棰樺叏鐢熷懡鍛ㄦ湡锛氭寚鍗楀彂甯� 鈫� 鍦ㄧ嚎鐢虫姤 鈫� 涓撳璇勫 鈫� 绔嬮」瀹℃壒 鈫� 缁忚垂鎷ㄤ粯锛堢珛椤归�氱煡璧扮郴缁熷叕鍛婏級",
"problem": "璇鹃鎸囧崡闈犵嚎涓嬪彂甯冦�佺敵鎶ヤ功闈犵焊璐ㄦ垨閭欢鏀堕泦銆佷笓瀹惰瘎鍒嗘暎钀藉湪琛ㄦ牸閲屾棤娉曡嚜鍔ㄦ眹鎬绘帓鍚嶃�佺珛椤逛笌鎷ㄦ鏃犵暀鐥�",
- "features": ["璇鹃鎸囧崡(閲嶇偣1/涓�鑸�2 鍒嗙被鏍囨敞)", "鎸囧崡鐘舵�� 0鑽夌/20宸插彂甯�/30宸叉埅姝⒙峰彂甯�/鎴涓や釜鍔ㄤ綔", "鎸囧崡缂栧彿 GL+yyyyMMdd+6浣嶆祦姘�(Redis 姣忔棩閲嶇疆)", "鍦ㄧ嚎鐢虫姤涔�(閫夋寚鍗�+閫変細鍛樺甫鍑虹敵鎶ヤ汉淇℃伅+璇鹃缁勬垚鍛�+鐢宠缁忚垂+鐢虫姤涔︽鏂�)", "鐢虫姤缂栧彿 SB+鍚屾棩娴佹按路绫诲埆鍐椾綑鑷寚鍗椾笉淇′换鍓嶇", "鐢虫姤鐘舵�� 0鑽夌/15瀹℃壒涓�/20宸茬珛椤�/35宸查┏鍥�", "鎻愪氦鍓嶆牎楠屾寚鍗楀凡鍙戝竷涓斿湪鐢虫姤鏈熷唴(閫愭潯鎶ュ叿浣撶淮搴︿笌鏃堕棿)", "涓撳璇勫鏄庣粏瀛愯〃(涓�浣嶄笓瀹朵竴琛屄峰洓椤瑰姞鏉� 0.3/0.3/0.2/0.2)", "鍚庣鑷姩閲嶇畻鍔犳潈鍚堣涓庢帓鍚嵚峰洖鍐欎富鍗曞潎鍒嗕笌鎺ㄨ崘缁撹", "BPM 涓夌骇瀹℃壒 research_topic_approve(绉樹功澶勫舰寮忓鏌モ啋涓撳璇勫鈫掑浼氱珛椤瑰鎵�)", "瀹℃壒閫氳繃鐢熸垚绔嬮」缂栧彿 LX+鍚屾棩娴佹按 涓庣珛椤规椂闂�(骞傜瓑)", "鍙戝竷绔嬮」閫氱煡(鐢熸垚 system_notice 鍏憡路鍐欏洖 noticeId 闃查噸澶�)", "缁忚垂鎷ㄤ粯璁板綍(鎵规/閲戦/鏃ユ湡/鏀舵鍗曚綅/鐘舵��/鍑瘉闄勪欢)路閲戦涓嶅緱瓒呯敵璇风粡璐�", "闄勪欢璧� system 闄勪欢涓績(recordType=research_guideline / research_application / research_fund_record)"],
+ "features": ["璇鹃鎸囧崡(閲嶇偣1/涓�鑸�2 鍒嗙被鏍囨敞)", "鎸囧崡鐘舵�� 0鑽夌/20宸插彂甯�/30宸叉埅姝⒙峰彂甯�/鎴涓や釜鍔ㄤ綔", "鎸囧崡缂栧彿 GL+yyyyMMdd+6浣嶆祦姘�(Redis 姣忔棩閲嶇疆)", "鍦ㄧ嚎鐢虫姤涔�(閫夋寚鍗�+閫変細鍛樺甫鍑虹敵鎶ヤ汉淇℃伅+璇鹃缁勬垚鍛�+鐢宠缁忚垂+鐢虫姤涔︽鏂�)", "鐢虫姤缂栧彿 SB+鍚屾棩娴佹按路绫诲埆鍐椾綑鑷寚鍗椾笉淇′换鍓嶇", "鐢虫姤鐘舵�� 0鑽夌/15瀹℃壒涓�/20宸茬珛椤�/35宸查┏鍥�", "鎻愪氦鍓嶆牎楠屾寚鍗楀凡鍙戝竷涓斿湪鐢虫姤鏈熷唴(閫愭潯鎶ュ叿浣撶淮搴︿笌鏃堕棿)", "涓撳璇勫鏄庣粏瀛愯〃(涓�浣嶄笓瀹朵竴琛屄峰洓椤瑰姞鏉� 0.3/0.3/0.2/0.2)", "鍚庣鑷姩閲嶇畻鍔犳潈鍚堣涓庢帓鍚嵚峰洖鍐欎富鍗曞潎鍒嗕笌鎺ㄨ崘缁撹", "BPM 涓夌骇瀹℃壒 research_topic_approve(绉樹功澶勫舰寮忓鏌モ啋涓撳璇勫鈫掑浼氱珛椤瑰鎵�)", "瀹℃壒閫氳繃鐢熸垚绔嬮」缂栧彿 LX+鍚屾棩娴佹按 涓庣珛椤规椂闂�(骞傜瓑)", "鍙戝竷绔嬮」閫氱煡(鐢熸垚 system_notice 鍏憡路鍐欏洖 noticeId 闃查噸澶�)", "缁忚垂鎷ㄤ粯璁板綍(鎵规/閲戦/鏃ユ湡/鏀舵鍗曚綅/澶囨敞/鍑瘉闄勪欢)路鍑瘉蹇呭~路閲戦涓嶅緱瓒呯敵璇风粡璐�", "缁忚垂鎷ㄤ粯 1:1 鑷姩鐢熸垚骞舵彁浜よ储鍔℃姤閿�鍗�(FinanceReimbursementApi路1 琛屾槑缁喡疯垂鐢ㄧ被鍨�=鍏朵粬)", "鎷ㄤ粯鐘舵�� 0寰呮嫧浠�/15鎶ラ攢瀹℃壒涓�/20宸叉嫧浠�/30宸查┏鍥灺风敱 BPM 鐩戝惉鍣ㄥ洖鍐�(鍚┏鍥炲師鍥犱笌鏃堕棿)", "宸查┏鍥炲彲鏀归噾棰�/鍑瘉鍚庨噸鏂板彂璧锋姤閿�路寰呮嫧浠樺彲鍒犲苟鑱斿姩娓呯悊璐㈠姟渚ц崏绋挎姤閿�鍗�", "闄勪欢璧� system 闄勪欢涓績(recordType=research_guideline / research_application / research_fund_record)"],
"objects": ["璇鹃鎸囧崡", "璇鹃鐢虫姤涔�", "涓撳璇勫鏄庣粏", "缁忚垂鎷ㄤ粯璁板綍"],
- "roles": ["璇鹃鐢虫姤浜�(浼氬憳)", "璇鹃绠$悊鍛�", "璇勫涓撳", "瀛︿細绉樹功澶�", "瀛︿細鐞嗕簨浼�"],
- "upstream": ["浼氬憳绠$悊(ums_member 鍙栫敵鎶ヤ汉濮撳悕/鍗曚綅/鑱岀О/鐢佃瘽)", "BPM(娴佺▼瀹氫箟 research_topic_approve)"],
- "downstream": ["system(system_notice 绔嬮」閫氱煡鍏憡)", "system(闄勪欢涓績)", "璐㈠姟(浜屾湡棰勬湡寰呭鎺ヂ蜂竴鏈熶笉鎺�)"],
+ "roles": ["璇鹃鐢虫姤浜�(浼氬憳)", "璇鹃绠$悊鍛�", "璇勫涓撳", "瀛︿細绉樹功澶�", "瀛︿細鐞嗕簨浼�", "瀛︿細璐㈠姟"],
+ "upstream": ["浼氬憳绠$悊(ums_member 鍙栫敵鎶ヤ汉濮撳悕/鍗曚綅/鑱岀О/鐢佃瘽)", "BPM(娴佺▼瀹氫箟 research_topic_approve / finance_reimbursement_approve)"],
+ "downstream": ["system(system_notice 绔嬮」閫氱煡鍏憡)", "system(闄勪欢涓績)", "璐㈠姟(缁忚垂鎷ㄤ粯鐢熸垚 finance_reimbursement 鎶ラ攢鍗暵峰凡瀵规帴)"],
"coreTables": ["research_guideline", "research_application", "research_topic_review", "research_fund_record"]},
{"key": "bpm", "name": "鍗忓悓瀹℃壒", "color": "#e6a23c", "tag": "BPM", "flow": null,
"positioning": "鍏ㄧ郴缁熷崟鎹鎵逛腑鏋紙Flowable锛�",
"problem": "澶氭ā鍧楀崟鎹渶瑕佺伒娲诲彲閰嶇殑澶氱骇瀹℃壒",
- "features": ["BPMN+閽夐拤椋庢牸鍙岃璁″櫒", "娴佺▼瀹氫箟閮ㄧ讲", "瀹℃壒浜嬩欢缁熶竴鍥炶皟(BpmProcessInstanceStatusEvent)", "14涓笟鍔$洃鍚櫒", "琛ㄥ崟路鐢ㄦ埛缁劼锋妱閫伮峰姞绛�"],
+ "features": ["BPMN+閽夐拤椋庢牸鍙岃璁″櫒", "娴佺▼瀹氫箟閮ㄧ讲", "瀹℃壒浜嬩欢缁熶竴鍥炶皟(BpmProcessInstanceStatusEvent)", "15涓笟鍔$洃鍚櫒(鍚屼竴娴佺▼ key 鍏佽澶氫釜鐩戝惉鍣ㄥ苟琛屄峰悇鑷寜 key 杩囨护)", "琛ㄥ崟路鐢ㄦ埛缁劼锋妱閫伮峰姞绛�"],
"objects": ["娴佺▼妯″瀷", "娴佺▼瀹炰緥", "瀹℃壒浠诲姟"],
"roles": ["瀹℃壒浜�(鎸夋祦绋嬮厤缃�)", "娴佺▼绠$悊鍛�"],
"upstream": ["鍚勪笟鍔℃彁浜ゅ鎵�"], "downstream": ["鍥炶皟鏇存柊鍚勪笟鍔″崟鎹姸鎬�"],
diff --git a/docs/project-business/data/objects.json b/docs/project-business/data/objects.json
index 8fe9555..2b323a6 100644
--- a/docs/project-business/data/objects.json
+++ b/docs/project-business/data/objects.json
@@ -48,13 +48,13 @@
{"name": "鎺掔彮璁″垝", "module": "璁惧", "table": "mes_cal_plan", "doc": "鐝粍脳鐝脳鏃ユ湡鎺掔彮锛屼緵鐢熶骇涓庤�冨嫟寮曠敤", "upstream": [], "downstream": ["鐢熶骇浠诲姟", "鑰冨嫟"], "keywords": "鎺掔彮 鐝粍 鐝 鏃ュ巻"},
{"name": "鎶ュ憡妯℃澘", "module": "璐ㄦ鎶ュ憡", "table": "qc_report_template", "doc": "鏅鸿兘璐ㄦ鎶ュ憡妯℃澘锛屽惎鐢�0/鍋滅敤1锛涚敾甯冨唴瀹瑰瓨鍦� qc_report_template_version锛堣崏绋�0/宸插彂甯�1/宸插仠鐢�2锛屽凡鍙戝竷涓嶅彲瑕嗙洊锛夛紝currentVersion 鎸囧悜褰撳墠宸插彂甯冪増鏈紱婧愭枃浠剁粡 AI 瀵煎叆璇嗗埆鎴愯崏绋垮悗鐢变汉宸ョ‘璁ゆ墠鎴愪负鐗堟湰锛涘悓涓�妯℃澘閲嶅瀵煎叆鎸夈�愭浛鎹€�戝鐞嗏�斺�斿厛鍒犳棫闄勪欢锛堣繛甯� blob 琛屼笌纾佺洏鏂囦欢锛夊啀缁戞柊鐨勶紝涓嶇暀瀛ゅ効鏂囦欢锛涘垹闄ゆā鏉夸細杩炲甫娓呴檮浠�", "upstream": ["浜哄伐璁捐(GrapesJS 璁捐鍣�)", "AI 瀵煎叆鑽夌(qc-report/ai-import/draft)"], "downstream": ["妯℃澘鐗堟湰", "鎶ュ憡瀹炰緥"], "keywords": "鎶ュ憡妯℃澘 璐ㄦ鎶ュ憡 template 璁捐鍣� 鐗堟湰 AI瀵煎叆 璇嗗埆 鑽夌 婧愭枃浠舵浛鎹�"},
{"name": "鎶ュ憡瀹炰緥", "module": "璐ㄦ鎶ュ憡", "table": "qc_report_instance", "doc": "鍑轰欢浜х墿锛岀紪鍙� QR+yyyyMMdd+4浣嶆祦姘存寜澶╃嫭绔嬩笖涓氬姟鍞竴锛屽彲鏄惧紡鎸囧畾瑕嗙洊锛堟敞鎰� uk_report_no 涓嶅尯鍒嗚蒋鍒犻櫎锛屽垹鎺夌殑鍙蜂笉鍥炴敹锛夛紱涓ゆ潯鍑轰欢鍏ュ彛锛氶�氱敤 generate锛堣皟鐢ㄦ柟鑷甫 context锛変笌 generate-from-qc锛堟暟鎹粠 MES 璐ㄦ鍗曞彇锛屾潈闄愮爜 qc-report:instance:generate 宸插叆 system_menu id=1075416锛屼簲閬撴牎楠屾寜涓氬姟浼樺厛绾у彧鎶ョ涓�澶勶細105_000 绫诲瀷闈炴硶 / 105_001 鍗曟嵁涓嶅瓨鍦� / 105_002 鏈畬鎴� / 105_003 鏈垽瀹� / 105_005 妯℃澘绫诲瀷涓嶇 / 105_006 鏃犲彲鐢ㄦ楠岄」锛涘洓寮犺川妫�鍗曞垪琛ㄧ殑琛屾搷浣溿�屽嚭鎶ュ憡銆嶄粎鍦� status=宸插畬鎴愭椂鍙锛屽脊绐楀彧鍒� reportType 涓�鑷淬�佹ā鏉垮惎鐢ㄣ�佷笖 currentVersion 鎸囧悜鐨勭増鏈凡鍙戝竷鐨勬ā鏉匡紙鍚庣 /qc-report/template/selectable 鍒ゅ畾鈥斺�斿仠鐢ㄧ増鏈笉娓呯┖ currentVersion锛屽墠绔嬁鍒嗛〉缁撴灉鑷繁鎺ㄥ浼氭紡锛夛紝缁撴灉灏卞湴灞曠ず骞惰烦鏈〉鍒楄〃锛夛紱鍐荤粨 data_snapshot锛堝垽瀹氬悗鏁版嵁锛屽惈鍚庣绠楀ソ鐨� PASS/FAIL 涓庡悎鏍肩巼锛変笌 render_html锛況egenerate 鍙噸娓叉帓鐗堛�佹暟鎹笌缂栧彿涓嶅彉锛沚usiness_id/business_type 瀛� MES 琛ㄥ悕锛坢es_qc_iqc 绛夛級涓庡崟鎹� ID锛屽彲鍙嶆煡銆佷竴鍗曞彲鍑哄浠斤紱鎶ュ憡澶村彟甯﹀崟鎹師鍒ゅ畾 qcResult(鏁�)/qcResultText(涓枃锛屽悎鏍�/鐗归噰/涓嶅悎鏍奸��璐�/涓嶅悎鏍兼姤搴�)锛屼笌寮曟搸涓夋�佸垽瀹氬苟瀛樹簰涓嶈鐩栵紱鍝嶅簲甯� undecidableCount=蹇収涓� result 涓虹┖涓茬殑椤规暟涓� warnings锛堝垎缁勬爣棰樿烦杩�/鎸囨爣宸插垹/鏈綍瀹炴祴鍊�/鏍峰搧瓒�3锛夛紝涓よ�呴兘涓嶈惤搴撱�佷簨鍚庣湅涓嶅埌", "upstream": ["鎶ュ憡妯℃澘鐗堟湰", "璐ㄦ鍗曚笂涓嬫枃(閫氱敤 generate 鐢辫皟鐢ㄦ柟浼犲叆)", "MES 璐ㄦ鍗� IQC/IPQC/OQC/RQC(generate-from-qc 缁� MesQcReportApi 鍙栨暟)"], "downstream": ["鍓嶇瀹炰緥椤� /qc/report-instance(鍒楄〃路iframe棰勮路蹇収椤电路瀵煎嚭PDF)", "PDF褰掓。(system_storage_attachment recordType=qc_report_instance)"], "keywords": "鎶ュ憡瀹炰緥 鍑轰欢 QR缂栧彿 蹇収 澶嶇幇 regenerate PDF褰掓。 鎶ュ憡瀹炰緥椤� 瀵煎嚭PDF generate-from-qc 璐ㄦ鍗曞嚭鎶ュ憡 鍑烘姤鍛婂脊绐� qcResult undecidableCount warnings 寰呭垽瀹� 鍙嶆煡 涓氬姟鍗曟嵁绛涢��"},
- {"name": "鎶ラ攢鍗�", "module": "璐㈠姟鎶ラ攢", "table": "finance_reimbursement", "doc": "鍗曞彿鍙嚜瀹氫箟(涓棿涓嶅厑璁哥┖鏍硷紝涓庡凡鏈夊崟鍙烽噸澶嶅垯鎶ラ敊)锛涙柊澧炴椂鐣欑┖鎴栫函绌烘牸鐢辩郴缁熺敓鎴� BX+yyyyMMdd+6浣嶆祦姘�(Redis 姣忔棩閲嶇疆)锛屼慨鏀规椂鐣欑┖琛ㄧず淇濇寔涓嶅彉銆俿tatus: 0鑽夌/15瀹℃壒涓�/20宸查�氳繃/35宸查┏鍥�/40宸插綊妗o紱浠呰崏绋垮彲鍒犮�佽崏绋夸笌宸查┏鍥炲彲鏀广�佷粎宸查�氳繃鍙綊妗o紱鎻愪氦鍚庣敱 BPM 鐩戝惉鍣ㄦ寜缁撴灉鍥炲啓鐘舵��(鍙栨秷閫�鍥炶崏绋�)锛屽鎵逛腑 processInstanceId 琚洖鍐欙紱鐙珛妯″潡锛屼笉涓庡叾瀹冧笟鍔℃ā鍧椾骇鐢熷崟鎹叧鑱�", "upstream": [], "downstream": ["鎶ラ攢鏄庣粏", "鍙戠エ闄勪欢(storage_attachment路recordType=finance_reimbursement)"], "keywords": "鎶ラ攢鍗� 鎶ラ攢 鍙戠エ reimbursement BX 褰掓。 璐㈠姟 璐圭敤 鑷畾涔夊崟鍙�"},
+ {"name": "鎶ラ攢鍗�", "module": "璐㈠姟鎶ラ攢", "table": "finance_reimbursement", "doc": "鍗曞彿鍙嚜瀹氫箟(涓棿涓嶅厑璁哥┖鏍硷紝涓庡凡鏈夊崟鍙烽噸澶嶅垯鎶ラ敊)锛涙柊澧炴椂鐣欑┖鎴栫函绌烘牸鐢辩郴缁熺敓鎴� BX+yyyyMMdd+6浣嶆祦姘�(Redis 姣忔棩閲嶇疆)锛屼慨鏀规椂鐣欑┖琛ㄧず淇濇寔涓嶅彉銆俿tatus: 0鑽夌/15瀹℃壒涓�/20宸查�氳繃/35宸查┏鍥�/40宸插綊妗o紱浠呰崏绋垮彲鍒犮�佽崏绋夸笌宸查┏鍥炲彲鏀广�佷粎宸查�氳繃鍙綊妗o紱鎻愪氦鍚庣敱 BPM 鐩戝惉鍣ㄦ寜缁撴灉鍥炲啓鐘舵��(鍙栨秷閫�鍥炶崏绋�)锛屽鎵逛腑 processInstanceId 琚洖鍐欍�傛潵婧愪袱鏉★細鈶� 璐㈠姟妯″潡椤甸潰浜哄伐濉姤 鈶¤棰樼鐞嗐�岀粡璐规嫧浠樸�嶇粡 FinanceReimbursementApi(yudao-module-finance-api)鑷姩寤哄崟骞剁珛鍗虫彁浜�(1:1銆侀噾棰濅竴鑷淬�佺郴缁熷浐瀹� 1 琛屾槑缁喡疯垂鐢ㄧ被鍨�=鍏朵粬)鈥斺�斿悗鑰呯殑瀹℃壒缁撴灉鐢辫棰樹晶 ResearchFundStatusListener 璁㈤槄鍚屼竴娴佺▼鍥炲啓鎷ㄦ鍙拌处锛屾姤閿�鍗曟湰韬笉鍥炲啓浠讳綍澶栭儴鍗曟嵁", "upstream": ["璇鹃绠$悊(缁忚垂鎷ㄤ粯路缁� FinanceReimbursementApi 鑷姩寤哄崟)", "浜哄伐濉姤"], "downstream": ["鎶ラ攢鏄庣粏", "鍙戠エ闄勪欢(storage_attachment路recordType=finance_reimbursement)", "璇鹃鎷ㄦ鍙拌处(浠呯粡 BPM 浜嬩欢鍥炲啓鐘舵��)"], "keywords": "鎶ラ攢鍗� 鎶ラ攢 鍙戠エ reimbursement BX 褰掓。 璐㈠姟 璐圭敤 鑷畾涔夊崟鍙� 璇鹃缁忚垂鎷ㄤ粯 鑷姩寤哄崟 FinanceReimbursementApi"},
{"name": "鎶ラ攢鏄庣粏", "module": "璐㈠姟鎶ラ攢", "table": "finance_reimbursement_item", "doc": "鎶ラ攢鍗曠殑璐圭敤琛岋細璐圭敤绫诲瀷(1宸梾/2鍔炲叕/3鎷涘緟/4浜ら��/5鍏朵粬)銆佸彂绁ㄥ彿鐮併�佸彂绁ㄩ噾棰濄�佸彂绁ㄦ棩鏈熴�佸紑绁ㄦ柟銆佽垂鐢ㄨ鏄庯紱闅忎富琛ㄤ竴娆℃�ф彁浜�(鍏堝垹鍚庡鍏ㄩ噺瑕嗙洊)锛屾彁浜ゆ椂蹇呴』鍓ユ帀琛� id 涓� reimbursementId 鈥斺�� 鏄庣粏鍒犻櫎鏄蒋鍒狅紝鍥炰紶鍘� id 浼氫笌宸茶蒋鍒犺涓婚敭鍐茬獊", "upstream": ["鎶ラ攢鍗�"], "downstream": [], "keywords": "鎶ラ攢鏄庣粏 璐圭敤鏄庣粏 璐圭敤绫诲瀷 鍙戠エ閲戦 item 鏄庣粏琛� 宸梾"},
{"name": "鍏ヤ細鐢宠鍗�", "module": "浼氬憳绠$悊", "table": "ums_application", "doc": "鍗曞彿 SQ+yyyyMMdd+6浣嶆祦姘�(Redis 姣忔棩閲嶇疆)锛屽悗绔敓鎴愪笉鍙嚜瀹氫箟锛沵emberType 1涓汉/2鍗曚綅鍐冲畾瀛楁鍒嗗弶(涓汉鐢� workUnit/title锛屽崟浣嶇敤 legalPerson/organizationCode)锛沵emberGrade 鎸夌被鍨嬪彇涓嶅悓瀛楀吀锛泂tatus: 0鑽夌/15瀹℃壒涓�/20宸查�氳繃/35宸查┏鍥炪�備粎鑽夌鍙垹(杩炲甫娓呴檮浠�)銆佽崏绋夸笌宸查┏鍥炲彲鏀瑰彲閲嶆彁锛涙彁浜ゅ悗鐢� BPM 鐩戝惉鍣ㄦ寜缁撴灉鍥炲啓(鍙栨秷閫�鍥炶崏绋�)锛屽鎵逛腑鍥炲啓 processInstanceId锛涘鎵归�氳繃瑙﹀彂鑷姩寤轰細鍛樹笌绯荤粺璐﹀彿銆傜嫭绔嬫ā鍧楋紝涓嶄笌鍏跺畠涓氬姟妯″潡浜х敓鍗曟嵁鍏宠仈", "upstream": ["浜哄伐濉姤(鐢宠浜�)", "璇佹槑鏉愭枡闄勪欢(storage_attachment路recordType=ums_application)"], "downstream": ["浼氬憳(瀹℃壒閫氳繃鑷姩鍒涘缓)", "BPM 娴佺▼瀹炰緥(ums_membership_approve 鍒嗙被)"], "keywords": "鍏ヤ細鐢宠 鍏ヤ細 浼氬憳鐢宠 application SQ 绉樹功澶� 鐞嗕簨浼� 瀹℃壒 浼氬憳绫诲瀷 涓汉 鍗曚綅 娉曞畾浠h〃浜� 鐮旂┒鏂瑰悜 鐢宠绛夌骇"},
{"name": "浼氬憳", "module": "浼氬憳绠$悊", "table": "ums_member", "doc": "鍗曞彿 HY+yyyyMMdd+6浣嶆祦姘�(Redis 姣忔棩閲嶇疆)锛涗袱涓潵婧愶細鈶犲叆浼氱敵璇峰鎵归�氳繃鑷姩鍒涘缓(鍥炲~ applicationId 涓� userName/绯荤粺璐﹀彿) 鈶′細鍛樺垪琛ㄦ墜宸ユ柊澧炪�俿tatus: 1姝e父/0鏆傚仠锛沵emberGrade 鎸� memberType 鍙栧搴斿瓧鍏革紝鏍¢獙瑙勫垯鏄崟浣嶄細鍛�(type=2)涓嶅彲閫夈�庣悊浜嬮暱銆�(grade=5)銆傝嚜鍔ㄥ缓妗f椂鍏ヤ細鏃ユ湡=褰撳ぉ銆佷笉鎼繍 contactUser/unitIntro/expireDate(鐢宠鍗曟棤瀵瑰簲瀛楁)锛涜嚜鍔ㄥ缓鐨勭郴缁熻处鍙风敤鎴峰悕涓鸿仈绯荤數璇濅笖鍒濆瀵嗙爜鍚屼负鑱旂郴鐢佃瘽锛岄儴闂ㄥ浐瀹氫负銆屽浼氫細鍛樸�嶏紱鎵嬫満鍙烽噸澶嶄細鏄庣‘鎶ラ敊涓旀暣鍗曚簨鍔″洖婊�", "upstream": ["鍏ヤ細鐢宠鍗�(瀹℃壒閫氳繃)", "浜哄伐鏂板", "闄勪欢(storage_attachment路recordType=ums_member)"], "downstream": ["浼氬憳閫氳褰�(鎸� regionCode/industry 妫�绱�)", "system_users(鐧诲綍璐﹀彿)"], "keywords": "浼氬憳 member HY 浼氬憳缂栧彿 浼氬憳绛夌骇 浼氬憳绫诲瀷 閫氳褰� 鍦板尯 琛屼笟 鍏ヤ細鏃ユ湡 鏈夋晥鏈�"},
{"name": "璇鹃鎸囧崡", "module": "璇鹃绠$悊", "table": "research_guideline", "doc": "鎸囧崡缂栧彿 GL+yyyyMMdd+6浣嶆祦姘�(Redis 姣忔棩閲嶇疆)锛沜ategory 1閲嶇偣璇鹃/2涓�鑸棰橈紱publishStatus 0鑽夌/20宸插彂甯�/30宸叉埅姝紝浠呰崏绋垮彲鏀瑰彲鍒狅紝publish 鍙戝竷鍥炲啓 publishTime锛宑lose 鎴缃� 30锛涘凡浜х敓鐢虫姤鍗�(applicationMapper.selectCountByGuidelineId 澶т簬 0)鐨勬寚鍗楃姝㈠垹闄ゅ苟鍦ㄦ彁绀轰腑鎶ュ嚭璇ユ寚鍗椾笅宸叉湁澶氬皯寮犵敵鎶ュ崟锛涙鏂� content 涓洪暱鏂囨湰锛涢檮浠� recordType=research_guideline", "upstream": ["浜哄伐缁存姢(瀛︿細绉樹功澶�)", "鎸囧崡闄勪欢(storage_attachment路recordType=research_guideline)"], "downstream": ["璇鹃鐢虫姤涔�(鐢虫姤鏃跺紩鐢ㄤ笖蹇呴』宸插彂甯冨苟鍦ㄧ敵鎶ユ湡鍐�)"], "keywords": "璇鹃鎸囧崡 鎸囧崡 鍙戝竷 鎴 閲嶇偣璇鹃 涓�鑸棰� GL 鎸囧崡缂栧彿 鐢虫姤鏈� 鐢虫姤璧锋"},
{"name": "璇鹃鐢虫姤涔�", "module": "璇鹃绠$悊", "table": "research_application", "doc": "鐢虫姤缂栧彿 SB+yyyyMMdd+6浣嶆祦姘�(Redis 姣忔棩閲嶇疆)锛沢uidelineId 鍏宠仈鎸囧崡銆乵emberId 鍏宠仈 ums_member(杞叧鑱旀棤澶栭敭锛屼細鍛樺垹闄ゅ悗浼氱暀涓嬫偓绌� memberId 闇�瀹归敊鏄剧ず)锛沘pplicantName/workUnit/jobTitle/contactPhone/contactEmail 鐢遍�変細鍛樿嚜鍔ㄥ甫鍑哄彲鎵嬫敼锛沜ategory 鍐椾綑鑷寚鍗椾笖涓嶄俊浠诲墠绔紶鍊硷紱budgetAmount 鐢宠缁忚垂涓烘嫧浠樹笂闄愶紱status: 0鑽夌/15瀹℃壒涓�/20宸茬珛椤�/35宸查┏鍥炪�備粎鑽夌鍙垹(杩炲甫娓呴檮浠�)銆佽崏绋夸笌宸查┏鍥炲彲鏀瑰彲閲嶆彁锛泂ubmit 鍓嶉�愭潯鏍¢獙銆屾寚鍗楀凡鍙戝竷銆嶄笌銆岀幇鍦ㄥ湪鐢虫姤鏈熷唴銆嶏紝浠讳竴涓嶆弧瓒冲嵆鎷掔粷骞舵寜缁村害缁欏嚭鎸囧崡鍚嶄笌瀹為檯鍊硷紱瀹℃壒閫氳繃鐢辩洃鍚櫒鐢熸垚绔嬮」缂栧彿 researchNo(LX+鍚屾棩娴佹按)涓� approveTime(宸叉湁缂栧彿骞傜瓑璺宠繃)锛況eviewAvgScore/reviewPass 涓鸿瘎瀹℃眹鎬诲洖鍐欏�硷紝鏄庣粏鍒犵┖鏃舵竻鎴愭湭姹囨�伙紱noticeId 璁板綍宸插彂甯冪殑绔嬮」閫氱煡鍏憡锛岄噸澶嶅彂甯冭鎷︽埅", "upstream": ["璇鹃鎸囧崡(蹇呴』宸插彂甯冧笖鍦ㄧ敵鎶ユ湡鍐�)", "浼氬憳(ums_member路甯﹀嚭鐢虫姤浜轰俊鎭�)", "鐢虫姤闄勪欢(storage_attachment路recordType=research_application)"], "downstream": ["涓撳璇勫鏄庣粏", "缁忚垂鎷ㄤ粯璁板綍", "绔嬮」閫氱煡(system_notice 鍏憡)", "BPM 娴佺▼瀹炰緥(research_topic_approve 鍒嗙被)", "闄勪欢涓績"], "keywords": "璇鹃鐢虫姤 鐢虫姤涔� 鐢虫姤鍗� SB 鐢虫姤缂栧彿 绔嬮」 绔嬮」缂栧彿 LX 鐢宠缁忚垂 鐢虫姤涔︽鏂� 璇鹃缁勬垚鍛� 涓撳璇勫 璇勫姹囨�� 绔嬮」閫氱煡 鍙戝竷閫氱煡 鎻愪氦瀹℃壒 椹冲洖 閲嶆彁"},
{"name": "涓撳璇勫鏄庣粏", "module": "璇鹃绠$悊", "table": "research_topic_review", "doc": "涓�浣嶄笓瀹朵竴琛岀殑涓�涓诲琛屽瓙琛細evaluatorName/evaluatorUnit/evaluatorTitle + topicScore 閫夐浠峰�间笌鎰忎箟(鏉冮噸0.3) + planScore 鐮旂┒鏂规鍙鎬�(0.3) + teamScore 鍥㈤槦涓庣爺绌跺熀纭�(0.2) + resultScore 棰勬湡鎴愭灉涓庢晥鐩�(0.2) + conclusion 1鎺ㄨ崘绔嬮」/2涓嶆帹鑽愮珛椤� + opinion 璇勫鎰忚 + reviewTime銆俢ompositeScore 鐢卞悗绔� weightedScore 璁$畻銆乺anking 鐢卞悗绔寜鍔犳潈鍒嗛檷搴忛噸鎺掞紝鍧囦笉鎺ュ彈鍓嶇浼犲�硷紱姣忔澧炲垹鏀瑰悗璋� recalculate 鍥炲啓涓诲崟 reviewAvgScore(鍏ㄩ儴涓撳鍔犳潈鍒嗗潎鍊悸蜂繚鐣�2浣�)涓� reviewPass(鍧囧垎杈炬爣 涓� 澶氭暟缁撹涓烘帹鑽愮珛椤规椂涓� 1)锛涘洓椤瑰垎鍊艰秴鍑� 0~100 鏃舵彁绀烘寚鍑哄叿浣撶淮搴︿笌瀹為檯鍊硷紱浠呭湪鐢虫姤鍗� status=15 瀹℃壒涓彲澧炲垹鏀�", "upstream": ["璇鹃鐢虫姤涔�(浠呭鎵逛腑鍙啓)"], "downstream": ["璇鹃鐢虫姤涔�(鍥炲啓 reviewAvgScore/reviewPass)"], "keywords": "涓撳璇勫 璇勫鏄庣粏 璇勫垎 鍔犳潈 鏉冮噸 鎺掑悕 ranking compositeScore 鎺ㄨ崘绔嬮」 璇勫鎰忚 鍧囧垎"},
- {"name": "缁忚垂鎷ㄤ粯璁板綍", "module": "璇鹃绠$悊", "table": "research_fund_record", "doc": "涓�涓诲琛岀殑鎷ㄦ璁板綍锛歜atchName 鎵规鍚嶇О/amount 鎷ㄤ粯閲戦/payDate 鎷ㄤ粯鏃ユ湡/payee 鏀舵鍗曚綅/status 0寰呮嫧浠� 20宸叉嫧浠�/remark锛屽嚟璇侀檮浠惰蛋 system 闄勪欢涓績 recordType=research_fund_record(琛ㄥ唴涓嶅瓨鏂囦欢鍦板潃)銆備粎鐢虫姤鍗� status=20 宸茬珛椤瑰彲鐧昏锛涢噾棰濇牎楠岋細宸茬櫥璁伴噾棰�(璇ュ崟鍏ㄩ儴璁板綍姹傚拰) + 鏈閲戦 涓嶅緱瓒呭嚭鐢虫姤鍗� budgetAmount锛岃秴鍑烘椂鎻愮ず鎶ュ嚭鏈銆佸凡鐧昏銆佸悎璁°�侀绠楀洓椤规暟鍊硷紱status=20 宸叉嫧浠� 鏃跺嚟璇侀檮浠跺繀濉�(鍓嶇鍏堣鎷︽埅锛屽悗绔� validateVoucherRequired 鍏滃簳)锛涗粎寰呮嫧浠樼姸鎬佸彲鏀瑰彲鍒狅紝缂栬緫鏃舵妸鏈閲戦鍔犲洖鍙敤浣欓灞曠ず閬垮厤璇В", "upstream": ["璇鹃鐢虫姤涔�(蹇呴』宸茬珛椤�)"], "downstream": ["鎷ㄤ粯鍑瘉(storage_attachment路recordType=research_fund_record)", "璐㈠姟(浜屾湡棰勬湡寰呭鎺ヂ蜂竴鏈熶笉鎺�)"], "keywords": "缁忚垂鎷ㄤ粯 鎷ㄦ 鎷ㄤ粯璁板綍 鎵规 鎷ㄤ粯閲戦 鍑瘉 寰呮嫧浠� 宸叉嫧浠� 鏀舵鍗曚綅 璧勫姪閲戦 棰勭畻 瓒呴"}
+ {"name": "缁忚垂鎷ㄤ粯璁板綍", "module": "璇鹃绠$悊", "table": "research_fund_record", "doc": "涓�涓诲琛岀殑鎷ㄦ鍙拌处锛歜atchName 鎵规鍚嶇О/amount 鎷ㄤ粯閲戦/payDate 鎷ㄤ粯鏃ユ湡/payee 鏀舵鍗曚綅/remark锛屽嚟璇侀檮浠惰蛋 system 闄勪欢涓績 recordType=research_fund_record(琛ㄥ唴涓嶅瓨鏂囦欢鍦板潃)銆俿tatus: 0寰呮嫧浠�/15鎶ラ攢瀹℃壒涓�/20宸叉嫧浠�/30宸查┏鍥烇紝鐢辩郴缁熶笌 BPM 椹卞姩锛屾柊澧�/淇敼鎺ュ彛宸茬Щ闄� status 鍏ュ弬(闃蹭吉閫犮�屽凡鎷ㄤ粯銆�)銆傜櫥璁板嵆涓�鏉¢緳锛氳惤鍙拌处 鈫� 鍚屼竴鎵� blob 鍙岀粦 鈫� 缁� FinanceReimbursementApi 鑷姩鐢熸垚 1:1 鐨� finance_reimbursement 骞剁珛鍗虫彁浜� BPM 鈫� 鍥炲啓 reimbursement_id/reimbursement_no 骞剁疆 15锛涘鎵圭粨鏋滅敱鐩戝惉鍣ㄥ洖鍐欙細閫氳繃鈫�20銆侀┏鍥炩啋30(+reject_reason/reject_time)銆佹挙鍥炴垨鍙栨秷鈫掗��鍥� 0銆備粎鐢虫姤鍗� status=20 宸茬珛椤瑰彲鐧昏锛涘嚟璇佸繀濉紱閲戦鏍¢獙锛氬凡鐧昏閲戦(璇ュ崟鍏ㄩ儴璁板綍姹傚拰) + 鏈閲戦 涓嶅緱瓒呭嚭鐢虫姤鍗� budgetAmount锛岃秴鍑烘椂鎻愮ず鎶ュ嚭鏈銆佸凡鐧昏銆佸悎璁°�侀绠楀洓椤规暟鍊硷紱浠呫�屽緟鎷ㄤ粯銆嶅彲鍒�(鑱斿姩鍒犻櫎璐㈠姟渚ц崏绋挎姤閿�鍗曪紝闈炶崏绋垮垯鎷掔粷)锛屻�屽緟鎷ㄤ粯銆嶃�屽凡椹冲洖銆嶅彲鏀瑰苟閲嶆柊鍙戣捣鎶ラ攢(宸查┏鍥炴敼鍚庢竻绌� reject_reason/reject_time)锛岀紪杈戞椂鎶婃湰琛岄噾棰濆姞鍥炲彲鐢ㄤ綑棰濆睍绀洪伩鍏嶈瑙c�備笌鎶ラ攢鍗曚负杞叧鑱�(鏃犲閿�)锛岃储鍔′晶鐩存帴鍒犲崟浼氱暀涓嬫偓绌� reimbursement_id锛屾鏃朵慨鏀规姤銆屾姤閿�鍗曞凡涓嶅瓨鍦紝璇峰垹闄ゆ湰鏉¤褰曞悗閲嶆柊鐧昏銆�", "upstream": ["璇鹃鐢虫姤涔�(蹇呴』宸茬珛椤�)", "璐㈠姟鎶ラ攢鍗�(1:1 鑷姩鐢熸垚路杞叧鑱� reimbursement_id)"], "downstream": ["鎷ㄤ粯鍑瘉(storage_attachment路recordType=research_fund_record)", "璐㈠姟鎶ラ攢鍗�(鐢熸垚骞舵彁浜ゅ嚭璐β峰鎵圭粨鏋滃洖鍐欐湰鍙拌处)"], "keywords": "缁忚垂鎷ㄤ粯 鎷ㄦ 鎷ㄤ粯璁板綍 鎵规 鎷ㄤ粯閲戦 鍑瘉 寰呮嫧浠� 鎶ラ攢瀹℃壒涓� 宸叉嫧浠� 宸查┏鍥� 椹冲洖鍘熷洜 璐㈠姟鎶ラ攢鍗曞彿 reimbursement_id 鏀舵鍗曚綅 璧勫姪閲戦 棰勭畻 瓒呴 閲嶆柊鍙戣捣鎶ラ攢"}
]
}
diff --git a/docs/project-business/index.html b/docs/project-business/index.html
index 36d2fe7..01577a7 100644
--- a/docs/project-business/index.html
+++ b/docs/project-business/index.html
@@ -213,7 +213,7 @@
"businessModules": 16,
"coreObjects": 56,
"documentFlows": 9,
- "approvalListeners": 14,
+ "approvalListeners": 15,
"aiCapabilities": 8,
"wmBillTypes": 15
},
@@ -333,20 +333,22 @@
"杞鐢宠(hrm_regularize_application)銆佸煿璁瘉涔︾瓑浠呮湁 SQL 涓庤彍鍗曞垵濮嬪寲锛孞ava 渚� Service/Controller 鏈疄鐜�",
"NCR 澶勭疆缁撴灉锛堣繑宸�/閫�璐э級鏈洖鍐欒Е鍙戞簮鍗曟嵁锛屼粎鍙拌处璁板綍",
"MPS 鐘舵�佹灇涓剧嫭绔嬬紪鍙�(0/1/2/3)锛屼笌閫氱敤鍗曟嵁甯搁噺(0/1/4/5)涓嶄竴鑷�",
- "璐㈠姟鎶ラ攢锛欱PM 鍒嗙被 finance_reimbursement_approve 涓嬪皻鏃犲凡鍙戝竷鐨勬祦绋嬪畾涔夛紙act_re_cprocdef 涓虹┖锛夛紝涓旀祦绋嬮渶鎶娿�岃嚜瀹氫箟琛ㄥ崟璺緞銆嶉厤涓� /finance/reimbursement/detail/approve/index.vue锛屽惁鍒欏墠绔�屾彁浜ゅ鎵广�嶈绂佺敤銆佸鎵逛腑蹇冪湅涓嶅埌鎶ラ攢鍗曞唴瀹广�愰渶 BPM 璁捐鍣ㄤ晶閰嶇疆銆�",
+ "璐㈠姟鎶ラ攢锛欱PM 鍒嗙被 finance_reimbursement_approve 涓嬪皻鏃犲凡鍙戝竷鐨勬祦绋嬪畾涔夛紙act_re_procdef 涓虹┖锛夆�斺�旇娴佺▼鐜板凡鏄�岃棰樼粡璐规嫧浠樿嚜鍔ㄥ缓鍗曞苟鎻愪氦銆嶇殑纭墠缃紝鏈柟妗堝凡鎵嬪啓 2 鑺傜偣 BPMN锛坉ocs/sql/finance_reimbursement_approve.bpmn锛氳储鍔″鏍� 鈫� 璐㈠姟涓荤瀹℃壒锛夊緟閮ㄧ讲锛涢儴缃插悗杩橀渶鎶娿�岃嚜瀹氫箟琛ㄥ崟璺緞銆嶉厤涓� /finance/reimbursement/detail/approve/index.vue锛坒orm_type=20锛夛紝鍚﹀垯鍓嶇銆屾彁浜ゅ鎵广�嶈绂佺敤銆佸鎵逛腑蹇冪湅涓嶅埌鎶ラ攢鍗曞唴瀹广�愰渶 BPM 璁捐鍣ㄤ晶閰嶇疆銆�",
"璐㈠姟鎶ラ攢锛氳彍鍗曚粎鎺堜簣 super_admin锛堣秴绠$敱浠g爜鐩磋繑鍏ㄩ儴鑿滃崟锛夛紝鏅�氳鑹叉湭閰� system_role_menu锛岄潪瓒呯鐧诲綍鐪嬩笉鍒般�屾姤閿�鍗曘�嶈彍鍗曘�愬緟纭鏄惁琛ユ巿鏉冦��",
"浼氬憳绠$悊锛氫細鍛樼鐞嗚彍鍗�(1075490~1075503)浠� super_admin 鍙锛屾櫘閫氳鑹叉湭閰� system_role_menu锛岄潪瓒呯鐧诲綍鐪嬩笉鍒颁細鍛樼鐞嗙洰褰曘�愬緟纭鏄惁琛ユ巿鏉冦��",
"浼氬憳绠$悊锛氬鎵归�氳繃鑷姩寤虹郴缁熻处鍙风敤銆岃仈绯荤數璇濄�嶅悓鏃朵綔鐢ㄦ埛鍚嶄笌鍒濆瀵嗙爜锛岃嫢鑱旂郴鐢佃瘽涓虹┖浼氱敤瀛楅潰閲� unknown 鍏滃簳锛屽瓨鍦ㄥ急鍙d护涓庨噸鍚嶉闄┿�愬緟纭鏄惁鏀归�犮��",
"浼氬憳绠$悊锛氳嚜鍔ㄥ缓妗d笉鎼繍 contactUser/unitIntro/expireDate锛坲ms_application 鏃犲搴斿瓧娈碉級锛屽崟浣嶄細鍛樼殑銆岃仈绯讳汉/鍗曚綅绠�浠�/鏈夋晥鏈熴�嶅彧鑳藉湪浼氬憳鍒楄〃鎵嬪伐琛ュ綍銆愬緟纭鏄惁闇�瑕佺敵璇峰崟澧炲瓧娈点��",
"浼氬憳绠$悊锛氬崟浣嶄細鍛樼殑绛夌骇瀛楀吀 ums_unit_grade 浠呭埌銆屼細闀垮崟浣嶃��(4)锛屼絾鏍¢獙閫昏緫棰濆纭紪鐮佺姝㈠崟浣嶉�夈�岀悊浜嬮暱銆�(grade=5)鈥斺�旇鍊兼湰涓嶅湪鍗曚綅瀛楀吀鍐咃紝灞為槻寰℃�у啑浣欐牎楠屻�愬緟纭鏄惁绮剧畝銆�",
"璇鹃绠$悊锛氫笓瀹惰瘎鍒嗘潈閲嶏紙閫夐0.3/鏂规0.3/鍥㈤槦0.2/鎴愭灉0.2锛変笌銆屽姞鏉冨潎鍒嗏墺60 涓� 澶氭暟缁撹涓烘帹鑽愮珛椤广�嶇殑閫氳繃闃堝�兼槸鍗犱綅瑙勫垯锛岄渶瀛︿細鏈�缁堢‘璁わ紱宸查泦涓负甯搁噺渚夸簬璋冩暣銆愬緟纭锛屾敼鍔ㄥ彧闇�鏀瑰父閲忋��",
- "璇鹃绠$悊锛氫竴鏈熺粡璐规嫧浠樺彧鍦ㄦ湰妯″潡钀芥嫧娆捐褰曪紝涓庤储鍔℃ā鍧楁棤浠讳綍鏁版嵁鍚屾锛屽悓涓�绗旈挶鍦ㄤ袱澶勮褰曞瓨鍦ㄤ笉涓�鑷撮闄╋紱浜屾湡瀵规帴鏃堕渶鏄庣‘浠ュ摢渚т负鍑嗐�愬緟纭銆�",
+ "璇鹃绠$悊锛氱粡璐规嫧浠樺凡瀵规帴璐㈠姟鎶ラ攢锛�1:1 鐢熸垚 finance_reimbursement 骞惰嚜鍔ㄦ彁浜ゅ鎵癸級锛屼絾鍙拌处涓庢姤閿�鍗曟槸杞叧鑱旓紙鏃犲閿紝浠呴潬 reimbursement_id锛夛紝璐㈠姟渚х洿鎺ュ垹闄ゆ姤閿�鍗曚細鐣欎笅鍙拌处鐨勬偓绌� reimbursement_id锛涘凡鐢� FUND_REIMBURSEMENT_NOT_EXISTS 绮剧‘鎻愮ず鍏滃簳锛屼笉鍋氭暟鎹簱绾х害鏉熴�愬凡鎺ュ彈鐨勯闄┿��",
+ "璇鹃绠$悊锛氭柊寤虹殑璐㈠姟鎶ラ攢瀹℃壒娴佺▼ finance_reimbursement_approve 涓� 2 鑺傜偣锛堣储鍔″鏍� 鈫� 璐㈠姟涓荤瀹℃壒锛夛紝鑺傜偣榛樿瀹℃壒浜虹瓥鐣ヤ负銆岃鑹� = 瓒呯骇绠$悊鍛�(1)銆佷緷娆″鎵广�嶏紱涓婄嚎鍓嶉渶鍦� BPM 璁捐鍣ㄤ腑鎸夊浼�/璐㈠姟瀹為檯瀹℃壒浜鸿皟鏁达紝鍚﹀垯璇ヨ鑹蹭笅澶氱敤鎴蜂細鍙樻垚閫愪汉浼氱銆愮幆澧冮厤缃」锛岄潪浠g爜缂洪櫡銆�",
+ "璇鹃绠$悊锛氱粡璐规嫧浠樺彴璐︾殑銆屽凡鎷ㄤ粯(20)銆嶇瓑浠蜂簬鎶ラ攢鍗曘�屽凡閫氳繃(20)銆嶏紝涓嶅惈鍑虹撼瀹為檯浠樻鍔ㄤ綔锛涜嫢鏃ュ悗闇�瑕佺嫭绔嬬殑銆屽凡浠樻銆嶇姸鎬侊紝闇�鍙﹀鐘舵�佷笌瀹℃壒鑺傜偣銆愪簩鏈熷彲鎵╁睍銆�",
"璇鹃绠$悊锛氱敵鎶ュ崟涓� ums_member 鏄蒋鍏宠仈锛堟棤澶栭敭锛夛紝浼氬憳琚垹闄ゅ悗鐢虫姤鍗曚細鐣欎笅鎮┖ memberId锛涙垚鍛樺垪琛ㄩ渶瀹归敊灞曠ず銆屼細鍛樺凡鍒犻櫎銆嶃�愬緟纭鏄惁鍔犲閿垨鍒犻櫎淇濇姢銆�",
"璇鹃绠$悊锛欱PM 娴佺▼ research_topic_approve 涓夎妭鐐归粯璁ゅ鎵逛汉涓恒�岃鑹�=瓒呯骇绠$悊鍛�(1) + 渚濇瀹℃壒銆嶏紝璇� dev 搴撹秴绾х鐞嗗憳瑙掕壊涓嬫湁 4 涓敤鎴凤紙admin/寮犲/椹姵/椹礊锛夛紝姣忎釜鑺傜偣闇� 4 浜轰細绛炬墠鎺ㄨ繘锛涘叏鏂板畨瑁呭簱璇ヨ鑹蹭粎 admin 涓�浜恒�佹祦绋嬪彲寮�绠卞嵆鐢ㄣ�俤ev 搴撻渶鍑忓皯瓒呯骇绠$悊鍛樼敤鎴锋垨鏀瑰湪 BPM 璁捐鍣ㄤ腑涓烘瘡鑺傜偣鎸囧畾瀹℃壒浜恒�愮幆澧冮厤缃」锛岄潪浠g爜缂洪櫡銆�",
"璇鹃绠$悊锛氱珛椤归�氱煡澶嶇敤 system_notice 绯荤粺鍏憡锛屼笉鏂板 system_notify_template銆佷笉鍙戠珯鍐呬俊锛涘闇�鐭俊/绔欏唴淇″畾鍚戦�氱煡闇�鍙﹁閰嶇疆銆愬緟纭閫氱煡娓犻亾銆�"
],
- "generatedAt": "2026-09-28",
- "analysisBasis": "鍩轰簬 dev_business 鍒嗘敮 87bf4a99 婧愮爜锛�6 缁勫苟琛屾簮鐮佽蛋璇伙紙MES 鐢熶骇璐ㄩ噺 / MES 浠撳偍 / ERP / CRM+SRM / 鍞悗+HRM / AI+BI+MDM+BPM+搴曞骇锛夛紱2026-09-28 澧為噺琛ュ厖 yudao-module-finance 鐙珛璐㈠姟鎶ラ攢妯″潡锛堟姤閿�鍗� + 鏄庣粏 + 鍙戠エ闄勪欢 + BPM 瀹℃壒 + 褰掓。锛変笌 yudao-module-ums 鐙珛浼氬憳绠$悊妯″潡锛堝叆浼氱敵璇� + BPM 涓ょ骇瀹℃壒 + 瀹℃壒閫氳繃鑷姩寤轰細鍛樹笌鐧诲綍璐﹀彿 + 浼氬憳鍒楄〃/閫氳褰曪級锛�2026-09-28 澧為噺锛欱PM 娴佺▼瀹氫箟 ums_membership_approve锛堝叆浼氬鎵癸級宸插湪 mom-jssm 閮ㄧ讲骞跺苟鍏� config_export_all 闃舵涓�锛堝垎绫� ums_membership_approve锛岀涔﹀鍒濆 鈫� 鐞嗕簨浼氬璁紝涓よ妭鐐瑰鎵逛汉鍧囦负銆岃鑹层�嶇瓥鐣ャ�佽鑹�=瓒呯骇绠$悊鍛�(1) 鍏滃簳锛岃〃鍗曠被鍨�=鑷畾涔夎〃鍗曪紝鏌ョ湅璺緞 /ums/application/detail/approve/index.vue锛夛紱鍚屾椂淇 mom-jssm 鐢� CREATE TABLE ... LIKE 鍏嬮殕瀵艰嚧鐨� 47 涓寚鍚� ruoyi-vue-pro 鐨� act_*/flw_* 璺ㄥ簱澶栭敭锛堥噸寤轰负鎸囧悜 mom-jssm 鑷韩锛屽鍎胯棰勬涓� 0锛夛紱2026-09-28 澧為噺锛氭柊澧� yudao-module-research 鐙珛绉戠爺璇鹃妯″潡涓�鏈燂紙璇鹃鎸囧崡鍙戝竷 + 鍦ㄧ嚎鐢虫姤 + 涓撳璇勫鏄庣粏 + BPM 涓夌骇绔嬮」瀹℃壒 + 绔嬮」閫氱煡鍏憡 + 缁忚垂鎷ㄤ粯璁板綍锛�4 寮� research_* 琛� / 5 涓瓧鍏� / bpm_category id=8002 / 娴佺▼ research_topic_approve / 鑿滃崟 1075510~1075553锛夛紝骞跺苟鍏� config_export_all_20260928 闃舵涓�锛涚敵鎶ヤ汉鍙� ums_member锛堣蒋鍏宠仈锛夈�佺珛椤归�氱煡澶嶇敤 system_notice 鍏憡銆佹嫧娆惧嚟璇佽蛋 system 闄勪欢涓績 recordType=research_fund_record"
+ "generatedAt": "2026-09-29",
+ "analysisBasis": "鍩轰簬 dev_business 鍒嗘敮 87bf4a99 婧愮爜锛�6 缁勫苟琛屾簮鐮佽蛋璇伙紙MES 鐢熶骇璐ㄩ噺 / MES 浠撳偍 / ERP / CRM+SRM / 鍞悗+HRM / AI+BI+MDM+BPM+搴曞骇锛夛紱2026-09-28 澧為噺琛ュ厖 yudao-module-finance 鐙珛璐㈠姟鎶ラ攢妯″潡锛堟姤閿�鍗� + 鏄庣粏 + 鍙戠エ闄勪欢 + BPM 瀹℃壒 + 褰掓。锛変笌 yudao-module-ums 鐙珛浼氬憳绠$悊妯″潡锛堝叆浼氱敵璇� + BPM 涓ょ骇瀹℃壒 + 瀹℃壒閫氳繃鑷姩寤轰細鍛樹笌鐧诲綍璐﹀彿 + 浼氬憳鍒楄〃/閫氳褰曪級锛�2026-09-28 澧為噺锛欱PM 娴佺▼瀹氫箟 ums_membership_approve锛堝叆浼氬鎵癸級宸插湪 mom-jssm 閮ㄧ讲骞跺苟鍏� config_export_all 闃舵涓�锛堝垎绫� ums_membership_approve锛岀涔﹀鍒濆 鈫� 鐞嗕簨浼氬璁紝涓よ妭鐐瑰鎵逛汉鍧囦负銆岃鑹层�嶇瓥鐣ャ�佽鑹�=瓒呯骇绠$悊鍛�(1) 鍏滃簳锛岃〃鍗曠被鍨�=鑷畾涔夎〃鍗曪紝鏌ョ湅璺緞 /ums/application/detail/approve/index.vue锛夛紱鍚屾椂淇 mom-jssm 鐢� CREATE TABLE ... LIKE 鍏嬮殕瀵艰嚧鐨� 47 涓寚鍚� ruoyi-vue-pro 鐨� act_*/flw_* 璺ㄥ簱澶栭敭锛堥噸寤轰负鎸囧悜 mom-jssm 鑷韩锛屽鍎胯棰勬涓� 0锛夛紱2026-09-28 澧為噺锛氭柊澧� yudao-module-research 鐙珛绉戠爺璇鹃妯″潡涓�鏈燂紙璇鹃鎸囧崡鍙戝竷 + 鍦ㄧ嚎鐢虫姤 + 涓撳璇勫鏄庣粏 + BPM 涓夌骇绔嬮」瀹℃壒 + 绔嬮」閫氱煡鍏憡 + 缁忚垂鎷ㄤ粯璁板綍锛�4 寮� research_* 琛� / 5 涓瓧鍏� / bpm_category id=8002 / 娴佺▼ research_topic_approve / 鑿滃崟 1075510~1075553锛夛紝骞跺苟鍏� config_export_all_20260928 闃舵涓�锛涚敵鎶ヤ汉鍙� ums_member锛堣蒋鍏宠仈锛夈�佺珛椤归�氱煡澶嶇敤 system_notice 鍏憡銆佹嫧娆惧嚟璇佽蛋 system 闄勪欢涓績 recordType=research_fund_record锛�2026-09-29 澧為噺锛氳棰樼粡璐规嫧浠樺鎺ヨ储鍔℃姤閿�鈥斺�旀柊寤� yudao-module-finance-api锛團inanceReimbursementApi锛氬缓鍗�+鎻愪氦/鏀瑰崟+閲嶆彁/鍒犻櫎/鏌ヨ鍥涙柟娉曪紝鏈湴 Spring Bean 璋冪敤锛屾棤闇� Feign锛夛紝璇鹃渚х櫥璁版嫧娆炬椂 1:1 鑷姩鐢熸垚 finance_reimbursement锛堢郴缁熺敓鎴� 1 琛屾槑缁嗭細璐圭敤绫诲瀷=鍏朵粬 5銆佸彂绁ㄩ噾棰�=鎷ㄤ粯閲戦銆佸彂绁ㄦ棩鏈�=鎷ㄤ粯鏃ユ湡銆佽鏄�=銆岃棰樸�斿悕銆曠 N 鏈熸嫧娆俱�嶏級骞剁珛鍗虫彁浜� BPM锛屽洖鍐� reimbursement_id/reimbursement_no銆佸彴璐︾疆銆屾姤閿�瀹℃壒涓�(15)銆嶏紱鍑瘉鏀逛负鐧昏鏃跺繀濉苟鍙岀粦锛坮esearch_fund_record + finance_reimbursement锛夛紱鏂板 ResearchFundStatusListener锛堢 15 涓笟鍔$洃鍚櫒锛屼笌 finance 鑷繁鐨� FinanceReimbursementStatusListener 璁㈤槄鍚屼竴娴佺▼ key 骞惰瑙﹀彂锛夋寜瀹℃壒缁撴灉鍥炲啓鍙拌处锛氶�氳繃鈫掑凡鎷ㄤ粯(20)銆侀┏鍥炩啋宸查┏鍥�(30)+椹冲洖鍘熷洜/鏃堕棿銆佹挙鍥炴垨鍙栨秷鈫掗��鍥炲緟鎷ㄤ粯(0)鍙敼鍚庡彲閲嶆柊鍙戣捣锛涙柊閫� 2 鑺傜偣 BPMN docs/sql/finance_reimbursement_approve.bpmn锛堣储鍔″鏍� 鈫� 璐㈠姟涓荤瀹℃壒锛宑ategory id=216 宸插瓨鍦ㄤ絾娴佺▼瀹氫箟寰呴儴缃诧級"
}</script>
<script type="application/json" id="data-modules">{
"modules": [
@@ -385,10 +387,10 @@
{"key": "fin", "name": "璐㈠姟鎶ラ攢锛堢嫭绔嬶級", "color": "#3ec9a7", "tag": "FIN", "flow": "finance",
"positioning": "鐙珛鐨勫彂绁ㄦ姤閿�鍗曟嵁涓庡綊妗�",
"problem": "绾歌川鍙戠エ闅惧綊闆嗐�佹姤閿�瀹℃壒鏃犵暀鐥曘�佸綊妗e悗鏃犳硶杩芥函",
- "features": ["鎶ラ攢鍗�(涓昏〃 + 1..n 鏄庣粏琛�)", "鍙戠エ闄勪欢澶氭枃浠朵笂浼�(闄勪欢涓績澶氭�佸叧鑱� storage_attachment)", "鍗曞彿 Redis 鐢熸垚 BX+yyyyMMdd+6浣嶆祦姘绰锋瘡鏃ラ噸缃�", "鏄庣粏闅忎富琛ㄤ竴娆℃�ф彁浜�(鍏堝垹鍚庡鍏ㄩ噺瑕嗙洊)", "BPM 瀹℃壒(閫氳繃20/椹冲洖35/鍙栨秷閫�鍥炶崏绋�0)", "宸查┏鍥炲彲鏀瑰彂绁ㄥ悗閲嶆柊鎻愪氦", "褰掓。缁堟�� 40 骞惰褰曞綊妗f椂闂�", "璐圭敤绫诲瀷/鎶ラ攢鐘舵�佸弻瀛楀吀 + Excel 瀵煎嚭"],
+ "features": ["鎶ラ攢鍗�(涓昏〃 + 1..n 鏄庣粏琛�)", "鍙戠エ闄勪欢澶氭枃浠朵笂浼�(闄勪欢涓績澶氭�佸叧鑱� storage_attachment)", "鍗曞彿 Redis 鐢熸垚 BX+yyyyMMdd+6浣嶆祦姘绰锋瘡鏃ラ噸缃�", "鏄庣粏闅忎富琛ㄤ竴娆℃�ф彁浜�(鍏堝垹鍚庡鍏ㄩ噺瑕嗙洊)", "BPM 瀹℃壒(閫氳繃20/椹冲洖35/鍙栨秷閫�鍥炶崏绋�0)", "宸查┏鍥炲彲鏀瑰彂绁ㄥ悗閲嶆柊鎻愪氦", "褰掓。缁堟�� 40 骞惰褰曞綊妗f椂闂�", "璐圭敤绫诲瀷/鎶ラ攢鐘舵�佸弻瀛楀吀 + Excel 瀵煎嚭", "瀵瑰鎻愪緵 FinanceReimbursementApi(yudao-module-finance-api)渚涜棰樼鐞嗙粡璐规嫧浠樿嚜鍔ㄥ缓鍗曞苟鎻愪氦(1 琛屾槑缁喡疯垂鐢ㄧ被鍨�=鍏朵粬路閲戦涓�鑷�)"],
"objects": ["鎶ラ攢鍗�", "鎶ラ攢鏄庣粏"],
"roles": ["鎶ラ攢浜�", "璐㈠姟", "瀹℃壒浜�"],
- "upstream": [], "downstream": [],
+ "upstream": ["璇鹃绠$悊(缁忚垂鎷ㄤ粯 1:1 鑷姩鐢熸垚鎶ラ攢鍗暵疯蛋 yudao-module-finance-api路鏈湴 Bean 璋冪敤)"], "downstream": [],
"coreTables": ["finance_reimbursement", "finance_reimbursement_item"]},
{"key": "pro", "name": "鐢熶骇绠$悊", "color": "#e0b34f", "tag": "MES-PRO", "flow": "production",
"positioning": "鐢熶骇鎵ц鏍稿績锛氳鍒�-宸ュ崟-浠诲姟-鎶ュ伐",
@@ -457,16 +459,16 @@
{"key": "res", "name": "璇鹃绠$悊锛堢嫭绔嬶級", "color": "#e070a8", "tag": "RES", "flow": "research",
"positioning": "瀛︿細/鍗忎細鍨嬬鐮旇棰樺叏鐢熷懡鍛ㄦ湡锛氭寚鍗楀彂甯� 鈫� 鍦ㄧ嚎鐢虫姤 鈫� 涓撳璇勫 鈫� 绔嬮」瀹℃壒 鈫� 缁忚垂鎷ㄤ粯锛堢珛椤归�氱煡璧扮郴缁熷叕鍛婏級",
"problem": "璇鹃鎸囧崡闈犵嚎涓嬪彂甯冦�佺敵鎶ヤ功闈犵焊璐ㄦ垨閭欢鏀堕泦銆佷笓瀹惰瘎鍒嗘暎钀藉湪琛ㄦ牸閲屾棤娉曡嚜鍔ㄦ眹鎬绘帓鍚嶃�佺珛椤逛笌鎷ㄦ鏃犵暀鐥�",
- "features": ["璇鹃鎸囧崡(閲嶇偣1/涓�鑸�2 鍒嗙被鏍囨敞)", "鎸囧崡鐘舵�� 0鑽夌/20宸插彂甯�/30宸叉埅姝⒙峰彂甯�/鎴涓や釜鍔ㄤ綔", "鎸囧崡缂栧彿 GL+yyyyMMdd+6浣嶆祦姘�(Redis 姣忔棩閲嶇疆)", "鍦ㄧ嚎鐢虫姤涔�(閫夋寚鍗�+閫変細鍛樺甫鍑虹敵鎶ヤ汉淇℃伅+璇鹃缁勬垚鍛�+鐢宠缁忚垂+鐢虫姤涔︽鏂�)", "鐢虫姤缂栧彿 SB+鍚屾棩娴佹按路绫诲埆鍐椾綑鑷寚鍗椾笉淇′换鍓嶇", "鐢虫姤鐘舵�� 0鑽夌/15瀹℃壒涓�/20宸茬珛椤�/35宸查┏鍥�", "鎻愪氦鍓嶆牎楠屾寚鍗楀凡鍙戝竷涓斿湪鐢虫姤鏈熷唴(閫愭潯鎶ュ叿浣撶淮搴︿笌鏃堕棿)", "涓撳璇勫鏄庣粏瀛愯〃(涓�浣嶄笓瀹朵竴琛屄峰洓椤瑰姞鏉� 0.3/0.3/0.2/0.2)", "鍚庣鑷姩閲嶇畻鍔犳潈鍚堣涓庢帓鍚嵚峰洖鍐欎富鍗曞潎鍒嗕笌鎺ㄨ崘缁撹", "BPM 涓夌骇瀹℃壒 research_topic_approve(绉樹功澶勫舰寮忓鏌モ啋涓撳璇勫鈫掑浼氱珛椤瑰鎵�)", "瀹℃壒閫氳繃鐢熸垚绔嬮」缂栧彿 LX+鍚屾棩娴佹按 涓庣珛椤规椂闂�(骞傜瓑)", "鍙戝竷绔嬮」閫氱煡(鐢熸垚 system_notice 鍏憡路鍐欏洖 noticeId 闃查噸澶�)", "缁忚垂鎷ㄤ粯璁板綍(鎵规/閲戦/鏃ユ湡/鏀舵鍗曚綅/鐘舵��/鍑瘉闄勪欢)路閲戦涓嶅緱瓒呯敵璇风粡璐�", "闄勪欢璧� system 闄勪欢涓績(recordType=research_guideline / research_application / research_fund_record)"],
+ "features": ["璇鹃鎸囧崡(閲嶇偣1/涓�鑸�2 鍒嗙被鏍囨敞)", "鎸囧崡鐘舵�� 0鑽夌/20宸插彂甯�/30宸叉埅姝⒙峰彂甯�/鎴涓や釜鍔ㄤ綔", "鎸囧崡缂栧彿 GL+yyyyMMdd+6浣嶆祦姘�(Redis 姣忔棩閲嶇疆)", "鍦ㄧ嚎鐢虫姤涔�(閫夋寚鍗�+閫変細鍛樺甫鍑虹敵鎶ヤ汉淇℃伅+璇鹃缁勬垚鍛�+鐢宠缁忚垂+鐢虫姤涔︽鏂�)", "鐢虫姤缂栧彿 SB+鍚屾棩娴佹按路绫诲埆鍐椾綑鑷寚鍗椾笉淇′换鍓嶇", "鐢虫姤鐘舵�� 0鑽夌/15瀹℃壒涓�/20宸茬珛椤�/35宸查┏鍥�", "鎻愪氦鍓嶆牎楠屾寚鍗楀凡鍙戝竷涓斿湪鐢虫姤鏈熷唴(閫愭潯鎶ュ叿浣撶淮搴︿笌鏃堕棿)", "涓撳璇勫鏄庣粏瀛愯〃(涓�浣嶄笓瀹朵竴琛屄峰洓椤瑰姞鏉� 0.3/0.3/0.2/0.2)", "鍚庣鑷姩閲嶇畻鍔犳潈鍚堣涓庢帓鍚嵚峰洖鍐欎富鍗曞潎鍒嗕笌鎺ㄨ崘缁撹", "BPM 涓夌骇瀹℃壒 research_topic_approve(绉樹功澶勫舰寮忓鏌モ啋涓撳璇勫鈫掑浼氱珛椤瑰鎵�)", "瀹℃壒閫氳繃鐢熸垚绔嬮」缂栧彿 LX+鍚屾棩娴佹按 涓庣珛椤规椂闂�(骞傜瓑)", "鍙戝竷绔嬮」閫氱煡(鐢熸垚 system_notice 鍏憡路鍐欏洖 noticeId 闃查噸澶�)", "缁忚垂鎷ㄤ粯璁板綍(鎵规/閲戦/鏃ユ湡/鏀舵鍗曚綅/澶囨敞/鍑瘉闄勪欢)路鍑瘉蹇呭~路閲戦涓嶅緱瓒呯敵璇风粡璐�", "缁忚垂鎷ㄤ粯 1:1 鑷姩鐢熸垚骞舵彁浜よ储鍔℃姤閿�鍗�(FinanceReimbursementApi路1 琛屾槑缁喡疯垂鐢ㄧ被鍨�=鍏朵粬)", "鎷ㄤ粯鐘舵�� 0寰呮嫧浠�/15鎶ラ攢瀹℃壒涓�/20宸叉嫧浠�/30宸查┏鍥灺风敱 BPM 鐩戝惉鍣ㄥ洖鍐�(鍚┏鍥炲師鍥犱笌鏃堕棿)", "宸查┏鍥炲彲鏀归噾棰�/鍑瘉鍚庨噸鏂板彂璧锋姤閿�路寰呮嫧浠樺彲鍒犲苟鑱斿姩娓呯悊璐㈠姟渚ц崏绋挎姤閿�鍗�", "闄勪欢璧� system 闄勪欢涓績(recordType=research_guideline / research_application / research_fund_record)"],
"objects": ["璇鹃鎸囧崡", "璇鹃鐢虫姤涔�", "涓撳璇勫鏄庣粏", "缁忚垂鎷ㄤ粯璁板綍"],
- "roles": ["璇鹃鐢虫姤浜�(浼氬憳)", "璇鹃绠$悊鍛�", "璇勫涓撳", "瀛︿細绉樹功澶�", "瀛︿細鐞嗕簨浼�"],
- "upstream": ["浼氬憳绠$悊(ums_member 鍙栫敵鎶ヤ汉濮撳悕/鍗曚綅/鑱岀О/鐢佃瘽)", "BPM(娴佺▼瀹氫箟 research_topic_approve)"],
- "downstream": ["system(system_notice 绔嬮」閫氱煡鍏憡)", "system(闄勪欢涓績)", "璐㈠姟(浜屾湡棰勬湡寰呭鎺ヂ蜂竴鏈熶笉鎺�)"],
+ "roles": ["璇鹃鐢虫姤浜�(浼氬憳)", "璇鹃绠$悊鍛�", "璇勫涓撳", "瀛︿細绉樹功澶�", "瀛︿細鐞嗕簨浼�", "瀛︿細璐㈠姟"],
+ "upstream": ["浼氬憳绠$悊(ums_member 鍙栫敵鎶ヤ汉濮撳悕/鍗曚綅/鑱岀О/鐢佃瘽)", "BPM(娴佺▼瀹氫箟 research_topic_approve / finance_reimbursement_approve)"],
+ "downstream": ["system(system_notice 绔嬮」閫氱煡鍏憡)", "system(闄勪欢涓績)", "璐㈠姟(缁忚垂鎷ㄤ粯鐢熸垚 finance_reimbursement 鎶ラ攢鍗暵峰凡瀵规帴)"],
"coreTables": ["research_guideline", "research_application", "research_topic_review", "research_fund_record"]},
{"key": "bpm", "name": "鍗忓悓瀹℃壒", "color": "#e6a23c", "tag": "BPM", "flow": null,
"positioning": "鍏ㄧ郴缁熷崟鎹鎵逛腑鏋紙Flowable锛�",
"problem": "澶氭ā鍧楀崟鎹渶瑕佺伒娲诲彲閰嶇殑澶氱骇瀹℃壒",
- "features": ["BPMN+閽夐拤椋庢牸鍙岃璁″櫒", "娴佺▼瀹氫箟閮ㄧ讲", "瀹℃壒浜嬩欢缁熶竴鍥炶皟(BpmProcessInstanceStatusEvent)", "14涓笟鍔$洃鍚櫒", "琛ㄥ崟路鐢ㄦ埛缁劼锋妱閫伮峰姞绛�"],
+ "features": ["BPMN+閽夐拤椋庢牸鍙岃璁″櫒", "娴佺▼瀹氫箟閮ㄧ讲", "瀹℃壒浜嬩欢缁熶竴鍥炶皟(BpmProcessInstanceStatusEvent)", "15涓笟鍔$洃鍚櫒(鍚屼竴娴佺▼ key 鍏佽澶氫釜鐩戝惉鍣ㄥ苟琛屄峰悇鑷寜 key 杩囨护)", "琛ㄥ崟路鐢ㄦ埛缁劼锋妱閫伮峰姞绛�"],
"objects": ["娴佺▼妯″瀷", "娴佺▼瀹炰緥", "瀹℃壒浠诲姟"],
"roles": ["瀹℃壒浜�(鎸夋祦绋嬮厤缃�)", "娴佺▼绠$悊鍛�"],
"upstream": ["鍚勪笟鍔℃彁浜ゅ鎵�"], "downstream": ["鍥炶皟鏇存柊鍚勪笟鍔″崟鎹姸鎬�"],
@@ -536,14 +538,14 @@
{"name": "鎺掔彮璁″垝", "module": "璁惧", "table": "mes_cal_plan", "doc": "鐝粍脳鐝脳鏃ユ湡鎺掔彮锛屼緵鐢熶骇涓庤�冨嫟寮曠敤", "upstream": [], "downstream": ["鐢熶骇浠诲姟", "鑰冨嫟"], "keywords": "鎺掔彮 鐝粍 鐝 鏃ュ巻"},
{"name": "鎶ュ憡妯℃澘", "module": "璐ㄦ鎶ュ憡", "table": "qc_report_template", "doc": "鏅鸿兘璐ㄦ鎶ュ憡妯℃澘锛屽惎鐢�0/鍋滅敤1锛涚敾甯冨唴瀹瑰瓨鍦� qc_report_template_version锛堣崏绋�0/宸插彂甯�1/宸插仠鐢�2锛屽凡鍙戝竷涓嶅彲瑕嗙洊锛夛紝currentVersion 鎸囧悜褰撳墠宸插彂甯冪増鏈紱婧愭枃浠剁粡 AI 瀵煎叆璇嗗埆鎴愯崏绋垮悗鐢变汉宸ョ‘璁ゆ墠鎴愪负鐗堟湰锛涘悓涓�妯℃澘閲嶅瀵煎叆鎸夈�愭浛鎹€�戝鐞嗏�斺�斿厛鍒犳棫闄勪欢锛堣繛甯� blob 琛屼笌纾佺洏鏂囦欢锛夊啀缁戞柊鐨勶紝涓嶇暀瀛ゅ効鏂囦欢锛涘垹闄ゆā鏉夸細杩炲甫娓呴檮浠�", "upstream": ["浜哄伐璁捐(GrapesJS 璁捐鍣�)", "AI 瀵煎叆鑽夌(qc-report/ai-import/draft)"], "downstream": ["妯℃澘鐗堟湰", "鎶ュ憡瀹炰緥"], "keywords": "鎶ュ憡妯℃澘 璐ㄦ鎶ュ憡 template 璁捐鍣� 鐗堟湰 AI瀵煎叆 璇嗗埆 鑽夌 婧愭枃浠舵浛鎹�"},
{"name": "鎶ュ憡瀹炰緥", "module": "璐ㄦ鎶ュ憡", "table": "qc_report_instance", "doc": "鍑轰欢浜х墿锛岀紪鍙� QR+yyyyMMdd+4浣嶆祦姘存寜澶╃嫭绔嬩笖涓氬姟鍞竴锛屽彲鏄惧紡鎸囧畾瑕嗙洊锛堟敞鎰� uk_report_no 涓嶅尯鍒嗚蒋鍒犻櫎锛屽垹鎺夌殑鍙蜂笉鍥炴敹锛夛紱涓ゆ潯鍑轰欢鍏ュ彛锛氶�氱敤 generate锛堣皟鐢ㄦ柟鑷甫 context锛変笌 generate-from-qc锛堟暟鎹粠 MES 璐ㄦ鍗曞彇锛屾潈闄愮爜 qc-report:instance:generate 宸插叆 system_menu id=1075416锛屼簲閬撴牎楠屾寜涓氬姟浼樺厛绾у彧鎶ョ涓�澶勶細105_000 绫诲瀷闈炴硶 / 105_001 鍗曟嵁涓嶅瓨鍦� / 105_002 鏈畬鎴� / 105_003 鏈垽瀹� / 105_005 妯℃澘绫诲瀷涓嶇 / 105_006 鏃犲彲鐢ㄦ楠岄」锛涘洓寮犺川妫�鍗曞垪琛ㄧ殑琛屾搷浣溿�屽嚭鎶ュ憡銆嶄粎鍦� status=宸插畬鎴愭椂鍙锛屽脊绐楀彧鍒� reportType 涓�鑷淬�佹ā鏉垮惎鐢ㄣ�佷笖 currentVersion 鎸囧悜鐨勭増鏈凡鍙戝竷鐨勬ā鏉匡紙鍚庣 /qc-report/template/selectable 鍒ゅ畾鈥斺�斿仠鐢ㄧ増鏈笉娓呯┖ currentVersion锛屽墠绔嬁鍒嗛〉缁撴灉鑷繁鎺ㄥ浼氭紡锛夛紝缁撴灉灏卞湴灞曠ず骞惰烦鏈〉鍒楄〃锛夛紱鍐荤粨 data_snapshot锛堝垽瀹氬悗鏁版嵁锛屽惈鍚庣绠楀ソ鐨� PASS/FAIL 涓庡悎鏍肩巼锛変笌 render_html锛況egenerate 鍙噸娓叉帓鐗堛�佹暟鎹笌缂栧彿涓嶅彉锛沚usiness_id/business_type 瀛� MES 琛ㄥ悕锛坢es_qc_iqc 绛夛級涓庡崟鎹� ID锛屽彲鍙嶆煡銆佷竴鍗曞彲鍑哄浠斤紱鎶ュ憡澶村彟甯﹀崟鎹師鍒ゅ畾 qcResult(鏁�)/qcResultText(涓枃锛屽悎鏍�/鐗归噰/涓嶅悎鏍奸��璐�/涓嶅悎鏍兼姤搴�)锛屼笌寮曟搸涓夋�佸垽瀹氬苟瀛樹簰涓嶈鐩栵紱鍝嶅簲甯� undecidableCount=蹇収涓� result 涓虹┖涓茬殑椤规暟涓� warnings锛堝垎缁勬爣棰樿烦杩�/鎸囨爣宸插垹/鏈綍瀹炴祴鍊�/鏍峰搧瓒�3锛夛紝涓よ�呴兘涓嶈惤搴撱�佷簨鍚庣湅涓嶅埌", "upstream": ["鎶ュ憡妯℃澘鐗堟湰", "璐ㄦ鍗曚笂涓嬫枃(閫氱敤 generate 鐢辫皟鐢ㄦ柟浼犲叆)", "MES 璐ㄦ鍗� IQC/IPQC/OQC/RQC(generate-from-qc 缁� MesQcReportApi 鍙栨暟)"], "downstream": ["鍓嶇瀹炰緥椤� /qc/report-instance(鍒楄〃路iframe棰勮路蹇収椤电路瀵煎嚭PDF)", "PDF褰掓。(system_storage_attachment recordType=qc_report_instance)"], "keywords": "鎶ュ憡瀹炰緥 鍑轰欢 QR缂栧彿 蹇収 澶嶇幇 regenerate PDF褰掓。 鎶ュ憡瀹炰緥椤� 瀵煎嚭PDF generate-from-qc 璐ㄦ鍗曞嚭鎶ュ憡 鍑烘姤鍛婂脊绐� qcResult undecidableCount warnings 寰呭垽瀹� 鍙嶆煡 涓氬姟鍗曟嵁绛涢��"},
- {"name": "鎶ラ攢鍗�", "module": "璐㈠姟鎶ラ攢", "table": "finance_reimbursement", "doc": "鍗曞彿鍙嚜瀹氫箟(涓棿涓嶅厑璁哥┖鏍硷紝涓庡凡鏈夊崟鍙烽噸澶嶅垯鎶ラ敊)锛涙柊澧炴椂鐣欑┖鎴栫函绌烘牸鐢辩郴缁熺敓鎴� BX+yyyyMMdd+6浣嶆祦姘�(Redis 姣忔棩閲嶇疆)锛屼慨鏀规椂鐣欑┖琛ㄧず淇濇寔涓嶅彉銆俿tatus: 0鑽夌/15瀹℃壒涓�/20宸查�氳繃/35宸查┏鍥�/40宸插綊妗o紱浠呰崏绋垮彲鍒犮�佽崏绋夸笌宸查┏鍥炲彲鏀广�佷粎宸查�氳繃鍙綊妗o紱鎻愪氦鍚庣敱 BPM 鐩戝惉鍣ㄦ寜缁撴灉鍥炲啓鐘舵��(鍙栨秷閫�鍥炶崏绋�)锛屽鎵逛腑 processInstanceId 琚洖鍐欙紱鐙珛妯″潡锛屼笉涓庡叾瀹冧笟鍔℃ā鍧椾骇鐢熷崟鎹叧鑱�", "upstream": [], "downstream": ["鎶ラ攢鏄庣粏", "鍙戠エ闄勪欢(storage_attachment路recordType=finance_reimbursement)"], "keywords": "鎶ラ攢鍗� 鎶ラ攢 鍙戠エ reimbursement BX 褰掓。 璐㈠姟 璐圭敤 鑷畾涔夊崟鍙�"},
+ {"name": "鎶ラ攢鍗�", "module": "璐㈠姟鎶ラ攢", "table": "finance_reimbursement", "doc": "鍗曞彿鍙嚜瀹氫箟(涓棿涓嶅厑璁哥┖鏍硷紝涓庡凡鏈夊崟鍙烽噸澶嶅垯鎶ラ敊)锛涙柊澧炴椂鐣欑┖鎴栫函绌烘牸鐢辩郴缁熺敓鎴� BX+yyyyMMdd+6浣嶆祦姘�(Redis 姣忔棩閲嶇疆)锛屼慨鏀规椂鐣欑┖琛ㄧず淇濇寔涓嶅彉銆俿tatus: 0鑽夌/15瀹℃壒涓�/20宸查�氳繃/35宸查┏鍥�/40宸插綊妗o紱浠呰崏绋垮彲鍒犮�佽崏绋夸笌宸查┏鍥炲彲鏀广�佷粎宸查�氳繃鍙綊妗o紱鎻愪氦鍚庣敱 BPM 鐩戝惉鍣ㄦ寜缁撴灉鍥炲啓鐘舵��(鍙栨秷閫�鍥炶崏绋�)锛屽鎵逛腑 processInstanceId 琚洖鍐欍�傛潵婧愪袱鏉★細鈶� 璐㈠姟妯″潡椤甸潰浜哄伐濉姤 鈶¤棰樼鐞嗐�岀粡璐规嫧浠樸�嶇粡 FinanceReimbursementApi(yudao-module-finance-api)鑷姩寤哄崟骞剁珛鍗虫彁浜�(1:1銆侀噾棰濅竴鑷淬�佺郴缁熷浐瀹� 1 琛屾槑缁喡疯垂鐢ㄧ被鍨�=鍏朵粬)鈥斺�斿悗鑰呯殑瀹℃壒缁撴灉鐢辫棰樹晶 ResearchFundStatusListener 璁㈤槄鍚屼竴娴佺▼鍥炲啓鎷ㄦ鍙拌处锛屾姤閿�鍗曟湰韬笉鍥炲啓浠讳綍澶栭儴鍗曟嵁", "upstream": ["璇鹃绠$悊(缁忚垂鎷ㄤ粯路缁� FinanceReimbursementApi 鑷姩寤哄崟)", "浜哄伐濉姤"], "downstream": ["鎶ラ攢鏄庣粏", "鍙戠エ闄勪欢(storage_attachment路recordType=finance_reimbursement)", "璇鹃鎷ㄦ鍙拌处(浠呯粡 BPM 浜嬩欢鍥炲啓鐘舵��)"], "keywords": "鎶ラ攢鍗� 鎶ラ攢 鍙戠エ reimbursement BX 褰掓。 璐㈠姟 璐圭敤 鑷畾涔夊崟鍙� 璇鹃缁忚垂鎷ㄤ粯 鑷姩寤哄崟 FinanceReimbursementApi"},
{"name": "鎶ラ攢鏄庣粏", "module": "璐㈠姟鎶ラ攢", "table": "finance_reimbursement_item", "doc": "鎶ラ攢鍗曠殑璐圭敤琛岋細璐圭敤绫诲瀷(1宸梾/2鍔炲叕/3鎷涘緟/4浜ら��/5鍏朵粬)銆佸彂绁ㄥ彿鐮併�佸彂绁ㄩ噾棰濄�佸彂绁ㄦ棩鏈熴�佸紑绁ㄦ柟銆佽垂鐢ㄨ鏄庯紱闅忎富琛ㄤ竴娆℃�ф彁浜�(鍏堝垹鍚庡鍏ㄩ噺瑕嗙洊)锛屾彁浜ゆ椂蹇呴』鍓ユ帀琛� id 涓� reimbursementId 鈥斺�� 鏄庣粏鍒犻櫎鏄蒋鍒狅紝鍥炰紶鍘� id 浼氫笌宸茶蒋鍒犺涓婚敭鍐茬獊", "upstream": ["鎶ラ攢鍗�"], "downstream": [], "keywords": "鎶ラ攢鏄庣粏 璐圭敤鏄庣粏 璐圭敤绫诲瀷 鍙戠エ閲戦 item 鏄庣粏琛� 宸梾"},
{"name": "鍏ヤ細鐢宠鍗�", "module": "浼氬憳绠$悊", "table": "ums_application", "doc": "鍗曞彿 SQ+yyyyMMdd+6浣嶆祦姘�(Redis 姣忔棩閲嶇疆)锛屽悗绔敓鎴愪笉鍙嚜瀹氫箟锛沵emberType 1涓汉/2鍗曚綅鍐冲畾瀛楁鍒嗗弶(涓汉鐢� workUnit/title锛屽崟浣嶇敤 legalPerson/organizationCode)锛沵emberGrade 鎸夌被鍨嬪彇涓嶅悓瀛楀吀锛泂tatus: 0鑽夌/15瀹℃壒涓�/20宸查�氳繃/35宸查┏鍥炪�備粎鑽夌鍙垹(杩炲甫娓呴檮浠�)銆佽崏绋夸笌宸查┏鍥炲彲鏀瑰彲閲嶆彁锛涙彁浜ゅ悗鐢� BPM 鐩戝惉鍣ㄦ寜缁撴灉鍥炲啓(鍙栨秷閫�鍥炶崏绋�)锛屽鎵逛腑鍥炲啓 processInstanceId锛涘鎵归�氳繃瑙﹀彂鑷姩寤轰細鍛樹笌绯荤粺璐﹀彿銆傜嫭绔嬫ā鍧楋紝涓嶄笌鍏跺畠涓氬姟妯″潡浜х敓鍗曟嵁鍏宠仈", "upstream": ["浜哄伐濉姤(鐢宠浜�)", "璇佹槑鏉愭枡闄勪欢(storage_attachment路recordType=ums_application)"], "downstream": ["浼氬憳(瀹℃壒閫氳繃鑷姩鍒涘缓)", "BPM 娴佺▼瀹炰緥(ums_membership_approve 鍒嗙被)"], "keywords": "鍏ヤ細鐢宠 鍏ヤ細 浼氬憳鐢宠 application SQ 绉樹功澶� 鐞嗕簨浼� 瀹℃壒 浼氬憳绫诲瀷 涓汉 鍗曚綅 娉曞畾浠h〃浜� 鐮旂┒鏂瑰悜 鐢宠绛夌骇"},
{"name": "浼氬憳", "module": "浼氬憳绠$悊", "table": "ums_member", "doc": "鍗曞彿 HY+yyyyMMdd+6浣嶆祦姘�(Redis 姣忔棩閲嶇疆)锛涗袱涓潵婧愶細鈶犲叆浼氱敵璇峰鎵归�氳繃鑷姩鍒涘缓(鍥炲~ applicationId 涓� userName/绯荤粺璐﹀彿) 鈶′細鍛樺垪琛ㄦ墜宸ユ柊澧炪�俿tatus: 1姝e父/0鏆傚仠锛沵emberGrade 鎸� memberType 鍙栧搴斿瓧鍏革紝鏍¢獙瑙勫垯鏄崟浣嶄細鍛�(type=2)涓嶅彲閫夈�庣悊浜嬮暱銆�(grade=5)銆傝嚜鍔ㄥ缓妗f椂鍏ヤ細鏃ユ湡=褰撳ぉ銆佷笉鎼繍 contactUser/unitIntro/expireDate(鐢宠鍗曟棤瀵瑰簲瀛楁)锛涜嚜鍔ㄥ缓鐨勭郴缁熻处鍙风敤鎴峰悕涓鸿仈绯荤數璇濅笖鍒濆瀵嗙爜鍚屼负鑱旂郴鐢佃瘽锛岄儴闂ㄥ浐瀹氫负銆屽浼氫細鍛樸�嶏紱鎵嬫満鍙烽噸澶嶄細鏄庣‘鎶ラ敊涓旀暣鍗曚簨鍔″洖婊�", "upstream": ["鍏ヤ細鐢宠鍗�(瀹℃壒閫氳繃)", "浜哄伐鏂板", "闄勪欢(storage_attachment路recordType=ums_member)"], "downstream": ["浼氬憳閫氳褰�(鎸� regionCode/industry 妫�绱�)", "system_users(鐧诲綍璐﹀彿)"], "keywords": "浼氬憳 member HY 浼氬憳缂栧彿 浼氬憳绛夌骇 浼氬憳绫诲瀷 閫氳褰� 鍦板尯 琛屼笟 鍏ヤ細鏃ユ湡 鏈夋晥鏈�"},
{"name": "璇鹃鎸囧崡", "module": "璇鹃绠$悊", "table": "research_guideline", "doc": "鎸囧崡缂栧彿 GL+yyyyMMdd+6浣嶆祦姘�(Redis 姣忔棩閲嶇疆)锛沜ategory 1閲嶇偣璇鹃/2涓�鑸棰橈紱publishStatus 0鑽夌/20宸插彂甯�/30宸叉埅姝紝浠呰崏绋垮彲鏀瑰彲鍒狅紝publish 鍙戝竷鍥炲啓 publishTime锛宑lose 鎴缃� 30锛涘凡浜х敓鐢虫姤鍗�(applicationMapper.selectCountByGuidelineId 澶т簬 0)鐨勬寚鍗楃姝㈠垹闄ゅ苟鍦ㄦ彁绀轰腑鎶ュ嚭璇ユ寚鍗椾笅宸叉湁澶氬皯寮犵敵鎶ュ崟锛涙鏂� content 涓洪暱鏂囨湰锛涢檮浠� recordType=research_guideline", "upstream": ["浜哄伐缁存姢(瀛︿細绉樹功澶�)", "鎸囧崡闄勪欢(storage_attachment路recordType=research_guideline)"], "downstream": ["璇鹃鐢虫姤涔�(鐢虫姤鏃跺紩鐢ㄤ笖蹇呴』宸插彂甯冨苟鍦ㄧ敵鎶ユ湡鍐�)"], "keywords": "璇鹃鎸囧崡 鎸囧崡 鍙戝竷 鎴 閲嶇偣璇鹃 涓�鑸棰� GL 鎸囧崡缂栧彿 鐢虫姤鏈� 鐢虫姤璧锋"},
{"name": "璇鹃鐢虫姤涔�", "module": "璇鹃绠$悊", "table": "research_application", "doc": "鐢虫姤缂栧彿 SB+yyyyMMdd+6浣嶆祦姘�(Redis 姣忔棩閲嶇疆)锛沢uidelineId 鍏宠仈鎸囧崡銆乵emberId 鍏宠仈 ums_member(杞叧鑱旀棤澶栭敭锛屼細鍛樺垹闄ゅ悗浼氱暀涓嬫偓绌� memberId 闇�瀹归敊鏄剧ず)锛沘pplicantName/workUnit/jobTitle/contactPhone/contactEmail 鐢遍�変細鍛樿嚜鍔ㄥ甫鍑哄彲鎵嬫敼锛沜ategory 鍐椾綑鑷寚鍗椾笖涓嶄俊浠诲墠绔紶鍊硷紱budgetAmount 鐢宠缁忚垂涓烘嫧浠樹笂闄愶紱status: 0鑽夌/15瀹℃壒涓�/20宸茬珛椤�/35宸查┏鍥炪�備粎鑽夌鍙垹(杩炲甫娓呴檮浠�)銆佽崏绋夸笌宸查┏鍥炲彲鏀瑰彲閲嶆彁锛泂ubmit 鍓嶉�愭潯鏍¢獙銆屾寚鍗楀凡鍙戝竷銆嶄笌銆岀幇鍦ㄥ湪鐢虫姤鏈熷唴銆嶏紝浠讳竴涓嶆弧瓒冲嵆鎷掔粷骞舵寜缁村害缁欏嚭鎸囧崡鍚嶄笌瀹為檯鍊硷紱瀹℃壒閫氳繃鐢辩洃鍚櫒鐢熸垚绔嬮」缂栧彿 researchNo(LX+鍚屾棩娴佹按)涓� approveTime(宸叉湁缂栧彿骞傜瓑璺宠繃)锛況eviewAvgScore/reviewPass 涓鸿瘎瀹℃眹鎬诲洖鍐欏�硷紝鏄庣粏鍒犵┖鏃舵竻鎴愭湭姹囨�伙紱noticeId 璁板綍宸插彂甯冪殑绔嬮」閫氱煡鍏憡锛岄噸澶嶅彂甯冭鎷︽埅", "upstream": ["璇鹃鎸囧崡(蹇呴』宸插彂甯冧笖鍦ㄧ敵鎶ユ湡鍐�)", "浼氬憳(ums_member路甯﹀嚭鐢虫姤浜轰俊鎭�)", "鐢虫姤闄勪欢(storage_attachment路recordType=research_application)"], "downstream": ["涓撳璇勫鏄庣粏", "缁忚垂鎷ㄤ粯璁板綍", "绔嬮」閫氱煡(system_notice 鍏憡)", "BPM 娴佺▼瀹炰緥(research_topic_approve 鍒嗙被)", "闄勪欢涓績"], "keywords": "璇鹃鐢虫姤 鐢虫姤涔� 鐢虫姤鍗� SB 鐢虫姤缂栧彿 绔嬮」 绔嬮」缂栧彿 LX 鐢宠缁忚垂 鐢虫姤涔︽鏂� 璇鹃缁勬垚鍛� 涓撳璇勫 璇勫姹囨�� 绔嬮」閫氱煡 鍙戝竷閫氱煡 鎻愪氦瀹℃壒 椹冲洖 閲嶆彁"},
{"name": "涓撳璇勫鏄庣粏", "module": "璇鹃绠$悊", "table": "research_topic_review", "doc": "涓�浣嶄笓瀹朵竴琛岀殑涓�涓诲琛屽瓙琛細evaluatorName/evaluatorUnit/evaluatorTitle + topicScore 閫夐浠峰�间笌鎰忎箟(鏉冮噸0.3) + planScore 鐮旂┒鏂规鍙鎬�(0.3) + teamScore 鍥㈤槦涓庣爺绌跺熀纭�(0.2) + resultScore 棰勬湡鎴愭灉涓庢晥鐩�(0.2) + conclusion 1鎺ㄨ崘绔嬮」/2涓嶆帹鑽愮珛椤� + opinion 璇勫鎰忚 + reviewTime銆俢ompositeScore 鐢卞悗绔� weightedScore 璁$畻銆乺anking 鐢卞悗绔寜鍔犳潈鍒嗛檷搴忛噸鎺掞紝鍧囦笉鎺ュ彈鍓嶇浼犲�硷紱姣忔澧炲垹鏀瑰悗璋� recalculate 鍥炲啓涓诲崟 reviewAvgScore(鍏ㄩ儴涓撳鍔犳潈鍒嗗潎鍊悸蜂繚鐣�2浣�)涓� reviewPass(鍧囧垎杈炬爣 涓� 澶氭暟缁撹涓烘帹鑽愮珛椤规椂涓� 1)锛涘洓椤瑰垎鍊艰秴鍑� 0~100 鏃舵彁绀烘寚鍑哄叿浣撶淮搴︿笌瀹為檯鍊硷紱浠呭湪鐢虫姤鍗� status=15 瀹℃壒涓彲澧炲垹鏀�", "upstream": ["璇鹃鐢虫姤涔�(浠呭鎵逛腑鍙啓)"], "downstream": ["璇鹃鐢虫姤涔�(鍥炲啓 reviewAvgScore/reviewPass)"], "keywords": "涓撳璇勫 璇勫鏄庣粏 璇勫垎 鍔犳潈 鏉冮噸 鎺掑悕 ranking compositeScore 鎺ㄨ崘绔嬮」 璇勫鎰忚 鍧囧垎"},
- {"name": "缁忚垂鎷ㄤ粯璁板綍", "module": "璇鹃绠$悊", "table": "research_fund_record", "doc": "涓�涓诲琛岀殑鎷ㄦ璁板綍锛歜atchName 鎵规鍚嶇О/amount 鎷ㄤ粯閲戦/payDate 鎷ㄤ粯鏃ユ湡/payee 鏀舵鍗曚綅/status 0寰呮嫧浠� 20宸叉嫧浠�/remark锛屽嚟璇侀檮浠惰蛋 system 闄勪欢涓績 recordType=research_fund_record(琛ㄥ唴涓嶅瓨鏂囦欢鍦板潃)銆備粎鐢虫姤鍗� status=20 宸茬珛椤瑰彲鐧昏锛涢噾棰濇牎楠岋細宸茬櫥璁伴噾棰�(璇ュ崟鍏ㄩ儴璁板綍姹傚拰) + 鏈閲戦 涓嶅緱瓒呭嚭鐢虫姤鍗� budgetAmount锛岃秴鍑烘椂鎻愮ず鎶ュ嚭鏈銆佸凡鐧昏銆佸悎璁°�侀绠楀洓椤规暟鍊硷紱status=20 宸叉嫧浠� 鏃跺嚟璇侀檮浠跺繀濉�(鍓嶇鍏堣鎷︽埅锛屽悗绔� validateVoucherRequired 鍏滃簳)锛涗粎寰呮嫧浠樼姸鎬佸彲鏀瑰彲鍒狅紝缂栬緫鏃舵妸鏈閲戦鍔犲洖鍙敤浣欓灞曠ず閬垮厤璇В", "upstream": ["璇鹃鐢虫姤涔�(蹇呴』宸茬珛椤�)"], "downstream": ["鎷ㄤ粯鍑瘉(storage_attachment路recordType=research_fund_record)", "璐㈠姟(浜屾湡棰勬湡寰呭鎺ヂ蜂竴鏈熶笉鎺�)"], "keywords": "缁忚垂鎷ㄤ粯 鎷ㄦ 鎷ㄤ粯璁板綍 鎵规 鎷ㄤ粯閲戦 鍑瘉 寰呮嫧浠� 宸叉嫧浠� 鏀舵鍗曚綅 璧勫姪閲戦 棰勭畻 瓒呴"}
+ {"name": "缁忚垂鎷ㄤ粯璁板綍", "module": "璇鹃绠$悊", "table": "research_fund_record", "doc": "涓�涓诲琛岀殑鎷ㄦ鍙拌处锛歜atchName 鎵规鍚嶇О/amount 鎷ㄤ粯閲戦/payDate 鎷ㄤ粯鏃ユ湡/payee 鏀舵鍗曚綅/remark锛屽嚟璇侀檮浠惰蛋 system 闄勪欢涓績 recordType=research_fund_record(琛ㄥ唴涓嶅瓨鏂囦欢鍦板潃)銆俿tatus: 0寰呮嫧浠�/15鎶ラ攢瀹℃壒涓�/20宸叉嫧浠�/30宸查┏鍥烇紝鐢辩郴缁熶笌 BPM 椹卞姩锛屾柊澧�/淇敼鎺ュ彛宸茬Щ闄� status 鍏ュ弬(闃蹭吉閫犮�屽凡鎷ㄤ粯銆�)銆傜櫥璁板嵆涓�鏉¢緳锛氳惤鍙拌处 鈫� 鍚屼竴鎵� blob 鍙岀粦 鈫� 缁� FinanceReimbursementApi 鑷姩鐢熸垚 1:1 鐨� finance_reimbursement 骞剁珛鍗虫彁浜� BPM 鈫� 鍥炲啓 reimbursement_id/reimbursement_no 骞剁疆 15锛涘鎵圭粨鏋滅敱鐩戝惉鍣ㄥ洖鍐欙細閫氳繃鈫�20銆侀┏鍥炩啋30(+reject_reason/reject_time)銆佹挙鍥炴垨鍙栨秷鈫掗��鍥� 0銆備粎鐢虫姤鍗� status=20 宸茬珛椤瑰彲鐧昏锛涘嚟璇佸繀濉紱閲戦鏍¢獙锛氬凡鐧昏閲戦(璇ュ崟鍏ㄩ儴璁板綍姹傚拰) + 鏈閲戦 涓嶅緱瓒呭嚭鐢虫姤鍗� budgetAmount锛岃秴鍑烘椂鎻愮ず鎶ュ嚭鏈銆佸凡鐧昏銆佸悎璁°�侀绠楀洓椤规暟鍊硷紱浠呫�屽緟鎷ㄤ粯銆嶅彲鍒�(鑱斿姩鍒犻櫎璐㈠姟渚ц崏绋挎姤閿�鍗曪紝闈炶崏绋垮垯鎷掔粷)锛屻�屽緟鎷ㄤ粯銆嶃�屽凡椹冲洖銆嶅彲鏀瑰苟閲嶆柊鍙戣捣鎶ラ攢(宸查┏鍥炴敼鍚庢竻绌� reject_reason/reject_time)锛岀紪杈戞椂鎶婃湰琛岄噾棰濆姞鍥炲彲鐢ㄤ綑棰濆睍绀洪伩鍏嶈瑙c�備笌鎶ラ攢鍗曚负杞叧鑱�(鏃犲閿�)锛岃储鍔′晶鐩存帴鍒犲崟浼氱暀涓嬫偓绌� reimbursement_id锛屾鏃朵慨鏀规姤銆屾姤閿�鍗曞凡涓嶅瓨鍦紝璇峰垹闄ゆ湰鏉¤褰曞悗閲嶆柊鐧昏銆�", "upstream": ["璇鹃鐢虫姤涔�(蹇呴』宸茬珛椤�)", "璐㈠姟鎶ラ攢鍗�(1:1 鑷姩鐢熸垚路杞叧鑱� reimbursement_id)"], "downstream": ["鎷ㄤ粯鍑瘉(storage_attachment路recordType=research_fund_record)", "璐㈠姟鎶ラ攢鍗�(鐢熸垚骞舵彁浜ゅ嚭璐β峰鎵圭粨鏋滃洖鍐欐湰鍙拌处)"], "keywords": "缁忚垂鎷ㄤ粯 鎷ㄦ 鎷ㄤ粯璁板綍 鎵规 鎷ㄤ粯閲戦 鍑瘉 寰呮嫧浠� 鎶ラ攢瀹℃壒涓� 宸叉嫧浠� 宸查┏鍥� 椹冲洖鍘熷洜 璐㈠姟鎶ラ攢鍗曞彿 reimbursement_id 鏀舵鍗曚綅 璧勫姪閲戦 棰勭畻 瓒呴 閲嶆柊鍙戣捣鎶ラ攢"}
]
}</script>
<script type="application/json" id="data-flows">{
@@ -622,7 +624,7 @@
{"stage": "寤烘。", "action": "瀹℃壒閫氳繃閽╁瓙鑷姩寤轰細鍛橈細鈶犵敓鎴愪細鍛樼紪鍙� HY+yyyyMMdd+6浣嶆祦姘� 鈶dminUserApi.createUser 寤虹郴缁熻处鍙凤紙鐢ㄦ埛鍚嶄笌鍒濆瀵嗙爜=鑱旂郴鐢佃瘽銆佹樀绉�=鐢宠浜哄鍚嶃�侀儴闂�=瀛︿細浼氬憳锛夆憿浼氬憳钀藉簱锛堝叆浼氭棩鏈�=褰撳ぉ銆佺姸鎬� 1 姝e父銆乤pplicationId 鍥炲~鏉ユ簮鐢宠鍗曪級锛涙墜鏈哄彿閲嶅浼氭槑纭姤閿�", "roles": ["绯荤粺鑷姩"]},
{"stage": "绠$悊涓庢绱�", "action": "浼氬憳鍒楄〃鏀寔鎵嬪伐鏂板/缂栬緫/鍒犻櫎锛堢瓑绾т笌绫诲瀷鏍¢獙锛氬崟浣嶄細鍛樹笉鍙�夈�庣悊浜嬮暱銆忥級锛涗細鍛橀�氳褰曚负鍙椤碉紝鎸夊湴鍖虹紪鐮佷笌琛屼笟妫�绱�", "roles": ["浼氬憳绠$悊鍛�", "鍏ㄤ綋鍙煡閫氳褰�"]}]},
{"id": "research", "name": "璇鹃绠$悊娴佺▼", "mermaid": "mermaid/14-research-flow.mmd", "color": "#e070a8",
- "summary": "鐙珛绉戠爺妯″潡锛坹udao-module-research锛夛細瀛︿細鍙戝竷璇鹃鎸囧崡锛堥噸鐐�/涓�鑸垎绫伙級鈫� 浼氬憳鍦ㄧ嚎鎻愪氦璇鹃鐢虫姤涔� 鈫� 鎻愪氦 BPM 涓夌骇瀹℃壒锛堢涔﹀褰㈠紡瀹℃煡 鈫� 涓撳璇勫 鈫� 瀛︿細绔嬮」瀹℃壒锛夛紝涓撳璇勫垎浠ョ粨鏋勫寲鏄庣粏瀛愯〃璁板綍骞剁敱鍚庣鑷姩姹囨�诲姞鏉冨潎鍒嗐�佹帓鍚嶄笌鎺ㄨ崘缁撹 鈫� 瀹℃壒閫氳繃鐢熸垚绔嬮」缂栧彿骞跺彂甯冪郴缁熷叕鍛� 鈫� 鎸夋壒娆$櫥璁扮粡璐规嫧浠樿褰曪紙鍚嚟璇侀檮浠讹級銆傞櫌绾т簩鏈熷啀琛ョ粨椤归獙鏀朵笌鎴愭灉褰掓。銆�",
+ "summary": "鐙珛绉戠爺妯″潡锛坹udao-module-research锛夛細瀛︿細鍙戝竷璇鹃鎸囧崡锛堥噸鐐�/涓�鑸垎绫伙級鈫� 浼氬憳鍦ㄧ嚎鎻愪氦璇鹃鐢虫姤涔� 鈫� 鎻愪氦 BPM 涓夌骇瀹℃壒锛堢涔﹀褰㈠紡瀹℃煡 鈫� 涓撳璇勫 鈫� 瀛︿細绔嬮」瀹℃壒锛夛紝涓撳璇勫垎浠ョ粨鏋勫寲鏄庣粏瀛愯〃璁板綍骞剁敱鍚庣鑷姩姹囨�诲姞鏉冨潎鍒嗐�佹帓鍚嶄笌鎺ㄨ崘缁撹 鈫� 瀹℃壒閫氳繃鐢熸垚绔嬮」缂栧彿骞跺彂甯冪郴缁熷叕鍛� 鈫� 鎸夋壒娆$櫥璁扮粡璐规嫧浠橈紙鍑瘉蹇呭~锛夛紝姣忔潯鎷ㄦ璁板綍鑷姩鐢熸垚骞舵彁浜や竴寮� 1:1 鐨勮储鍔℃姤閿�鍗曪紙finance_reimbursement锛夛紝璧� BPM 涓ょ骇瀹℃壒鍚庣敱鐩戝惉鍣ㄦ妸缁撴灉鍥炲啓鍙拌处銆傞櫌绾т簩鏈熷啀琛ョ粨椤归獙鏀朵笌鎴愭灉褰掓。銆�",
"steps": [
{"stage": "鍙戝竷鎸囧崡", "action": "鏂板缓鎸囧崡閫夌被鍒� 1閲嶇偣璇鹃 / 2涓�鑸棰橈紝濉敵鎶ヨ捣姝㈡椂闂翠笌鎸囧崡姝f枃锛涚紪鍙� GL+yyyyMMdd+6浣嶆祦姘达紙Redis 姣忔棩閲嶇疆锛夛紱status: 0鑽夌/20宸插彂甯�/30宸叉埅姝€�備粎鑽夌鍙敼鍙垹锛屽彂甯冨悗鍗冲喕缁擄紱宸蹭骇鐢熺敵鎶ュ崟鐨勬寚鍗楃姝㈠垹闄わ紙鎻愮ず璇ユ寚鍗椾笅宸叉湁 N 寮犵敵鎶ュ崟锛�", "roles": ["瀛︿細绉樹功澶�", "璇鹃绠$悊鍛�"]},
{"stage": "鍦ㄧ嚎鐢虫姤", "action": "浠庡凡鍙戝竷涓斿湪鐢虫姤鏈熷唴鐨勬寚鍗楁柊寤虹敵鎶ヤ功锛涢�変細鍛橈紙ums_member锛夎嚜鍔ㄥ甫鍑哄鍚�/宸ヤ綔鍗曚綅/鑱岀О/鑱旂郴鐢佃瘽/閭锛屽彲鏀癸紱濉棰樺悕绉般�佽棰樼粍鎴愬憳銆佺敵璇风粡璐广�佺敵鎶ヤ功姝f枃锛涚紪鍙� SB+yyyyMMdd+6浣嶆祦姘达紱绫诲埆鍐椾綑鑷寚鍗楋紝涓嶄俊浠诲墠绔紶鍊硷紱status: 0鑽夌", "roles": ["璇鹃鐢虫姤浜猴紙浼氬憳锛�", "璇鹃绠$悊鍛�"]},
@@ -630,7 +632,7 @@
{"stage": "涓撳璇勫", "action": "鐢虫姤鍗曞浜庡鎵逛腑(15)鏃跺綍鍏ヤ笓瀹惰瘎鍒嗘槑缁嗭紙涓�浣嶄笓瀹朵竴琛岋細濮撳悕/鍗曚綅/鑱岀О + 閫夐浠峰��0.3/鐮旂┒鏂规0.3/鍥㈤槦鍩虹0.2/棰勬湡鎴愭灉0.2 鍥涢」鍒嗗�� + 缁撹 + 鎰忚锛夛紱鍚庣姣忔澧炲垹鏀瑰悗閲嶇畻 compositeScore 鍔犳潈鍚堣銆佹寜鍔犳潈鍒嗛檷搴忛噸鎺� ranking锛屽苟鍥炲啓涓诲崟 reviewAvgScore锛堝叏閮ㄤ笓瀹跺潎鍒嗭級涓� reviewPass锛堝潎鍒嗚揪鏍囦笖澶氭暟缁撹涓烘帹鑽愮珛椤癸級锛涙槑缁嗗叏閮ㄥ垹闄ゆ椂姹囨�诲�兼竻绌轰负鏈眹鎬伙紱鍥涢」鍒嗗�煎潎鍦� 0~100 涔嬪鏃舵彁绀烘寚鍑哄叿浣撶淮搴︿笌瀹為檯鍊�", "roles": ["璇勫涓撳", "瀛︿細绉樹功澶�", "璇鹃绠$悊鍛�"]},
{"stage": "绔嬮」瀹℃壒", "action": "BPM 娴佺▼ research_topic_approve 椤哄簭璧颁笁鑺傜偣锛氱涔﹀褰㈠紡瀹℃煡 鈫� 涓撳璇勫 鈫� 瀛︿細绔嬮」瀹℃壒銆傚鎵规柟娉曚笌瀹℃壒浜哄湪娴佺▼瀹氫箟鍐呴厤缃紝閮ㄧ讲鍚庣敱绠$悊鍛樺湪 BPM 娴佺▼璁捐鍣ㄦ寜瀛︿細瀹為檯缁勭粐璋冩暣锛涘鎵逛腑蹇冨唴鐨勮嚜瀹氫箟琛ㄥ崟鍙鍥炴樉鐢虫姤鍗� + 璇勫鏄庣粏 + 鎷ㄤ粯璁板綍銆傞�氳繃鈫�20 宸茬珛椤广�侀┏鍥炩啋35 宸查┏鍥炪�佸彇娑堚啋閫�鍥� 0 鑽夌", "roles": ["瀛︿細绉樹功澶勶紙褰㈠紡瀹℃煡锛�", "璇勫涓撳锛堣瘎瀹¤妭鐐癸級", "瀛︿細鐞嗕簨浼氾紙绔嬮」瀹℃壒锛�"]},
{"stage": "绔嬮」涓庨�氱煡", "action": "鐩戝惉鍣� ResearchApplicationStatusListener 鍏堝洖鍐欏鎵圭姸鎬侊紝瀹℃壒閫氳繃鍚庡啀璋� approveApplication锛氱敓鎴愮珛椤圭紪鍙� LX+yyyyMMdd+6浣嶆祦姘� 涓� approveTime锛堝凡鏈夌紪鍙峰垯骞傜瓑璺宠繃锛夈�傜偣銆屽彂甯冪珛椤归�氱煡銆嶇敓鎴� system_notice 鍏憡锛堟爣棰樸�庡叧浜庡叕甯冪珛椤硅棰樼殑閫氱煡銆忥紝姝f枃鍚棰樺悕/绔嬮」缂栧彿/绫诲埆/鐢虫姤浜�/鍗曚綅/璧勫姪閲戦锛夛紝鍐欏洖 noticeId 闃查噸澶嶁�斺�旈噸澶嶇偣鍑绘寜宸插彂甯冩嫤鎴苟鍛婄煡涓婃鍙戝竷鏃堕棿", "roles": ["璇鹃绠$悊鍛�", "瀛︿細绉樹功澶�"]},
- {"stage": "缁忚垂鎷ㄤ粯", "action": "浠呫�屽凡绔嬮」(20)銆嶇殑鐢虫姤鍗曞彲鐧昏鎷ㄦ璁板綍锛堟壒娆″悕绉�/鎷ㄤ粯閲戦/鎷ㄤ粯鏃ユ湡/鏀舵鍗曚綅/鐘舵��/澶囨敞/鍑瘉闄勪欢锛夛紱閲戦鏍¢獙锛氬凡鐧昏閲戦 + 鏈閲戦 涓嶅緱瓒呭嚭璇ュ崟鐢宠缁忚垂锛岃秴鍑烘椂鎻愮ず鎶ュ嚭鏈銆佸凡鐧昏銆佸悎璁°�侀绠楀洓椤规暟鍊硷紱status: 0寰呮嫧浠�/20宸叉嫧浠橈紝鍑瘉鏄庣粏璧� system 闄勪欢涓績 recordType=research_fund_record锛岀姸鎬佹敼涓哄凡鎷ㄤ粯鏃跺嚟璇佸繀濉紱浠呭緟鎷ㄤ粯鐘舵�佸彲鏀瑰彲鍒狅紝缂栬緫鏃朵細鎶婃湰琛岄噾棰濆姞鍥炰綑棰濇樉绀�", "roles": ["瀛︿細璐㈠姟", "璇鹃绠$悊鍛�"]}]},
+ {"stage": "缁忚垂鎷ㄤ粯", "action": "浠呫�屽凡绔嬮」(20)銆嶇殑鐢虫姤鍗曞彲鐧昏鎷ㄦ璁板綍锛堟壒娆″悕绉�/鎷ㄤ粯閲戦/鎷ㄤ粯鏃ユ湡/鏀舵鍗曚綅/澶囨敞/鍑瘉闄勪欢锛夛紝鍑瘉蹇呭~銆傜櫥璁版椂涓�鏉¢緳瀹屾垚锛氣憼 璇鹃渚ц惤 research_fund_record 鍙拌处锛堝厛缃緟鎷ㄤ粯锛夆憽 鍚屼竴鎵� blob 鍙岀粦鍒拌棰樺彴璐︿笌璐㈠姟鎶ラ攢鍗� 鈶� 缁� yudao-module-finance-api 鑷姩鐢熸垚 1:1 鐨� finance_reimbursement 鎶ラ攢鍗曪紙1 琛屾槑缁嗭細璐圭敤绫诲瀷=鍏朵粬銆佸彂绁ㄩ噾棰�=鎷ㄤ粯閲戦銆佸彂绁ㄦ棩鏈�=鎷ㄤ粯鏃ユ湡銆佽垂鐢ㄨ鏄�=銆岃棰樸�旇棰樺悕銆曠N鏈�/绗琋娆$粡璐规嫧娆俱�嶏級鈶� 绔嬪嵆鎻愪氦 BPM 鎶ラ攢瀹℃壒 鈶� 鍙拌处鍥炲啓鎶ラ攢鍗曞彿骞剁疆銆屾姤閿�瀹℃壒涓�(15)銆嶃�傞噾棰濇牎楠岋細宸茬櫥璁伴噾棰� + 鏈閲戦 涓嶅緱瓒呭嚭璇ュ崟鐢宠缁忚垂锛岃秴鍑烘椂鎻愮ず鎶ュ嚭鏈銆佸凡鐧昏銆佸悎璁°�侀绠楀洓椤规暟鍊笺�傜姸鎬佺敱绯荤粺椹卞姩锛�0寰呮嫧浠�/15鎶ラ攢瀹℃壒涓�/20宸叉嫧浠�/30宸查┏鍥烇紱鍙湁銆屽緟鎷ㄤ粯銆嶅彲鍒狅紙鍒犻櫎鑱斿姩娓呯悊璐㈠姟渚ц崏绋挎姤閿�鍗曪級锛屻�屽緟鎷ㄤ粯銆嶃�屽凡椹冲洖銆嶅彲鏀瑰苟閲嶆柊鍙戣捣鎶ラ攢锛堝凡椹冲洖鏀瑰悗娓呯┖椹冲洖鍘熷洜涓庢椂闂达級锛涜储鍔$鎾ゅ洖鎴栧彇娑堝垯閫�鍥炪�屽緟鎷ㄤ粯(0)銆嶃�傝储鍔″鎵瑰垎绫讳笅娌℃湁宸插彂甯冩祦绋嬫椂鐩存帴鎶ラ敊涓斾笉寤哄崟锛屼笉鐣欏鍎胯崏绋挎姤閿�鍗�", "roles": ["瀛︿細璐㈠姟", "璇鹃绠$悊鍛�", "璐㈠姟瀹℃牳浜�", "璐㈠姟涓荤"]}]},
{"id": "ai", "name": "AI 涓氬姟娴佺▼", "mermaid": "mermaid/11-ai-business-flow.mmd", "color": "#56c8d8",
"summary": "缁熶竴妯″紡锛氫笟鍔′晶鏀堕泦涓婁笅鏂�(蹇呰鏃惰皟 MDM/SRM/CRM API 鍙栧悕绉�)鈫掔粍瑁� Prompt鈫抍hat/chatWithImage鈫掕В鏋� JSON鈫掑墠绔濉垨寤鸿锛涙棤 Function Calling锛汻AG 鐭ヨ瘑搴撳凡寤烘垚浣嗘殏鏃犱笟鍔℃秷璐广��",
"steps": [
@@ -1010,7 +1012,7 @@
MES -->|閫�璐ц川妫�鍏ュ簱鍥炶皟| AS[鍞悗宸ュ崟缁翠慨閫�璐
CRM -->|瀹㈡埛涓绘暟鎹畖 AS
HRM[HRM 鍛樺伐鍏ヨ浆璋冪浜ゆ帴鑰冨嫟钖叕] -.->|expandUserIds 鏁版嵁鍙鎬ф墿灞暵锋帴鍙e凡灏辩华寰呭悇妯″潡鎺ュ叆| CRM
- BPM[BPM Flowable 瀹℃壒寮曟搸] -.->|鐘舵�佷簨浠跺洖璋兟�14涓洃鍚櫒| ERP
+ BPM[BPM Flowable 瀹℃壒寮曟搸] -.->|鐘舵�佷簨浠跺洖璋兟�15涓洃鍚櫒| ERP
BPM -.-> CRM
BPM -.-> SRM
BPM -.-> MES
@@ -1029,7 +1031,7 @@
STG[闄勪欢涓績 storage-blob+attachment 鍏ㄦā鍧楃粺涓�鎸傞檮浠禲 --- ERP
FIN[璐㈠姟鎶ラ攢 鐙珛妯″潡 yudao-module-finance 鎶ラ攢鍗� 鏄庣粏 鍙戠エ闄勪欢] -.->|澶嶇敤 BPM 瀹℃壒涓庣姸鎬佸洖璋億 BPM
FIN -.->|鍙戠エ璧伴檮浠朵腑蹇� recordType=finance_reimbursement| STG
- FIN -.->|鐙珛妯″潡路涓嶄笌鍏跺畠涓氬姟妯″潡浜х敓鍗曟嵁鎴栨暟鎹叧鑱攟 ERP
+ FIN -.->|"瀵瑰浠呮彁渚� yudao-module-finance-api(FinanceReimbursementApi)渚涗粬妯″潡寤哄崟"| ERP
UMS[浼氬憳绠$悊 鐙珛妯″潡 yudao-module-ums 鍏ヤ細鐢宠 浼氬憳 閫氳褰昡 -.->|澶嶇敤 BPM 涓ょ骇瀹℃壒涓庣姸鎬佸洖璋億 BPM
UMS -.->|璇佹槑鏉愭枡璧伴檮浠朵腑蹇� recordType=ums_application / ums_member| STG
UMS -.->|瀹℃壒閫氳繃缁� AdminUserApi.createUser 寤虹郴缁熺櫥褰曡处鍙穦 SYS
@@ -1038,6 +1040,8 @@
RES -.->|闄勪欢璧伴檮浠朵腑蹇� recordType=research_guideline / research_application / research_fund_record| STG
RES -->|閫変細鍛樺彇鐢虫姤浜哄鍚� 宸ヤ綔鍗曚綅 鑱岀О 鑱旂郴鐢佃瘽| UMS
RES -->|绔嬮」閫氱煡鍐� system_notice 鍏憡| SYS
+ RES -->|缁忚垂鎷ㄤ粯 1:1 鑷姩鐢熸垚 finance_reimbursement 鎶ラ攢鍗曞苟鎻愪氦瀹℃壒路璧版柊寤虹殑 yudao-module-finance-api| FIN
+ FIN -.->|鎶ラ攢瀹℃壒缁撴灉缁� BPM 浜嬩欢鍥炶皟 ResearchFundStatusListener 鍥炲啓璇鹃鎷ㄦ鍙拌处| RES
</pre>
<pre style="display:none" class="mmd-src" data-mmd="09-data-flow">
flowchart LR
@@ -1122,7 +1126,7 @@
RBM -->|submit 甯� id 涓� processDefinitionKey 璧� query| RBS
RBS -.->|BPM 鐩戝惉鍣ㄧ粨鏋滃洖鍐� 閫氳繃20 椹冲洖35 鍙栨秷閫�鍥�0| RBM
RBA -.->|涓婁紶涓庝繚瀛樺垎绂宦风鍦ㄤ笟鍔¤〃瀛樻枃浠跺湴鍧�| PDFARCH
- FINNOTE[鐙珛妯″潡路閿�鍞噰璐摼鏉′换鎰忓崟鎹潎涓嶇敓鎴愭姤閿�鍗暵锋姤閿�鍗曚害涓嶅洖鍐欎换浣曞閮ㄥ崟鎹甝 -.-> RBM
+ FINNOTE[鐙珛妯″潡路閿�鍞噰璐摼鏉′换鎰忓崟鎹潎涓嶇敓鎴愭姤閿�鍗暵锋姤閿�鍗曚害涓嶅洖鍐欎换浣曞閮ㄥ崟鎹峰敮涓�渚嬪鏄棰樼粡璐规嫧浠榏 -.-> RBM
subgraph S6 [鐙珛璇鹃绠$悊 research]
RGL[璇鹃鎸囧崡 research_guideline] --> RAP[璇鹃鐢虫姤涔� research_application]
RAP --> RRV[涓撳璇勫鏄庣粏 research_topic_review]
@@ -1139,10 +1143,13 @@
RRV -.->|"鏄庣粏鍒犵┖鏃朵富鍗曟眹鎬绘竻涓� null"| RAP
RAP -->|"publishNotice 鐢熸垚 system_notice 鍏憡骞跺洖鍐� noticeId路閲嶅鍙戝竷鎷︽埅"| SYS2[system_notice 绯荤粺鍏憡]
RFR -->|"閲戦鏍¢獙 宸茬櫥璁� + 鏈 涓嶅緱瓒呭嚭 budgetAmount 鐢宠缁忚垂"| RAP
- RFR -.->|"鍑瘉璧伴檮浠朵腑蹇� recordType=research_fund_record路琛ㄥ唴涓嶅瓨鏂囦欢鍦板潃"| PDFARCH
+ RFR -.->|"鍑瘉璧伴檮浠朵腑蹇� recordType=research_fund_record路鍚屼竴鎵� blob 鍙岀粦 finance_reimbursement路琛ㄥ唴涓嶅瓨鏂囦欢鍦板潃"| PDFARCH
RAP -.->|"鐢虫姤闄勪欢 recordType=research_application"| PDFARCH
RGL -.->|"鎸囧崡闄勪欢 recordType=research_guideline"| PDFARCH
- RESNOTE[鐙珛妯″潡路涓�鏈熺粡璐规嫧浠樺彧鍦ㄦ湰妯″潡钀借褰暵蜂笌璐㈠姟妯″潡鏃犳暟鎹悓姝ヂ蜂簩鏈熷啀瀵规帴] -.-> RFR
+ RFR -->|"1:1 鐢熸垚鎶ラ攢鍗暵风粡 FinanceReimbursementApi 鏈湴 Bean 寤哄崟骞剁珛鍗� submit路鍥炲啓 reimbursement_id/reimbursement_no路鍙拌处缃� 15 鎶ラ攢瀹℃壒涓�"| RBM
+ RBM -->|"鎶ラ攢鍗曡繘鍏ュ悓涓�鏉� BPM 娴佺▼ finance_reimbursement_approve(璐㈠姟瀹℃牳 鈫� 璐㈠姟涓荤瀹℃壒)路businessKey=鎶ラ攢鍗� ID"| RBS
+ RBS -.->|"BPM 鐩戝惉鍣� ResearchFundStatusListener 鍥炲啓璇鹃鍙拌处 閫氳繃20 椹冲洖30(+椹冲洖鍘熷洜/鏃堕棿) 鎾ゅ洖0"| RFR
+ RESNOTE[涓�鏈熷凡瀵规帴璐㈠姟路璇鹃鍙拌处涓烘嫧娆惧彴璐β锋姤閿�鍗曚负璐㈠姟鍑鸿处鍑瘉路涓よ竟浠� reimbursement_id 杞叧鑱旀棤澶栭敭路璐㈠姟渚х洿鎺ュ垹鍗曚細鐣欎笅鎮┖ ID 鐢变笟鍔℃姤閿欏厹搴昡 -.-> RFR
</pre>
<pre style="display:none" class="mmd-src" data-mmd="10-business-object">
erDiagram
@@ -1188,6 +1195,7 @@
research_guideline ||--o{ research_application : "琚敵鎶ュ紩鐢�"
research_application ||--o{ research_topic_review : "涓撳璇勫垎鏄庣粏"
research_application ||--o{ research_fund_record : "缁忚垂鎷ㄤ粯璁板綍"
+ research_fund_record ||--|| finance_reimbursement : "1:1 鐢熸垚鍑鸿处鎶ラ攢鍗�(杞叧鑱� reimbursement_id)"
ums_member ||--o{ research_application : "鐢虫姤浜�(杞叧鑱旀棤澶栭敭)"
</pre>
<pre style="display:none" class="mmd-src" data-mmd="11-ai-business-flow">
@@ -1235,7 +1243,7 @@
</pre>
<pre style="display:none" class="mmd-src" data-mmd="12-finance-flow">
flowchart TD
- U1[鎶ラ攢浜哄~鎶ユ姤閿�鍗暵蜂富琛�: 鎶ラ攢鍗曞彿(閫夊~) 鎶ラ攢鏍囬 鎶ラ攢鎬婚噾棰� 鐢宠鏃ユ湡 澶囨敞] --> U2[褰曞叆鎶ラ攢鏄庣粏 1..n 琛�: 璐圭敤绫诲瀷 鍙戠エ鍙风爜 鍙戠エ閲戦 鍙戠エ鏃ユ湡 寮�绁ㄦ柟 璐圭敤璇存槑]
+ U1["鎶ラ攢浜哄~鎶ユ姤閿�鍗暵蜂富琛�: 鎶ラ攢鍗曞彿(閫夊~) 鎶ラ攢鏍囬 鎶ラ攢鎬婚噾棰� 鐢宠鏃ユ湡 澶囨敞"] --> U2["褰曞叆鎶ラ攢鏄庣粏 1..n 琛�: 璐圭敤绫诲瀷 鍙戠エ鍙风爜 鍙戠エ閲戦 鍙戠エ鏃ユ湡 寮�绁ㄦ柟 璐圭敤璇存槑"]
U2 --> U3[鍙戠エ闄勪欢: 鍥剧墖鎴� PDF 鍏堜紶 system storage-blob upload 鍙� blobId]
U3 --> S1[淇濆瓨 create路涓昏〃涓庢槑缁嗕笌鍏ㄩ儴 blobIds 涓�娆℃�ф彁浜
S1 --> G1["鎶ラ攢鍗曞彿锛氬彲鑷畾涔夛紱鐣欑┖(鍚函绌烘牸)鍒欑敱鍚庣鐢熸垚 BX + yyyyMMdd + 6浣嶆祦姘�(Redis路姣忔棩閲嶇疆)"]
@@ -1251,7 +1259,7 @@
K3 -->|archive 褰掓。| K5[宸插綊妗� 40路缁堟�伮峰啓鍏� archiveTime]
D1["浠呰崏绋� 0 鍙� delete路杩炲甫娓呯悊鏄庣粏涓庡彂绁ㄩ檮浠�"] -.-> K1
E1["浠呰崏绋� 0 涓庡凡椹冲洖 35 鍙� update路鍏朵綑鐘舵�佸彧璇�"] -.-> K4
- N1["鐙珛妯″潡路涓嶄笌鍏朵粬涓氬姟妯″潡浜х敓鍗曟嵁鎴栧瓧娈靛甫鍏�"] --- K1
+ N1["鐙珛妯″潡路涓庨攢鍞噰璐摼鏉′换浣曞崟鎹潎鏃犲叧鑱旓紱鍞竴渚嬪鏄璇鹃缁忚垂鎷ㄤ粯 1:1 鑷姩鐢熸垚(缁� yudao-module-finance-api)"] --- K1
</pre>
<pre style="display:none" class="mmd-src" data-mmd="13-ums-membership-flow">
flowchart TD
@@ -1322,18 +1330,26 @@
KA -->|椹冲洖| K5
K5 -->|淇敼鍚庨噸鏂� submit| K2
K4 -->|publishNotice 鍙戝竷绔嬮」閫氱煡| N1["system_notice 鍏憡路鏍囬銆庡叧浜庡叕甯冪珛椤硅棰樼殑閫氱煡銆徛锋鏂囧惈璇鹃鍚� 绔嬮」缂栧彿 绫诲埆 鐢虫姤浜� 鍗曚綅 璧勫姪閲戦路鍥炲啓 noticeId路閲嶅鍙戝竷琚嫤鎴�"]
- K4 -->|鐧昏鎷ㄦ璁板綍 research_fund_record| F1[濉壒娆″悕绉� 鎷ㄤ粯閲戦 鎷ㄤ粯鏃ユ湡 鏀舵鍗曚綅 鎷ㄤ粯鐘舵�� 鍑瘉闄勪欢]
- F1 -->|"閲戦鏍¢獙: 宸茬櫥璁伴噾棰� + 鏈閲戦 涓嶅緱瓒呭嚭鐢虫姤鍗曠敵璇风粡璐孤疯秴鍑烘椂鎶ュ嚭鏈 宸茬櫥璁� 鍚堣 棰勭畻鍥涢」鏁板��"| F2[寰呮嫧浠� 0]
- F2 -->|"浠呭緟鎷ㄤ粯 0 鍙敼鍙垹"| F2
- F2 -->|"鐘舵�佹敼涓哄凡鎷ㄤ粯鏃跺繀椤诲凡鏈夊嚟璇侀檮浠�"| F3[宸叉嫧浠� 20]
+ K4 -->|鐧昏鎷ㄦ璁板綍 research_fund_record| F1[濉壒娆″悕绉� 鎷ㄤ粯閲戦 鎷ㄤ粯鏃ユ湡 鏀舵鍗曚綅 澶囨敞路鍑瘉闄勪欢蹇呭~]
+ F1 -->|"閲戦鏍¢獙: 宸茬櫥璁伴噾棰� + 鏈閲戦 涓嶅緱瓒呭嚭鐢虫姤鍗曠敵璇风粡璐孤疯秴鍑烘椂鎶ュ嚭鏈 宸茬櫥璁� 鍚堣 棰勭畻鍥涢」鏁板��"| FGEN["鑷姩鐢熸垚 1:1 璐㈠姟鎶ラ攢鍗� finance_reimbursement(1 琛屾槑缁�: 璐圭敤绫诲瀷=鍏朵粬 鍙戠エ閲戦=鎷ㄤ粯閲戦 鍙戠エ鏃ユ湡=鎷ㄤ粯鏃ユ湡 璐圭敤璇存槑=璇鹃鍚�+鎵规)路闄勫悓涓�鎵瑰嚟璇伮风珛鍗虫彁浜� BPM路鍥炲啓鎶ラ攢鍗曞彿"]
+ FGEN -->|鍥炲啓鍙拌处鐘舵�亅 F3[鎶ラ攢瀹℃壒涓� 15]
+ F3 -->|"璐㈠姟瀹℃牳 Activity_finance_review"| FAPP[璐㈠姟涓荤瀹℃壒 Activity_finance_approve]
+ FAPP -->|BPM 瀹℃壒閫氳繃| F4[宸叉嫧浠� 20]
+ FAPP -->|BPM 瀹℃壒椹冲洖| F5["宸查┏鍥� 30路鍥炲啓椹冲洖鍘熷洜涓庨┏鍥炴椂闂�"]
+ F5 -->|"淇敼閲戦鎴栧嚟璇佸悗閲嶆柊鍙戣捣鎶ラ攢"| F3
+ FAPP -->|"璐㈠姟绔挙鍥炴垨鍙栨秷"| F2["寰呮嫧浠� 0路鍙紪杈戝彲鍒犻櫎"]
+ F2 -->|"浠呭緟鎷ㄤ粯 0 鍙敼鍙垹路鍒犻櫎鏃惰仈鍔ㄦ竻鐞嗚储鍔′晶鑽夌鎶ラ攢鍗�"| F2
+ F2 -->|"淇敼鍚庨噸鏂板彂璧锋姤閿�"| F3
ATT1["闄勪欢 recordType = research_guideline"] -.-> G3
ATT2["闄勪欢 recordType = research_application"] -.-> K1
- ATT3["闄勪欢 recordType = research_fund_record"] -.-> F1
+ ATT3["闄勪欢 recordType = research_fund_record路鍚屼竴鎵� blob 鍙岀粦 finance_reimbursement(鎸� recordType+recordId 闅旂浜掍笉褰卞搷)"] -.-> F1
ROL["瀹℃壒涓績鐪嬪崟: 娴佺▼瀹氫箟琛ㄥ崟绫诲瀷=鑷畾涔夎〃鍗暵峰垱寤鸿矾寰� /research/application/index 路 鏌ョ湅璺緞 /research/application/detail/approve/index.vue路鎸� businessKey 鍥炴樉鐢虫姤鍗�"] -.-> K3
ROL2["瀹℃壒浜哄彇鍊�: 涓夎妭鐐瑰湪娴佺▼瀹氫箟鍐呴厤濂藉鎵规柟娉�(渚濇瀹℃壒)涓庡鎵逛汉绛栫暐路閮ㄧ讲鍚庣敱绠$悊鍛樺湪 BPM 娴佺▼璁捐鍣ㄦ寜瀛︿細瀹為檯缁勭粐璋冩暣路鎻愪氦鏃跺墠绔彧璁╅�夋祦绋嬩笉閫夊鎵逛汉"] -.-> K3
- RES1["涓�鏈熻竟鐣�: 缁忚垂鎷ㄤ粯鍙湪鏈ā鍧楄惤鎷ㄦ璁板綍路涓庤储鍔℃ā鍧楁棤鏁版嵁鍚屾(涓嶅仛璺ㄦā鍧楀鎺�)"] -.-> F1
+ LIS2["鐩戝惉鍣� ResearchFundStatusListener(娴佺▼ key=finance_reimbursement_approve路businessKey=鎶ラ攢鍗� ID): 閫氳繃鈫掑彴璐﹀凡鎷ㄤ粯 20路椹冲洖鈫掑凡椹冲洖 30+鍘熷洜涓庢椂闂绰锋挙鍥�/鍙栨秷鈫掗��鍥炲緟鎷ㄤ粯 0路涓� finance 鑷繁鐨勭洃鍚櫒璁㈤槄鍚屼竴 key 骞惰瑙﹀彂"] -.-> F3
+ FINAPI["璺ㄦā鍧楄蛋鏂板缓鐨� yudao-module-finance-api(FinanceReimbursementApi路鏈湴 Bean 闈� HTTP): 鏃犲凡鍙戝竷鎶ラ攢瀹℃壒娴佺▼鏃跺厛瑙f瀽鍗虫姤閿櫬蜂笉寤哄崟路閬垮厤鐣欎笅瀛ゅ効鑽夌鎶ラ攢鍗�"] -.-> FGEN
+ RES1["涓�鏈熷凡瀵规帴璐㈠姟: 鎷ㄦ蹇呴』璧� finance_reimbursement 鎶ラ攢鍗曞嚭璐β疯棰樹晶鍙拌处=鎷ㄦ鍙拌处路璐㈠姟鎶ラ攢鍗�=鍑鸿处鍑瘉路涓よ竟浠� reimbursement_id 杞叧鑱�(鏃犲閿�)路璐㈠姟瀹℃壒缁撴灉鑷姩鍥炲啓鏈彴璐�"] -.-> F1
RES2["浜屾湡鑼冨洿(鏈浘鏈鐩�): 缁撻」楠屾敹 缁撻」璇佷功 鎴愭灉褰掓。鐭ヨ瘑搴� 閲囩撼鎯呭喌涓庣ぞ浼氭晥鐩婃爣娉�"] -.-> K4
- BOUND["鐙珛妯″潡 yudao-module-research路瀵� ums_member 涓鸿蒋鍏宠仈(鏃犲閿�)路浠呭鐢� BPM 瀹℃壒銆乻ystem 鍏憡涓庨檮浠朵腑蹇�"] --- K1
+ BOUND["鐙珛妯″潡 yudao-module-research路瀵� ums_member 涓鸿蒋鍏宠仈(鏃犲閿�)路瀵硅储鍔℃ā鍧楄蛋 -api 瀛愭ā鍧楁湰鍦拌皟鐢蜂粎澶嶇敤 BPM 瀹℃壒銆乻ystem 鍏憡涓庨檮浠朵腑蹇�"] --- K1
</pre>
<script type="module">
diff --git a/docs/project-business/mermaid/08-module-relation.mmd b/docs/project-business/mermaid/08-module-relation.mmd
index 1e254c1..1a7bd80 100644
--- a/docs/project-business/mermaid/08-module-relation.mmd
+++ b/docs/project-business/mermaid/08-module-relation.mmd
@@ -11,7 +11,7 @@
MES -->|閫�璐ц川妫�鍏ュ簱鍥炶皟| AS[鍞悗宸ュ崟缁翠慨閫�璐
CRM -->|瀹㈡埛涓绘暟鎹畖 AS
HRM[HRM 鍛樺伐鍏ヨ浆璋冪浜ゆ帴鑰冨嫟钖叕] -.->|expandUserIds 鏁版嵁鍙鎬ф墿灞暵锋帴鍙e凡灏辩华寰呭悇妯″潡鎺ュ叆| CRM
- BPM[BPM Flowable 瀹℃壒寮曟搸] -.->|鐘舵�佷簨浠跺洖璋兟�14涓洃鍚櫒| ERP
+ BPM[BPM Flowable 瀹℃壒寮曟搸] -.->|鐘舵�佷簨浠跺洖璋兟�15涓洃鍚櫒| ERP
BPM -.-> CRM
BPM -.-> SRM
BPM -.-> MES
@@ -30,7 +30,7 @@
STG[闄勪欢涓績 storage-blob+attachment 鍏ㄦā鍧楃粺涓�鎸傞檮浠禲 --- ERP
FIN[璐㈠姟鎶ラ攢 鐙珛妯″潡 yudao-module-finance 鎶ラ攢鍗� 鏄庣粏 鍙戠エ闄勪欢] -.->|澶嶇敤 BPM 瀹℃壒涓庣姸鎬佸洖璋億 BPM
FIN -.->|鍙戠エ璧伴檮浠朵腑蹇� recordType=finance_reimbursement| STG
- FIN -.->|鐙珛妯″潡路涓嶄笌鍏跺畠涓氬姟妯″潡浜х敓鍗曟嵁鎴栨暟鎹叧鑱攟 ERP
+ FIN -.->|"瀵瑰浠呮彁渚� yudao-module-finance-api(FinanceReimbursementApi)渚涗粬妯″潡寤哄崟"| ERP
UMS[浼氬憳绠$悊 鐙珛妯″潡 yudao-module-ums 鍏ヤ細鐢宠 浼氬憳 閫氳褰昡 -.->|澶嶇敤 BPM 涓ょ骇瀹℃壒涓庣姸鎬佸洖璋億 BPM
UMS -.->|璇佹槑鏉愭枡璧伴檮浠朵腑蹇� recordType=ums_application / ums_member| STG
UMS -.->|瀹℃壒閫氳繃缁� AdminUserApi.createUser 寤虹郴缁熺櫥褰曡处鍙穦 SYS
@@ -39,3 +39,5 @@
RES -.->|闄勪欢璧伴檮浠朵腑蹇� recordType=research_guideline / research_application / research_fund_record| STG
RES -->|閫変細鍛樺彇鐢虫姤浜哄鍚� 宸ヤ綔鍗曚綅 鑱岀О 鑱旂郴鐢佃瘽| UMS
RES -->|绔嬮」閫氱煡鍐� system_notice 鍏憡| SYS
+ RES -->|缁忚垂鎷ㄤ粯 1:1 鑷姩鐢熸垚 finance_reimbursement 鎶ラ攢鍗曞苟鎻愪氦瀹℃壒路璧版柊寤虹殑 yudao-module-finance-api| FIN
+ FIN -.->|鎶ラ攢瀹℃壒缁撴灉缁� BPM 浜嬩欢鍥炶皟 ResearchFundStatusListener 鍥炲啓璇鹃鎷ㄦ鍙拌处| RES
diff --git a/docs/project-business/mermaid/09-data-flow.mmd b/docs/project-business/mermaid/09-data-flow.mmd
index 7d87a7d..2f78f75 100644
--- a/docs/project-business/mermaid/09-data-flow.mmd
+++ b/docs/project-business/mermaid/09-data-flow.mmd
@@ -80,7 +80,7 @@
RBM -->|submit 甯� id 涓� processDefinitionKey 璧� query| RBS
RBS -.->|BPM 鐩戝惉鍣ㄧ粨鏋滃洖鍐� 閫氳繃20 椹冲洖35 鍙栨秷閫�鍥�0| RBM
RBA -.->|涓婁紶涓庝繚瀛樺垎绂宦风鍦ㄤ笟鍔¤〃瀛樻枃浠跺湴鍧�| PDFARCH
- FINNOTE[鐙珛妯″潡路閿�鍞噰璐摼鏉′换鎰忓崟鎹潎涓嶇敓鎴愭姤閿�鍗暵锋姤閿�鍗曚害涓嶅洖鍐欎换浣曞閮ㄥ崟鎹甝 -.-> RBM
+ FINNOTE[鐙珛妯″潡路閿�鍞噰璐摼鏉′换鎰忓崟鎹潎涓嶇敓鎴愭姤閿�鍗暵锋姤閿�鍗曚害涓嶅洖鍐欎换浣曞閮ㄥ崟鎹峰敮涓�渚嬪鏄棰樼粡璐规嫧浠榏 -.-> RBM
subgraph S6 [鐙珛璇鹃绠$悊 research]
RGL[璇鹃鎸囧崡 research_guideline] --> RAP[璇鹃鐢虫姤涔� research_application]
RAP --> RRV[涓撳璇勫鏄庣粏 research_topic_review]
@@ -97,7 +97,10 @@
RRV -.->|"鏄庣粏鍒犵┖鏃朵富鍗曟眹鎬绘竻涓� null"| RAP
RAP -->|"publishNotice 鐢熸垚 system_notice 鍏憡骞跺洖鍐� noticeId路閲嶅鍙戝竷鎷︽埅"| SYS2[system_notice 绯荤粺鍏憡]
RFR -->|"閲戦鏍¢獙 宸茬櫥璁� + 鏈 涓嶅緱瓒呭嚭 budgetAmount 鐢宠缁忚垂"| RAP
- RFR -.->|"鍑瘉璧伴檮浠朵腑蹇� recordType=research_fund_record路琛ㄥ唴涓嶅瓨鏂囦欢鍦板潃"| PDFARCH
+ RFR -.->|"鍑瘉璧伴檮浠朵腑蹇� recordType=research_fund_record路鍚屼竴鎵� blob 鍙岀粦 finance_reimbursement路琛ㄥ唴涓嶅瓨鏂囦欢鍦板潃"| PDFARCH
RAP -.->|"鐢虫姤闄勪欢 recordType=research_application"| PDFARCH
RGL -.->|"鎸囧崡闄勪欢 recordType=research_guideline"| PDFARCH
- RESNOTE[鐙珛妯″潡路涓�鏈熺粡璐规嫧浠樺彧鍦ㄦ湰妯″潡钀借褰暵蜂笌璐㈠姟妯″潡鏃犳暟鎹悓姝ヂ蜂簩鏈熷啀瀵规帴] -.-> RFR
+ RFR -->|"1:1 鐢熸垚鎶ラ攢鍗暵风粡 FinanceReimbursementApi 鏈湴 Bean 寤哄崟骞剁珛鍗� submit路鍥炲啓 reimbursement_id/reimbursement_no路鍙拌处缃� 15 鎶ラ攢瀹℃壒涓�"| RBM
+ RBM -->|"鎶ラ攢鍗曡繘鍏ュ悓涓�鏉� BPM 娴佺▼ finance_reimbursement_approve(璐㈠姟瀹℃牳 鈫� 璐㈠姟涓荤瀹℃壒)路businessKey=鎶ラ攢鍗� ID"| RBS
+ RBS -.->|"BPM 鐩戝惉鍣� ResearchFundStatusListener 鍥炲啓璇鹃鍙拌处 閫氳繃20 椹冲洖30(+椹冲洖鍘熷洜/鏃堕棿) 鎾ゅ洖0"| RFR
+ RESNOTE[涓�鏈熷凡瀵规帴璐㈠姟路璇鹃鍙拌处涓烘嫧娆惧彴璐β锋姤閿�鍗曚负璐㈠姟鍑鸿处鍑瘉路涓よ竟浠� reimbursement_id 杞叧鑱旀棤澶栭敭路璐㈠姟渚х洿鎺ュ垹鍗曚細鐣欎笅鎮┖ ID 鐢变笟鍔℃姤閿欏厹搴昡 -.-> RFR
diff --git a/docs/project-business/mermaid/10-business-object.mmd b/docs/project-business/mermaid/10-business-object.mmd
index a3b7484..6d73908 100644
--- a/docs/project-business/mermaid/10-business-object.mmd
+++ b/docs/project-business/mermaid/10-business-object.mmd
@@ -41,4 +41,5 @@
research_guideline ||--o{ research_application : "琚敵鎶ュ紩鐢�"
research_application ||--o{ research_topic_review : "涓撳璇勫垎鏄庣粏"
research_application ||--o{ research_fund_record : "缁忚垂鎷ㄤ粯璁板綍"
+ research_fund_record ||--|| finance_reimbursement : "1:1 鐢熸垚鍑鸿处鎶ラ攢鍗�(杞叧鑱� reimbursement_id)"
ums_member ||--o{ research_application : "鐢虫姤浜�(杞叧鑱旀棤澶栭敭)"
diff --git a/docs/project-business/mermaid/12-finance-flow.mmd b/docs/project-business/mermaid/12-finance-flow.mmd
index 571668e..9313486 100644
--- a/docs/project-business/mermaid/12-finance-flow.mmd
+++ b/docs/project-business/mermaid/12-finance-flow.mmd
@@ -1,5 +1,5 @@
flowchart TD
- U1[鎶ラ攢浜哄~鎶ユ姤閿�鍗暵蜂富琛�: 鎶ラ攢鍗曞彿(閫夊~) 鎶ラ攢鏍囬 鎶ラ攢鎬婚噾棰� 鐢宠鏃ユ湡 澶囨敞] --> U2[褰曞叆鎶ラ攢鏄庣粏 1..n 琛�: 璐圭敤绫诲瀷 鍙戠エ鍙风爜 鍙戠エ閲戦 鍙戠エ鏃ユ湡 寮�绁ㄦ柟 璐圭敤璇存槑]
+ U1["鎶ラ攢浜哄~鎶ユ姤閿�鍗暵蜂富琛�: 鎶ラ攢鍗曞彿(閫夊~) 鎶ラ攢鏍囬 鎶ラ攢鎬婚噾棰� 鐢宠鏃ユ湡 澶囨敞"] --> U2["褰曞叆鎶ラ攢鏄庣粏 1..n 琛�: 璐圭敤绫诲瀷 鍙戠エ鍙风爜 鍙戠エ閲戦 鍙戠エ鏃ユ湡 寮�绁ㄦ柟 璐圭敤璇存槑"]
U2 --> U3[鍙戠エ闄勪欢: 鍥剧墖鎴� PDF 鍏堜紶 system storage-blob upload 鍙� blobId]
U3 --> S1[淇濆瓨 create路涓昏〃涓庢槑缁嗕笌鍏ㄩ儴 blobIds 涓�娆℃�ф彁浜
S1 --> G1["鎶ラ攢鍗曞彿锛氬彲鑷畾涔夛紱鐣欑┖(鍚函绌烘牸)鍒欑敱鍚庣鐢熸垚 BX + yyyyMMdd + 6浣嶆祦姘�(Redis路姣忔棩閲嶇疆)"]
@@ -15,4 +15,4 @@
K3 -->|archive 褰掓。| K5[宸插綊妗� 40路缁堟�伮峰啓鍏� archiveTime]
D1["浠呰崏绋� 0 鍙� delete路杩炲甫娓呯悊鏄庣粏涓庡彂绁ㄩ檮浠�"] -.-> K1
E1["浠呰崏绋� 0 涓庡凡椹冲洖 35 鍙� update路鍏朵綑鐘舵�佸彧璇�"] -.-> K4
- N1["鐙珛妯″潡路涓嶄笌鍏朵粬涓氬姟妯″潡浜х敓鍗曟嵁鎴栧瓧娈靛甫鍏�"] --- K1
+ N1["鐙珛妯″潡路涓庨攢鍞噰璐摼鏉′换浣曞崟鎹潎鏃犲叧鑱旓紱鍞竴渚嬪鏄璇鹃缁忚垂鎷ㄤ粯 1:1 鑷姩鐢熸垚(缁� yudao-module-finance-api)"] --- K1
diff --git a/pom.xml b/pom.xml
index 3e2a0c7..d6408f7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -51,6 +51,7 @@
<module>yudao-module-qcreport</module>
<!-- 璐㈠姟绠$悊妯″潡 -->
<module>yudao-module-finance</module>
+ <module>yudao-module-finance-api</module>
<!-- 浼氬憳绠$悊妯″潡 -->
<module>yudao-module-ums</module>
<!-- 璇鹃绠$悊妯″潡 -->
diff --git a/yudao-module-finance-api/pom.xml b/yudao-module-finance-api/pom.xml
new file mode 100644
index 0000000..1a27cad
--- /dev/null
+++ b/yudao-module-finance-api/pom.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <groupId>cn.iocoder.boot</groupId>
+ <artifactId>yudao</artifactId>
+ <version>${revision}</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>yudao-module-finance-api</artifactId>
+ <packaging>jar</packaging>
+
+ <name>${project.artifactId}</name>
+ <description>
+ finance 妯″潡涓嬶紝璐㈠姟鎶ラ攢鐨� API 鎺ュ彛瀹氫箟锛屼緵鍏朵粬妯″潡寮曠敤
+ </description>
+
+ <dependencies>
+ <dependency>
+ <groupId>cn.iocoder.boot</groupId>
+ <artifactId>yudao-common</artifactId>
+ </dependency>
+
+ <!-- Swagger 娉ㄨВ -->
+ <dependency>
+ <groupId>org.springdoc</groupId>
+ <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ </dependencies>
+
+</project>
diff --git a/yudao-module-finance-api/src/main/java/cn/iocoder/yudao/module/finance/api/reimbursement/FinanceReimbursementApi.java b/yudao-module-finance-api/src/main/java/cn/iocoder/yudao/module/finance/api/reimbursement/FinanceReimbursementApi.java
new file mode 100644
index 0000000..0dc8d45
--- /dev/null
+++ b/yudao-module-finance-api/src/main/java/cn/iocoder/yudao/module/finance/api/reimbursement/FinanceReimbursementApi.java
@@ -0,0 +1,51 @@
+package cn.iocoder.yudao.module.finance.api.reimbursement;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.module.finance.api.reimbursement.dto.FinanceReimbursementCreateReqDTO;
+import cn.iocoder.yudao.module.finance.api.reimbursement.dto.FinanceReimbursementRespDTO;
+import cn.iocoder.yudao.module.finance.api.reimbursement.dto.FinanceReimbursementUpdateReqDTO;
+
+/**
+ * 璐㈠姟鎶ラ攢鍗� API 鎺ュ彛
+ *
+ * 渚涘叾浠栨ā鍧楋紙濡傝棰樼鐞嗙粡璐规嫧浠橈級鍒涘缓骞惰嚜鍔ㄦ彁浜ゆ姤閿�瀹℃壒锛屼互鍙婁慨鏀瑰悗閲嶆柊鍙戣捣銆佸垹闄ゃ�佹煡璇㈡姤閿�鍗曘��
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+public interface FinanceReimbursementApi {
+
+ String PREFIX = "/rpc-api/finance/reimbursement";
+
+ /**
+ * 鍒涘缓鎶ラ攢鍗曞苟绔嬪嵆鎻愪氦瀹℃壒锛堢郴缁熻嚜鍔ㄧ敓鎴� 1 琛屾槑缁嗭級
+ *
+ * @param reqDTO 鎶ラ攢鍗曚俊鎭�
+ * @return 鎶ラ攢鍗曠紪鍙�
+ */
+ CommonResult<Long> createReimbursementAndSubmit(FinanceReimbursementCreateReqDTO reqDTO);
+
+ /**
+ * 淇敼鎶ラ攢鍗曞苟閲嶆柊鎻愪氦瀹℃壒锛堢敤浜庢姤閿�琚┏鍥炲悗閲嶆柊鍙戣捣锛�
+ *
+ * @param reqDTO 鎶ラ攢鍗曚俊鎭紙鍚姤閿�鍗曠紪鍙凤級
+ * @return 鏄惁鎴愬姛
+ */
+ CommonResult<Boolean> updateReimbursementAndResubmit(FinanceReimbursementUpdateReqDTO reqDTO);
+
+ /**
+ * 鍒犻櫎鎶ラ攢鍗曪紙鍙湁鑽夌鎴栧凡椹冲洖鐘舵�佹墠鑳藉垹闄わ級
+ *
+ * @param reimbursementId 鎶ラ攢鍗曠紪鍙�
+ * @return 鏄惁鎴愬姛
+ */
+ CommonResult<Boolean> deleteReimbursement(Long reimbursementId);
+
+ /**
+ * 鑾峰彇鎶ラ攢鍗�
+ *
+ * @param reimbursementId 鎶ラ攢鍗曠紪鍙�
+ * @return 鎶ラ攢鍗�
+ */
+ CommonResult<FinanceReimbursementRespDTO> getReimbursement(Long reimbursementId);
+
+}
diff --git a/yudao-module-finance-api/src/main/java/cn/iocoder/yudao/module/finance/api/reimbursement/dto/FinanceReimbursementCreateReqDTO.java b/yudao-module-finance-api/src/main/java/cn/iocoder/yudao/module/finance/api/reimbursement/dto/FinanceReimbursementCreateReqDTO.java
new file mode 100644
index 0000000..0073dab
--- /dev/null
+++ b/yudao-module-finance-api/src/main/java/cn/iocoder/yudao/module/finance/api/reimbursement/dto/FinanceReimbursementCreateReqDTO.java
@@ -0,0 +1,35 @@
+package cn.iocoder.yudao.module.finance.api.reimbursement.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.List;
+
+@Schema(description = "RPC 鏈嶅姟 - 璐㈠姟鎶ラ攢鍗曞垱寤� Request DTO")
+@Data
+public class FinanceReimbursementCreateReqDTO {
+
+ @Schema(description = "鎶ラ攢浜嬬敱/鏍囬", requiredMode = Schema.RequiredMode.REQUIRED, example = "璇鹃銆擷X鐮旂┒銆曠涓�鏈熺粡璐规嫧娆�")
+ private String title;
+
+ @Schema(description = "鎶ラ攢鎬婚噾棰濓紙鍏冿級", requiredMode = Schema.RequiredMode.REQUIRED, example = "50000.00")
+ private BigDecimal totalAmount;
+
+ @Schema(description = "鐢宠鏃ユ湡", example = "2026-12-01")
+ private LocalDate applyDate;
+
+ @Schema(description = "澶囨敞")
+ private String remark;
+
+ @Schema(description = "鍑瘉闄勪欢 BlobId 鍒楄〃")
+ private List<Long> blobIds;
+
+ @Schema(description = "鑷姩鐢熸垚鐨勫敮涓�涓�琛屾槑缁嗙殑璐圭敤璇存槑", example = "璇鹃銆擷X鐮旂┒銆曠涓�鏈熺粡璐规嫧娆�")
+ private String expenseDescription;
+
+ @Schema(description = "鐢宠浜虹敤鎴风紪鍙�", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ private Long applicantId;
+
+}
diff --git a/yudao-module-finance-api/src/main/java/cn/iocoder/yudao/module/finance/api/reimbursement/dto/FinanceReimbursementRespDTO.java b/yudao-module-finance-api/src/main/java/cn/iocoder/yudao/module/finance/api/reimbursement/dto/FinanceReimbursementRespDTO.java
new file mode 100644
index 0000000..2b38690
--- /dev/null
+++ b/yudao-module-finance-api/src/main/java/cn/iocoder/yudao/module/finance/api/reimbursement/dto/FinanceReimbursementRespDTO.java
@@ -0,0 +1,37 @@
+package cn.iocoder.yudao.module.finance.api.reimbursement.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+@Schema(description = "RPC 鏈嶅姟 - 璐㈠姟鎶ラ攢鍗� Response DTO")
+@Data
+public class FinanceReimbursementRespDTO {
+
+ @Schema(description = "鎶ラ攢鍗曠紪鍙�", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ private Long id;
+
+ @Schema(description = "鎶ラ攢鍗曞彿", requiredMode = Schema.RequiredMode.REQUIRED, example = "BX20261201000001")
+ private String no;
+
+ @Schema(description = "鎶ラ攢浜嬬敱/鏍囬")
+ private String title;
+
+ @Schema(description = "鎶ラ攢鎬婚噾棰濓紙鍏冿級", example = "50000.00")
+ private BigDecimal totalAmount;
+
+ @Schema(description = "鎶ラ攢鍗曠姸鎬侊細0-鑽夌 15-瀹℃壒涓� 20-宸查�氳繃 35-宸查┏鍥� 40-宸插綊妗�", example = "15")
+ private Integer status;
+
+ @Schema(description = "娴佺▼瀹炰緥缂栧彿")
+ private String processInstanceId;
+
+ @Schema(description = "鐢宠鏃ユ湡", example = "2026-12-01")
+ private LocalDate applyDate;
+
+ @Schema(description = "鐢宠浜虹敤鎴风紪鍙�", example = "1")
+ private Long applicantId;
+
+}
diff --git a/yudao-module-finance-api/src/main/java/cn/iocoder/yudao/module/finance/api/reimbursement/dto/FinanceReimbursementUpdateReqDTO.java b/yudao-module-finance-api/src/main/java/cn/iocoder/yudao/module/finance/api/reimbursement/dto/FinanceReimbursementUpdateReqDTO.java
new file mode 100644
index 0000000..e3076cd
--- /dev/null
+++ b/yudao-module-finance-api/src/main/java/cn/iocoder/yudao/module/finance/api/reimbursement/dto/FinanceReimbursementUpdateReqDTO.java
@@ -0,0 +1,35 @@
+package cn.iocoder.yudao.module.finance.api.reimbursement.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.List;
+
+@Schema(description = "RPC 鏈嶅姟 - 璐㈠姟鎶ラ攢鍗曚慨鏀瑰苟閲嶆柊鎻愪氦 Request DTO")
+@Data
+public class FinanceReimbursementUpdateReqDTO {
+
+ @Schema(description = "鎶ラ攢鍗曠紪鍙�", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ private Long reimbursementId;
+
+ @Schema(description = "鎶ラ攢浜嬬敱/鏍囬", requiredMode = Schema.RequiredMode.REQUIRED, example = "璇鹃銆擷X鐮旂┒銆曠涓�鏈熺粡璐规嫧娆�")
+ private String title;
+
+ @Schema(description = "鎶ラ攢鎬婚噾棰濓紙鍏冿級", requiredMode = Schema.RequiredMode.REQUIRED, example = "50000.00")
+ private BigDecimal totalAmount;
+
+ @Schema(description = "鐢宠鏃ユ湡", example = "2026-12-01")
+ private LocalDate applyDate;
+
+ @Schema(description = "澶囨敞")
+ private String remark;
+
+ @Schema(description = "鍑瘉闄勪欢 BlobId 鍒楄〃锛堝叏閲忔浛鎹級")
+ private List<Long> blobIds;
+
+ @Schema(description = "鑷姩鐢熸垚鐨勫敮涓�涓�琛屾槑缁嗙殑璐圭敤璇存槑", example = "璇鹃銆擷X鐮旂┒銆曠涓�鏈熺粡璐规嫧娆�")
+ private String expenseDescription;
+
+}
diff --git a/yudao-module-finance/pom.xml b/yudao-module-finance/pom.xml
index 84b461d..a9eaef4 100644
--- a/yudao-module-finance/pom.xml
+++ b/yudao-module-finance/pom.xml
@@ -19,6 +19,12 @@
<dependencies>
<dependency>
<groupId>cn.iocoder.boot</groupId>
+ <artifactId>yudao-module-finance-api</artifactId>
+ <version>${revision}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>cn.iocoder.boot</groupId>
<artifactId>yudao-module-system</artifactId>
<version>${revision}</version>
</dependency>
diff --git a/yudao-module-finance/src/main/java/cn/iocoder/yudao/module/finance/api/reimbursement/FinanceReimbursementApiImpl.java b/yudao-module-finance/src/main/java/cn/iocoder/yudao/module/finance/api/reimbursement/FinanceReimbursementApiImpl.java
new file mode 100644
index 0000000..3374c68
--- /dev/null
+++ b/yudao-module-finance/src/main/java/cn/iocoder/yudao/module/finance/api/reimbursement/FinanceReimbursementApiImpl.java
@@ -0,0 +1,133 @@
+package cn.iocoder.yudao.module.finance.api.reimbursement;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.finance.api.reimbursement.dto.FinanceReimbursementCreateReqDTO;
+import cn.iocoder.yudao.module.finance.api.reimbursement.dto.FinanceReimbursementRespDTO;
+import cn.iocoder.yudao.module.finance.api.reimbursement.dto.FinanceReimbursementUpdateReqDTO;
+import cn.iocoder.yudao.module.finance.controller.admin.reimbursement.vo.FinanceReimbursementSaveReqVO;
+import cn.iocoder.yudao.module.finance.controller.admin.reimbursement.vo.item.FinanceReimbursementItemSaveReqVO;
+import cn.iocoder.yudao.module.finance.dal.dataobject.reimbursement.FinanceReimbursementDO;
+import cn.iocoder.yudao.module.finance.service.reimbursement.FinanceReimbursementService;
+import jakarta.annotation.Resource;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
+import static cn.iocoder.yudao.module.finance.enums.ErrorCodeConstants.*;
+
+/**
+ * 璐㈠姟鎶ラ攢鍗� API 瀹炵幇绫�
+ *
+ * 渚涘叾浠栨ā鍧楋紙璇鹃绠$悊缁忚垂鎷ㄤ粯锛変互銆岃嚜鍔ㄥ缓鍗� + 鑷姩鎻愪氦瀹℃壒銆嶇殑鏂瑰紡钀戒竴寮犺储鍔℃姤閿�鍗曪紝
+ * 鏄庣粏鐢辩郴缁熷浐瀹氱敓鎴� 1 琛岋紙璐圭敤绫诲瀷=鍏朵粬锛夛紝鍙戠エ閲戦鍙栨姤閿�鎬婚噾棰濄��
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+@RestController
+@RequestMapping(FinanceReimbursementApi.PREFIX)
+@Validated
+public class FinanceReimbursementApiImpl implements FinanceReimbursementApi {
+
+ /** 璐圭敤绫诲瀷锛氬叾浠栵紙瀛楀吀 finance_expense_type锛�1-宸梾 2-鍔炲叕 3-鎷涘緟 4-浜ら�� 5-鍏朵粬锛� */
+ private static final Integer EXPENSE_TYPE_OTHER = 5;
+
+ @Resource
+ private FinanceReimbursementService reimbursementService;
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public CommonResult<Long> createReimbursementAndSubmit(FinanceReimbursementCreateReqDTO reqDTO) {
+ // 1. 鍏堣В鏋愬彲鐢ㄧ殑鎶ラ攢瀹℃壒娴佺▼锛氭病鏈夊凡鍙戝竷娴佺▼鏃剁洿鎺ュけ璐ワ紝閬垮厤鐣欎笅鏃犳硶鎻愪氦鐨勫鍎胯崏绋垮崟
+ String processDefinitionKey = resolveApproveProcessDefinitionKey();
+
+ // 2. 鍒涘缓鎶ラ攢鍗曪紙1 琛屾槑缁嗭級
+ FinanceReimbursementSaveReqVO createReqVO = buildSaveReqVO(null, reqDTO.getTitle(),
+ reqDTO.getTotalAmount(), reqDTO.getApplyDate(), reqDTO.getRemark(),
+ reqDTO.getBlobIds(), reqDTO.getExpenseDescription());
+ Long reimbursementId = reimbursementService.createReimbursement(createReqVO);
+
+ // 3. 绔嬪嵆鎻愪氦瀹℃壒
+ Long applicantId = reqDTO.getApplicantId() != null ? reqDTO.getApplicantId() : getLoginUserId();
+ reimbursementService.submitReimbursement(reimbursementId, processDefinitionKey, applicantId);
+
+ return success(reimbursementId);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public CommonResult<Boolean> updateReimbursementAndResubmit(FinanceReimbursementUpdateReqDTO reqDTO) {
+ // 1. 鍏堣В鏋愬彲鐢ㄧ殑鎶ラ攢瀹℃壒娴佺▼
+ String processDefinitionKey = resolveApproveProcessDefinitionKey();
+
+ // 2. 淇敼鎶ラ攢鍗曪紙鏄庣粏閲嶅缓涓� 1 琛岋級
+ FinanceReimbursementSaveReqVO updateReqVO = buildSaveReqVO(reqDTO.getReimbursementId(),
+ reqDTO.getTitle(), reqDTO.getTotalAmount(), reqDTO.getApplyDate(), reqDTO.getRemark(),
+ reqDTO.getBlobIds(), reqDTO.getExpenseDescription());
+ reimbursementService.updateReimbursement(updateReqVO);
+
+ // 3. 閲嶆柊鎻愪氦瀹℃壒
+ reimbursementService.submitReimbursement(reqDTO.getReimbursementId(), processDefinitionKey, getLoginUserId());
+
+ return success(true);
+ }
+
+ @Override
+ public CommonResult<Boolean> deleteReimbursement(Long reimbursementId) {
+ reimbursementService.deleteReimbursement(reimbursementId);
+ return success(true);
+ }
+
+ @Override
+ public CommonResult<FinanceReimbursementRespDTO> getReimbursement(Long reimbursementId) {
+ // 鎶ラ攢鍗曚笉瀛樺湪鏃惰繑鍥� null锛岀敱璋冪敤鏂瑰喅瀹氬浣曞鐞嗭紙璇鹃渚ф嵁姝ゅ蹇嶈鐩存帴鍒犻櫎鐨勬姤閿�鍗曪級
+ FinanceReimbursementDO reimbursement = reimbursementService.getReimbursement(reimbursementId);
+ return success(BeanUtils.toBean(reimbursement, FinanceReimbursementRespDTO.class));
+ }
+
+ // ==================== 鍐呴儴鏂规硶 ====================
+
+ /**
+ * 瑙f瀽鎶ラ攢瀹℃壒鍒嗙被涓嬪彲鐢ㄧ殑娴佺▼瀹氫箟 key锛涘垎绫讳笅娌℃湁宸插彂甯冪殑娴佺▼鏃舵姏鍑哄彲鎵ц鐨勭簿纭彁绀�
+ */
+ private String resolveApproveProcessDefinitionKey() {
+ List<Map<String, Object>> definitionList = reimbursementService.getReimbursementApproveProcessDefinitionList();
+ if (CollUtil.isEmpty(definitionList)) {
+ throw exception(REIMBURSEMENT_BPM_PROCESS_DEFINITION_NOT_EXISTS);
+ }
+ return String.valueOf(definitionList.get(0).get("key"));
+ }
+
+ /** 缁勮鎶ラ攢鍗曚繚瀛� VO锛氭槑缁嗗浐瀹� 1 琛岋紝璐圭敤绫诲瀷銆屽叾浠栥�嶏紝鍙戠エ閲戦=鎶ラ攢鎬婚噾棰� */
+ private FinanceReimbursementSaveReqVO buildSaveReqVO(Long id, String title, BigDecimal totalAmount,
+ LocalDate applyDate, String remark, List<Long> blobIds,
+ String expenseDescription) {
+ FinanceReimbursementItemSaveReqVO item = new FinanceReimbursementItemSaveReqVO();
+ item.setExpenseType(EXPENSE_TYPE_OTHER);
+ item.setInvoiceAmount(totalAmount);
+ item.setInvoiceDate(applyDate);
+ item.setDescription(expenseDescription);
+
+ FinanceReimbursementSaveReqVO reqVO = new FinanceReimbursementSaveReqVO();
+ reqVO.setId(id);
+ reqVO.setTitle(title);
+ reqVO.setTotalAmount(totalAmount);
+ reqVO.setApplyDate(applyDate != null ? applyDate : LocalDate.now());
+ reqVO.setRemark(remark);
+ reqVO.setBlobIds(blobIds);
+ reqVO.setItems(Collections.singletonList(item));
+ return reqVO;
+ }
+
+}
diff --git a/yudao-module-finance/src/main/java/cn/iocoder/yudao/module/finance/enums/ErrorCodeConstants.java b/yudao-module-finance/src/main/java/cn/iocoder/yudao/module/finance/enums/ErrorCodeConstants.java
index cc2392c..24fd0cb 100644
--- a/yudao-module-finance/src/main/java/cn/iocoder/yudao/module/finance/enums/ErrorCodeConstants.java
+++ b/yudao-module-finance/src/main/java/cn/iocoder/yudao/module/finance/enums/ErrorCodeConstants.java
@@ -19,7 +19,7 @@
ErrorCode REIMBURSEMENT_ARCHIVE_FAIL_STATUS = new ErrorCode(1_030_107_006, "褰掓。澶辫触锛屽彧鏈夊凡閫氳繃鐘舵�佺殑鎶ラ攢鍗曟墠鑳藉綊妗�");
ErrorCode REIMBURSEMENT_UPDATE_AUDIT_STATUS_FAIL_NOT_PROCESS = new ErrorCode(1_030_107_007, "鏇存柊瀹℃壒鐘舵�佸け璐ワ紝鍙湁瀹℃壒涓殑鎶ラ攢鍗曟墠鑳芥洿鏂�");
ErrorCode REIMBURSEMENT_BPM_CATEGORY_NOT_EXISTS = new ErrorCode(1_030_107_008, "鎶ラ攢瀹℃壒鍒嗙被涓嶅瓨鍦紝璇峰厛鍦˙PM妯″潡鍒涘缓鎶ラ攢瀹℃壒娴佺▼鍒嗙被");
- ErrorCode REIMBURSEMENT_BPM_PROCESS_DEFINITION_NOT_EXISTS = new ErrorCode(1_030_107_009, "鎶ラ攢瀹℃壒鍒嗙被涓嬫病鏈夊彲鐢ㄧ殑娴佺▼妯″瀷锛岃鍏堝垱寤哄苟鍙戝竷娴佺▼");
+ ErrorCode REIMBURSEMENT_BPM_PROCESS_DEFINITION_NOT_EXISTS = new ErrorCode(1_030_107_009, "鎶ラ攢瀹℃壒鍒嗙被锛坒inance_reimbursement_approve锛変笅娌℃湁宸插彂甯冪殑娴佺▼锛屾棤娉曟彁浜ゆ姤閿�瀹℃壒銆傝鍏堝湪銆孊PM 鈫� 娴佺▼瀹氫箟銆嶄腑鍒涘缓骞跺彂甯冩姤閿�瀹℃壒娴佺▼鍚庨噸璇�");
ErrorCode REIMBURSEMENT_CUSTOM_NO_EXISTS = new ErrorCode(1_030_107_010, "鎶ラ攢鍗曞彿({})宸茶鍏朵粬鎶ラ攢鍗曚娇鐢紝璇锋洿鎹㈠叾浠栧崟鍙凤紝鎴栨竻绌鸿瀛楁鐢辩郴缁熻嚜鍔ㄧ敓鎴�");
ErrorCode REIMBURSEMENT_CUSTOM_NO_INVALID = new ErrorCode(1_030_107_011, "鎶ラ攢鍗曞彿({})涓棿涓嶈兘鍖呭惈绌烘牸锛岃鍘绘帀绌烘牸鍚庨噸鏂拌緭鍏ワ紝鎴栨竻绌鸿瀛楁鐢辩郴缁熻嚜鍔ㄧ敓鎴�");
diff --git a/yudao-module-research/pom.xml b/yudao-module-research/pom.xml
index 8673170..d557f4c 100644
--- a/yudao-module-research/pom.xml
+++ b/yudao-module-research/pom.xml
@@ -37,6 +37,13 @@
<version>${revision}</version>
</dependency>
+ <!-- 璐㈠姟妯″潡 API锛堢粡璐规嫧浠樿嚜鍔ㄧ敓鎴愬苟鎻愪氦璐㈠姟鎶ラ攢鍗曪級 -->
+ <dependency>
+ <groupId>cn.iocoder.boot</groupId>
+ <artifactId>yudao-module-finance-api</artifactId>
+ <version>${revision}</version>
+ </dependency>
+
<!-- Web 鐩稿叧 -->
<dependency>
<groupId>cn.iocoder.boot</groupId>
diff --git a/yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/controller/admin/fund/vo/ResearchFundRecordRespVO.java b/yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/controller/admin/fund/vo/ResearchFundRecordRespVO.java
index 7eda6ca..981e88d 100644
--- a/yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/controller/admin/fund/vo/ResearchFundRecordRespVO.java
+++ b/yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/controller/admin/fund/vo/ResearchFundRecordRespVO.java
@@ -31,9 +31,21 @@
@Schema(description = "鏀舵鍗曚綅/璐︽埛鍚�", example = "XX澶у")
private String payee;
- @Schema(description = "鐘舵�侊細0-寰呮嫧浠� 20-宸叉嫧浠�", example = "20")
+ @Schema(description = "鐘舵�侊細0-寰呮嫧浠� 15-鎶ラ攢瀹℃壒涓� 20-宸叉嫧浠� 30-宸查┏鍥�", example = "20")
private Integer status;
+ @Schema(description = "鍏宠仈璐㈠姟鎶ラ攢鍗� ID", example = "1")
+ private Long reimbursementId;
+
+ @Schema(description = "鍏宠仈璐㈠姟鎶ラ攢鍗曞彿", example = "BX20260928000001")
+ private String reimbursementNo;
+
+ @Schema(description = "璐㈠姟鎶ラ攢椹冲洖鍘熷洜")
+ private String rejectReason;
+
+ @Schema(description = "璐㈠姟鎶ラ攢椹冲洖鏃堕棿")
+ private LocalDateTime rejectTime;
+
@Schema(description = "澶囨敞")
private String remark;
diff --git a/yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/controller/admin/fund/vo/ResearchFundRecordSaveReqVO.java b/yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/controller/admin/fund/vo/ResearchFundRecordSaveReqVO.java
index 4a47004..55c1cb8 100644
--- a/yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/controller/admin/fund/vo/ResearchFundRecordSaveReqVO.java
+++ b/yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/controller/admin/fund/vo/ResearchFundRecordSaveReqVO.java
@@ -38,10 +38,6 @@
@Schema(description = "鏀舵鍗曚綅/璐︽埛鍚�", example = "XX澶у")
private String payee;
- @Schema(description = "鐘舵�侊細0-寰呮嫧浠� 20-宸叉嫧浠�", requiredMode = Schema.RequiredMode.REQUIRED, example = "20")
- @NotNull(message = "鎷ㄤ粯鐘舵�佷笉鑳戒负绌�")
- private Integer status;
-
@Schema(description = "澶囨敞")
private String remark;
diff --git a/yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/dal/dataobject/fund/ResearchFundRecordDO.java b/yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/dal/dataobject/fund/ResearchFundRecordDO.java
index f73073f..1d91656 100644
--- a/yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/dal/dataobject/fund/ResearchFundRecordDO.java
+++ b/yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/dal/dataobject/fund/ResearchFundRecordDO.java
@@ -8,6 +8,7 @@
import java.math.BigDecimal;
import java.time.LocalDate;
+import java.time.LocalDateTime;
/**
* 璇鹃-缁忚垂鎷ㄤ粯璁板綍 DO
@@ -42,9 +43,21 @@
/** 鏀舵鍗曚綅/璐︽埛鍚� */
private String payee;
- /** 鐘舵�侊細0-寰呮嫧浠� 20-宸叉嫧浠� */
+ /** 鐘舵�侊細0-寰呮嫧浠� 15-鎶ラ攢瀹℃壒涓� 20-宸叉嫧浠� 30-宸查┏鍥� */
private Integer status;
+ /** 鍏宠仈璐㈠姟鎶ラ攢鍗� ID锛坒inance_reimbursement.id锛� */
+ private Long reimbursementId;
+
+ /** 鍏宠仈璐㈠姟鎶ラ攢鍗曞彿 */
+ private String reimbursementNo;
+
+ /** 璐㈠姟鎶ラ攢椹冲洖鍘熷洜锛圔PM 鍥炲啓锛� */
+ private String rejectReason;
+
+ /** 璐㈠姟鎶ラ攢椹冲洖鏃堕棿锛圔PM 鍥炲啓锛� */
+ private LocalDateTime rejectTime;
+
/** 澶囨敞 */
private String remark;
diff --git a/yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/dal/mysql/fund/ResearchFundRecordMapper.java b/yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/dal/mysql/fund/ResearchFundRecordMapper.java
index 74727a2..f54a4fb 100644
--- a/yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/dal/mysql/fund/ResearchFundRecordMapper.java
+++ b/yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/dal/mysql/fund/ResearchFundRecordMapper.java
@@ -13,4 +13,8 @@
return selectList(ResearchFundRecordDO::getApplicationId, applicationId);
}
+ default ResearchFundRecordDO selectByReimbursementId(Long reimbursementId) {
+ return selectOne(ResearchFundRecordDO::getReimbursementId, reimbursementId);
+ }
+
}
diff --git a/yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/enums/ErrorCodeConstants.java b/yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/enums/ErrorCodeConstants.java
index 3d646ce..143c2e5 100644
--- a/yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/enums/ErrorCodeConstants.java
+++ b/yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/enums/ErrorCodeConstants.java
@@ -46,8 +46,10 @@
ErrorCode FUND_NOT_EXISTS = new ErrorCode(1_030_109_300, "缁忚垂鎷ㄤ粯璁板綍涓嶅瓨鍦�");
ErrorCode FUND_RECORD_FAIL_STATUS = new ErrorCode(1_030_109_301, "鐧昏澶辫触锛氳棰樼敵鎶ヤ功({})褰撳墠鐘舵�佷负銆攞}銆曪紝鍙湁宸茬珛椤圭殑璇鹃鎵嶈兘鐧昏缁忚垂鎷ㄤ粯");
ErrorCode FUND_AMOUNT_EXCEEDED = new ErrorCode(1_030_109_302, "鐧昏澶辫触锛氭湰娆℃嫧浠� {} 鍏冿紝宸茬櫥璁� {} 鍏冿紝鍚堣 {} 鍏冿紝瓒呭嚭璇ヨ棰樼敵璇烽绠� {} 鍏冿紝璇疯皟浣庢湰娆℃嫧浠橀噾棰�");
- ErrorCode FUND_VOUCHER_REQUIRED = new ErrorCode(1_030_109_303, "鐧昏澶辫触锛氱姸鎬佷负銆屽凡鎷ㄤ粯銆嶆椂蹇呴』涓婁紶鍑瘉闄勪欢锛岃鍏堜笂浼犲嚟璇侀檮浠跺悗鍐嶄繚瀛�");
- ErrorCode FUND_UPDATE_FAIL_STATUS = new ErrorCode(1_030_109_304, "鏇存柊澶辫触锛氱粡璐规嫧浠樿褰�({})褰撳墠鐘舵�佷负銆攞}銆曪紝鍙湁寰呮嫧浠樼姸鎬佹墠鑳戒慨鏀�");
- ErrorCode FUND_DELETE_FAIL_STATUS = new ErrorCode(1_030_109_305, "鍒犻櫎澶辫触锛氱粡璐规嫧浠樿褰�({})褰撳墠鐘舵�佷负銆攞}銆曪紝鍙湁寰呮嫧浠樼姸鎬佹墠鑳藉垹闄�");
+ ErrorCode FUND_VOUCHER_REQUIRED = new ErrorCode(1_030_109_303, "鐧昏鎷ㄦ澶辫触锛氭湰娆$櫥璁扮殑銆攞}銆曟湭涓婁紶鎷ㄤ粯鍑瘉闄勪欢銆傚嚟璇侀渶闅忚嚜鍔ㄧ敓鎴愮殑璐㈠姟鎶ラ攢鍗曚竴璧烽�佷氦璐㈠姟瀹℃壒锛岃鍏堜笂浼犳嫧浠樺嚟璇佸悗鍐嶄繚瀛�");
+ ErrorCode FUND_UPDATE_FAIL_STATUS = new ErrorCode(1_030_109_304, "鏇存柊澶辫触锛氱粡璐规嫧浠樿褰�({})褰撳墠鐘舵�佷负銆攞}銆曪紝鍙湁銆屽緟鎷ㄤ粯銆嶆垨銆屽凡椹冲洖銆嶇姸鎬佹墠鑳戒慨鏀瑰苟閲嶆柊鍙戣捣鎶ラ攢锛涖�屾姤閿�瀹℃壒涓�嶈鍏堝湪璐㈠姟绔挙鍥烇紝鎴栫瓑寰呰储鍔″鎵圭粨鏋�");
+ ErrorCode FUND_DELETE_FAIL_STATUS = new ErrorCode(1_030_109_305, "鍒犻櫎澶辫触锛氱粡璐规嫧浠樿褰�({})褰撳墠鐘舵�佷负銆攞}銆曪紝鍙湁銆屽緟鎷ㄤ粯銆嶇姸鎬佹墠鑳藉垹闄わ紱銆屾姤閿�瀹℃壒涓�嶈鍏堝湪璐㈠姟绔挙鍥烇紝宸查┏鍥炵殑璁板綍璇锋敼涓恒�屼慨鏀瑰苟閲嶆柊鍙戣捣鎶ラ攢銆�");
+ ErrorCode FUND_REIMBURSEMENT_NOT_EXISTS = new ErrorCode(1_030_109_306, "缁忚垂鎷ㄤ粯璁板綍({})鍏宠仈鐨勮储鍔℃姤閿�鍗�(ID={})宸蹭笉瀛樺湪锛堝彲鑳藉凡琚垹闄わ級锛岃鍒犻櫎鏈潯鎷ㄦ璁板綍鍚庨噸鏂扮櫥璁�");
+ ErrorCode FUND_REIMBURSEMENT_STATUS_CHANGED = new ErrorCode(1_030_109_307, "閲嶆柊鍙戣捣鎶ラ攢澶辫触锛氬叧鑱旂殑璐㈠姟鎶ラ攢鍗�({})褰撳墠鐘舵�佷负銆攞}銆曪紝鍙湁銆岃崏绋裤�嶆垨銆屽凡椹冲洖銆嶇殑鎶ラ攢鍗曟墠鑳介噸鏂版彁浜わ紝璇疯仈绯昏储鍔$‘璁よ鍗曟嵁鐘舵��");
}
diff --git a/yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/enums/ResearchFundStatusEnum.java b/yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/enums/ResearchFundStatusEnum.java
index 6bdd6e6..634768a 100644
--- a/yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/enums/ResearchFundStatusEnum.java
+++ b/yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/enums/ResearchFundStatusEnum.java
@@ -14,7 +14,9 @@
public enum ResearchFundStatusEnum {
PENDING(0, "寰呮嫧浠�"),
+ APPROVING(15, "鎶ラ攢瀹℃壒涓�"),
PAID(20, "宸叉嫧浠�"),
+ REJECTED(30, "宸查┏鍥�"),
;
private final Integer status;
diff --git a/yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/service/fund/ResearchFundRecordService.java b/yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/service/fund/ResearchFundRecordService.java
index 3673f38..f7ea66b 100644
--- a/yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/service/fund/ResearchFundRecordService.java
+++ b/yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/service/fund/ResearchFundRecordService.java
@@ -17,4 +17,13 @@
/** 鏌愯棰樼敵鎶ヤ功涓嬬殑鍏ㄩ儴缁忚垂鎷ㄤ粯璁板綍锛堟寜鍒涘缓鏃堕棿鍊掑簭锛� */
List<ResearchFundRecordDO> getFundRecordListByApplicationId(Long applicationId);
+ /**
+ * 璐㈠姟鎶ラ攢瀹℃壒缁撴灉鍥炲啓鍙拌处鐘舵��
+ *
+ * @param reimbursementId 璐㈠姟鎶ラ攢鍗曠紪鍙�
+ * @param bpmStatus BPM 瀹℃壒缁撴灉锛圔pmTaskStatusEnum锛�
+ * @param reason 椹冲洖鍘熷洜
+ */
+ void updateFundStatusByReimbursement(Long reimbursementId, Integer bpmStatus, String reason);
+
}
diff --git a/yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/service/fund/ResearchFundRecordServiceImpl.java b/yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/service/fund/ResearchFundRecordServiceImpl.java
index c1189bd..60fcd7b 100644
--- a/yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/service/fund/ResearchFundRecordServiceImpl.java
+++ b/yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/service/fund/ResearchFundRecordServiceImpl.java
@@ -1,7 +1,13 @@
package cn.iocoder.yudao.module.research.service.fund;
import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
+import cn.iocoder.yudao.module.finance.api.reimbursement.FinanceReimbursementApi;
+import cn.iocoder.yudao.module.finance.api.reimbursement.dto.FinanceReimbursementCreateReqDTO;
+import cn.iocoder.yudao.module.finance.api.reimbursement.dto.FinanceReimbursementRespDTO;
+import cn.iocoder.yudao.module.finance.api.reimbursement.dto.FinanceReimbursementUpdateReqDTO;
import cn.iocoder.yudao.module.research.controller.admin.fund.vo.ResearchFundRecordSaveReqVO;
import cn.iocoder.yudao.module.research.dal.dataobject.application.ResearchApplicationDO;
import cn.iocoder.yudao.module.research.dal.dataobject.fund.ResearchFundRecordDO;
@@ -10,6 +16,7 @@
import cn.iocoder.yudao.module.research.enums.ResearchApplicationStatusEnum;
import cn.iocoder.yudao.module.research.enums.ResearchFundStatusEnum;
import cn.iocoder.yudao.module.system.api.storage.StorageAttachmentApi;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -17,16 +24,21 @@
import org.springframework.validation.annotation.Validated;
import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
import static cn.iocoder.yudao.module.research.enums.ErrorCodeConstants.*;
/**
* 缁忚垂鎷ㄤ粯璁板綍 Service 瀹炵幇绫�
*
- * 涓�鏈熷彧鍦ㄦ湰妯″潡鍐呰惤鍦版嫧娆捐褰曪紙鎵规/閲戦/鏃ユ湡/鏀舵鏂�/鍑瘉闄勪欢锛夛紝涓嶄笌璐㈠姟妯″潡鍚屾锛�
+ * 姣忔潯鎷ㄦ璁板綍閮戒細鑷姩鐢熸垚骞舵彁浜や竴寮犲搴旂殑璐㈠姟鎶ラ攢鍗曪紙1:1锛岄噾棰濅竴鑷达級锛�
+ * 鎶ラ攢鍗曞鎵圭粨鏋滅敱 {@code ResearchFundStatusListener} 鍥炲啓鏈彴璐︾姸鎬侊細
+ * 寰呮嫧浠�(0) 鈫� 鎶ラ攢瀹℃壒涓�(15) 鈫� 宸叉嫧浠�(20) / 宸查┏鍥�(30)锛涜储鍔$鎾ゅ洖鍒欓��鍥炲緟鎷ㄤ粯(0)銆�
* 绱鎷ㄤ粯閲戦浠ョ敵鎶ュ崟 budget_amount锛堢敵璇烽绠楋級涓轰笂闄愩��
*/
@Service
@@ -35,6 +47,9 @@
public class ResearchFundRecordServiceImpl implements ResearchFundRecordService {
public static final String FUND_RECORD_TYPE = "research_fund_record";
+
+ /** 璐㈠姟鎶ラ攢鍗曠姸鎬侊細鑽夌 */
+ private static final Integer FINANCE_STATUS_DRAFT = 0;
@Resource
private ResearchFundRecordMapper fundRecordMapper;
@@ -45,22 +60,50 @@
@Resource
private StorageAttachmentApi storageAttachmentApi;
+ @Resource
+ private FinanceReimbursementApi financeReimbursementApi;
+
@Override
@Transactional(rollbackFor = Exception.class)
public Long createFundRecord(ResearchFundRecordSaveReqVO createReqVO) {
ResearchApplicationDO application = validateApplicationApproved(createReqVO.getApplicationId());
- validateVoucherRequired(createReqVO);
+ validateVoucherRequired(createReqVO.getBlobIds(), createReqVO.getBatchName());
// 绱鏍¢獙锛氭柊鐧昏閲戦 + 璇ョ敵鎶ュ崟宸叉湁璁板綍閲戦锛屼笉寰楄秴杩囩敵璇烽绠�
- BigDecimal registered = sumAmount(fundRecordMapper.selectListByApplicationId(application.getId()), null);
+ List<ResearchFundRecordDO> existList = fundRecordMapper.selectListByApplicationId(application.getId());
+ BigDecimal registered = sumAmount(existList, null);
validateAmountNotExceeded(createReqVO.getAmount(), registered, application.getBudgetAmount());
+ // 1. 钀借棰樹晶鍙拌处锛堢姸鎬佸厛缃緟鎷ㄤ粯锛屾姤閿�鎻愪氦鎴愬姛鍚庢敼涓烘姤閿�瀹℃壒涓級
ResearchFundRecordDO fundRecord = BeanUtils.toBean(createReqVO, ResearchFundRecordDO.class,
in -> in.setId(null));
+ fundRecord.setStatus(ResearchFundStatusEnum.PENDING.getStatus());
fundRecordMapper.insert(fundRecord);
+ // 2. 鍑瘉闄勪欢鍚屾椂缁戝畾鍒拌棰樺彴璐︼紙璐㈠姟渚ф姤閿�鍗曠敱 finance 妯″潡鑷缁戝畾鍚屼竴鎵� blob锛�
storageAttachmentApi.bindAttachments("file", FUND_RECORD_TYPE,
fundRecord.getId(), createReqVO.getBlobIds());
+
+ // 3. 鑷姩鐢熸垚骞舵彁浜よ储鍔℃姤閿�鍗�
+ String title = buildReimbursementTitle(application, createReqVO, existList.size() + 1);
+ FinanceReimbursementCreateReqDTO reqDTO = new FinanceReimbursementCreateReqDTO();
+ reqDTO.setTitle(title);
+ reqDTO.setTotalAmount(createReqVO.getAmount());
+ reqDTO.setApplyDate(createReqVO.getPayDate() != null ? createReqVO.getPayDate() : LocalDate.now());
+ reqDTO.setRemark(createReqVO.getRemark());
+ reqDTO.setBlobIds(createReqVO.getBlobIds());
+ reqDTO.setExpenseDescription(title);
+ reqDTO.setApplicantId(getLoginUserId());
+ Long reimbursementId = financeReimbursementApi.createReimbursementAndSubmit(reqDTO).getCheckedData();
+ FinanceReimbursementRespDTO reimbursement =
+ financeReimbursementApi.getReimbursement(reimbursementId).getCheckedData();
+
+ // 4. 鍥炲啓璐㈠姟鎶ラ攢鍗曚俊鎭苟杩涘叆銆屾姤閿�瀹℃壒涓��
+ fundRecordMapper.updateById(new ResearchFundRecordDO()
+ .setId(fundRecord.getId())
+ .setStatus(ResearchFundStatusEnum.APPROVING.getStatus())
+ .setReimbursementId(reimbursementId)
+ .setReimbursementNo(reimbursement != null ? reimbursement.getNo() : null));
return fundRecord.getId();
}
@@ -68,21 +111,51 @@
@Transactional(rollbackFor = Exception.class)
public void updateFundRecord(ResearchFundRecordSaveReqVO updateReqVO) {
ResearchFundRecordDO exist = validateFundRecordExists(updateReqVO.getId());
- if (!ResearchFundStatusEnum.PENDING.getStatus().equals(exist.getStatus())) {
+ if (!isEditable(exist.getStatus())) {
throw exception(FUND_UPDATE_FAIL_STATUS,
exist.getId(), ResearchFundStatusEnum.nameOf(exist.getStatus()));
}
// 璁板綍褰掑睘鐢虫姤鍗曚笉鍙彉鏇达紝闃叉鎶婃嫧娆炬尓鍒板埆鐨勮棰樹笅
ResearchApplicationDO application = validateApplicationApproved(exist.getApplicationId());
- validateVoucherRequired(updateReqVO);
+ validateVoucherRequired(updateReqVO.getBlobIds(), updateReqVO.getBatchName());
- BigDecimal registered = sumAmount(fundRecordMapper.selectListByApplicationId(exist.getApplicationId()),
- exist.getId());
+ BigDecimal registered = sumAmount(
+ fundRecordMapper.selectListByApplicationId(exist.getApplicationId()), exist.getId());
validateAmountNotExceeded(updateReqVO.getAmount(), registered, application.getBudgetAmount());
- ResearchFundRecordDO updateObj = BeanUtils.toBean(updateReqVO, ResearchFundRecordDO.class);
- updateObj.setApplicationId(exist.getApplicationId());
- fundRecordMapper.updateById(updateObj);
+ // 1. 璐㈠姟渚т慨鏀规姤閿�鍗曞苟閲嶆柊鎻愪氦瀹℃壒锛堝厛鍋氾紝澶辫触鍒欒棰樹晶涓嶈惤浠讳綍鍙樻洿锛�
+ Long reimbursementId = exist.getReimbursementId();
+ if (reimbursementId == null) {
+ throw exception(FUND_REIMBURSEMENT_NOT_EXISTS, exist.getId(), "绌�");
+ }
+ FinanceReimbursementRespDTO reimbursement =
+ financeReimbursementApi.getReimbursement(reimbursementId).getCheckedData();
+ if (reimbursement == null) {
+ throw exception(FUND_REIMBURSEMENT_NOT_EXISTS, exist.getId(), reimbursementId);
+ }
+ String title = buildReimbursementTitle(application, updateReqVO, null);
+ FinanceReimbursementUpdateReqDTO reqDTO = new FinanceReimbursementUpdateReqDTO();
+ reqDTO.setReimbursementId(reimbursementId);
+ reqDTO.setTitle(title);
+ reqDTO.setTotalAmount(updateReqVO.getAmount());
+ reqDTO.setApplyDate(updateReqVO.getPayDate() != null ? updateReqVO.getPayDate() : LocalDate.now());
+ reqDTO.setRemark(updateReqVO.getRemark());
+ reqDTO.setBlobIds(updateReqVO.getBlobIds());
+ reqDTO.setExpenseDescription(title);
+ financeReimbursementApi.updateReimbursementAndResubmit(reqDTO).getCheckedData();
+
+ // 2. 鍥炲啓璇鹃渚у彴璐︼細娓呯┖椹冲洖淇℃伅锛屽洖鍒般�屾姤閿�瀹℃壒涓��
+ fundRecordMapper.update(null, new LambdaUpdateWrapper<ResearchFundRecordDO>()
+ .eq(ResearchFundRecordDO::getId, exist.getId())
+ .set(ResearchFundRecordDO::getBatchName, updateReqVO.getBatchName())
+ .set(ResearchFundRecordDO::getAmount, updateReqVO.getAmount())
+ .set(ResearchFundRecordDO::getPayDate, updateReqVO.getPayDate())
+ .set(ResearchFundRecordDO::getPayee, updateReqVO.getPayee())
+ .set(ResearchFundRecordDO::getRemark, updateReqVO.getRemark())
+ .set(ResearchFundRecordDO::getStatus, ResearchFundStatusEnum.APPROVING.getStatus())
+ .set(ResearchFundRecordDO::getReimbursementNo, reimbursement.getNo())
+ .set(ResearchFundRecordDO::getRejectReason, "")
+ .set(ResearchFundRecordDO::getRejectTime, null));
storageAttachmentApi.updateAttachments("file", FUND_RECORD_TYPE,
updateReqVO.getId(), updateReqVO.getBlobIds());
@@ -97,6 +170,20 @@
exist.getId(), ResearchFundStatusEnum.nameOf(exist.getStatus()));
}
+ // 鑱斿姩娓呯悊璐㈠姟渚ц崏绋挎姤閿�鍗曪紙宸茶璐㈠姟渚у垹闄ゆ椂鐩存帴璺宠繃锛�
+ Long reimbursementId = exist.getReimbursementId();
+ if (reimbursementId != null) {
+ FinanceReimbursementRespDTO reimbursement =
+ financeReimbursementApi.getReimbursement(reimbursementId).getCheckedData();
+ if (reimbursement != null && reimbursement.getStatus() != null) {
+ if (!FINANCE_STATUS_DRAFT.equals(reimbursement.getStatus())) {
+ throw exception(FUND_REIMBURSEMENT_STATUS_CHANGED,
+ reimbursement.getNo(), financeStatusName(reimbursement.getStatus()));
+ }
+ financeReimbursementApi.deleteReimbursement(reimbursementId);
+ }
+ }
+
fundRecordMapper.deleteById(id);
storageAttachmentApi.deleteAttachmentsByRecord(FUND_RECORD_TYPE, id);
}
@@ -106,7 +193,39 @@
return fundRecordMapper.selectListByApplicationId(applicationId);
}
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void updateFundStatusByReimbursement(Long reimbursementId, Integer bpmStatus, String reason) {
+ ResearchFundRecordDO fundRecord = fundRecordMapper.selectByReimbursementId(reimbursementId);
+ if (fundRecord == null) {
+ log.warn("[updateFundStatusByReimbursement] 鏈壘鍒板叧鑱旀姤閿�鍗�({})鐨勭粡璐规嫧浠樿褰�", reimbursementId);
+ return;
+ }
+
+ boolean rejected = BpmTaskStatusEnum.REJECT.getStatus().equals(bpmStatus);
+ LambdaUpdateWrapper<ResearchFundRecordDO> update = new LambdaUpdateWrapper<ResearchFundRecordDO>()
+ .eq(ResearchFundRecordDO::getId, fundRecord.getId());
+ if (BpmTaskStatusEnum.APPROVE.getStatus().equals(bpmStatus)) {
+ update.set(ResearchFundRecordDO::getStatus, ResearchFundStatusEnum.PAID.getStatus());
+ } else if (rejected) {
+ update.set(ResearchFundRecordDO::getStatus, ResearchFundStatusEnum.REJECTED.getStatus());
+ } else {
+ // 鎾ゅ洖/鍙栨秷锛氶��鍥炪�屽緟鎷ㄤ粯銆嶏紝渚涜棰樹晶淇敼鍚庨噸鏂板彂璧锋姤閿�
+ update.set(ResearchFundRecordDO::getStatus, ResearchFundStatusEnum.PENDING.getStatus());
+ }
+ update.set(ResearchFundRecordDO::getRejectReason,
+ rejected ? StrUtil.blankToDefault(reason, "璐㈠姟鏈~鍐欓┏鍥炲師鍥�") : "")
+ .set(ResearchFundRecordDO::getRejectTime, rejected ? LocalDateTime.now() : null);
+ fundRecordMapper.update(null, update);
+ }
+
// =================== 鍐呴儴鏂规硶 ===================
+
+ /** 鍙湁銆屽緟鎷ㄤ粯銆嶆垨銆屽凡椹冲洖銆嶇殑鍙拌处鎵嶈兘淇敼骞堕噸鏂板彂璧锋姤閿� */
+ private boolean isEditable(Integer status) {
+ return ResearchFundStatusEnum.PENDING.getStatus().equals(status)
+ || ResearchFundStatusEnum.REJECTED.getStatus().equals(status);
+ }
private ResearchFundRecordDO validateFundRecordExists(Long id) {
ResearchFundRecordDO fundRecord = fundRecordMapper.selectById(id);
@@ -129,12 +248,22 @@
return application;
}
- /** 鐘舵�佷负銆屽凡鎷ㄤ粯銆嶆椂蹇呴』涓婁紶鍑瘉闄勪欢 */
- private void validateVoucherRequired(ResearchFundRecordSaveReqVO reqVO) {
- if (ResearchFundStatusEnum.PAID.getStatus().equals(reqVO.getStatus())
- && CollUtil.isEmpty(reqVO.getBlobIds())) {
- throw exception(FUND_VOUCHER_REQUIRED);
+ /** 鐧昏涓庝慨鏀规嫧娆鹃兘蹇呴』涓婁紶鍑瘉锛氬嚟璇佷細闅忚嚜鍔ㄧ敓鎴愮殑璐㈠姟鎶ラ攢鍗曢�佷氦璐㈠姟瀹℃壒 */
+ private void validateVoucherRequired(List<Long> blobIds, String batchName) {
+ if (CollUtil.isEmpty(blobIds)) {
+ throw exception(FUND_VOUCHER_REQUIRED, StrUtil.isBlank(batchName) ? "鏈" : batchName);
}
+ }
+
+ /** 鎶ラ攢鍗曟爣棰橈細璇鹃銆旇棰樺悕銆曠涓�鏈熺粡璐规嫧娆� / 璇鹃銆旇棰樺悕銆曠2娆$粡璐规嫧娆� */
+ private String buildReimbursementTitle(ResearchApplicationDO application,
+ ResearchFundRecordSaveReqVO reqVO, Integer seq) {
+ String batch = reqVO.getBatchName();
+ if (StrUtil.isBlank(batch)) {
+ int no = seq != null ? seq : fundRecordMapper.selectListByApplicationId(application.getId()).size() + 1;
+ batch = "绗�" + no + "娆�";
+ }
+ return "璇鹃銆�" + application.getTitle() + "銆�" + batch + "缁忚垂鎷ㄦ";
}
/** 绱娴嚭鏍¢獙锛氭湰娆� + 宸茬櫥璁帮紙鎺掗櫎 excludeId 鑷韩锛変笉寰楄秴杩囩敵璇烽绠� */
@@ -159,4 +288,19 @@
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
+ /** 璐㈠姟鎶ラ攢鍗曠姸鎬佷腑鏂囧悕锛坒inance 妯″潡鏈澶栨毚闇茬姸鎬佹灇涓撅紝姝ゅ鎸夌姸鎬佸�艰浆鍙鏂囨锛� */
+ private String financeStatusName(Integer status) {
+ if (status == null) {
+ return "鏈煡";
+ }
+ return switch (status) {
+ case 0 -> "鑽夌";
+ case 15 -> "瀹℃壒涓�";
+ case 20 -> "宸查�氳繃";
+ case 35 -> "宸查┏鍥�";
+ case 40 -> "宸插綊妗�";
+ default -> String.valueOf(status);
+ };
+ }
+
}
diff --git a/yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/service/fund/listener/ResearchFundStatusListener.java b/yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/service/fund/listener/ResearchFundStatusListener.java
new file mode 100644
index 0000000..8729d0c
--- /dev/null
+++ b/yudao-module-research/src/main/java/cn/iocoder/yudao/module/research/service/fund/listener/ResearchFundStatusListener.java
@@ -0,0 +1,54 @@
+package cn.iocoder.yudao.module.research.service.fund.listener;
+
+import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent;
+import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener;
+import cn.iocoder.yudao.module.research.service.fund.ResearchFundRecordService;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+/**
+ * 缁忚垂鎷ㄤ粯鍙拌处鐘舵�佺洃鍚櫒
+ *
+ * 鐩戝惉璐㈠姟鎶ラ攢鍗曪紙finance_reimbursement_approve锛夌殑瀹℃壒缁撴灉锛屾妸缁撴灉鍥炲啓鍒拌棰樹晶鐨勭粡璐规嫧浠樺彴璐︼細
+ * 閫氳繃 鈫� 宸叉嫧浠�(20)锛涢┏鍥� 鈫� 宸查┏鍥�(30) + 椹冲洖鍘熷洜/鏃堕棿锛涙挙鍥炴垨鍙栨秷 鈫� 閫�鍥炲緟鎷ㄤ粯(0)銆�
+ * 涓� finance 妯″潡鑷繁鐨� FinanceReimbursementStatusListener 璁㈤槄鍚屼竴娴佺▼ key锛屼袱鑰呬簰涓嶅共鎵般��
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+@Component
+@Slf4j
+public class ResearchFundStatusListener extends BpmProcessInstanceStatusEventListener {
+
+ /** 璐㈠姟鎶ラ攢鍗曞鎵规祦绋嬪畾涔� Key */
+ private static final String PROCESS_DEFINITION_KEY = "finance_reimbursement_approve";
+
+ @Resource
+ private ResearchFundRecordService fundRecordService;
+
+ @Override
+ protected String getProcessDefinitionKey() {
+ return PROCESS_DEFINITION_KEY;
+ }
+
+ @Override
+ protected void onEvent(BpmProcessInstanceStatusEvent event) {
+ Long reimbursementId;
+ try {
+ reimbursementId = Long.parseLong(event.getBusinessKey());
+ } catch (NumberFormatException e) {
+ log.warn("[onEvent] businessKey({}) 涓嶆槸鏈夋晥鐨勮储鍔℃姤閿�鍗曠紪鍙�", event.getBusinessKey());
+ return;
+ }
+
+ log.info("[onEvent] 鏀跺埌璐㈠姟鎶ラ攢瀹℃壒浜嬩欢锛宺eimbursementId={}, status={}", reimbursementId, event.getStatus());
+
+ try {
+ fundRecordService.updateFundStatusByReimbursement(reimbursementId, event.getStatus(), event.getReason());
+ log.info("[onEvent] 缁忚垂鎷ㄤ粯鍙拌处(鎶ラ攢鍗� {}) 鐘舵�佹洿鏂板畬鎴�", reimbursementId);
+ } catch (Exception e) {
+ log.error("[onEvent] 鏇存柊缁忚垂鎷ㄤ粯鍙拌处鐘舵�佸け璐ワ紝reimbursementId={}", reimbursementId, e);
+ }
+ }
+
+}
--
Gitblit v1.9.3