feat(finance): 新增财务核算模块及 ERP 统计接口
- 新增会计科目树形管理(CRUD、编码唯一校验、父子循环检测)
- 新增记账凭证与分录,含借贷平衡校验与过账/作废流程
- 新增总账与明细账查询,按期间逐月汇总与逐条结转
- 新增固定资产与无形资产卡片,支持按月计提折旧与摊销
- 新增 ERP 财务统计 API,按月聚合已审核的收付款与购销金额
- 新增财务核算看板与财务报表,消费 ERP 统计数据
| | |
| | | ```text |
| | | docs/project-business/ |
| | | âââ index.html # å¯è§å页é¢ï¼åå»ç´æ¥æå¼ï¼file:// å³å¯ï¼æ é任使å¡ï¼ |
| | | âââ mermaid/ # 11 å¼ Mermaid ä¸å¡å¾ï¼æå¨æºï¼æ¹è¿éï¼ |
| | | âââ mermaid/ # 12 å¼ Mermaid ä¸å¡å¾ï¼æå¨æºï¼æ¹è¿éï¼ |
| | | âââ data/ # ä¸å¡æ°æ®ï¼æå¨æºï¼æ¹è¿éï¼ |
| | | â âââ business.json # 项ç®å
ä¿¡æ¯/ä¸å¡åé®/AIè½å/å¾
确认äºé¡¹ |
| | | â âââ modules.json # 12 个ä¸å¡æ¨¡åå®ä¹ |
| | | â âââ modules.json # 14 个ä¸å¡æ¨¡åå®ä¹ |
| | | â âââ objects.json # æ ¸å¿ä¸å¡å¯¹è±¡ï¼ä½ç¨/䏿¸¸/䏿¸¸/表åï¼ |
| | | â âââ flows.json # 7 æ¡æµç¨ï¼æè¦+æ¥éª¤+è§è²ï¼ |
| | | â âââ flows.json # 8 æ¡æµç¨ï¼æè¦+æ¥éª¤+è§è²ï¼ |
| | | â âââ roles.json # è§è²æé |
| | | âââ README.md |
| | | ``` |
| | |
| | | | 09-data-flow | è·¨æ¨¡åæ°æ®æµï¼åæ®çæãåæ®µå¸¦å
¥ãæ°éååãäºä»¶ï¼ | |
| | | | 10-business-object | æ ¸å¿ä¸å¡å¯¹è±¡ ERï¼åªå«ä¸å¡å¯¹è±¡ï¼éå
¨åºè¡¨ï¼ | |
| | | | 11-ai-business-flow | AI ä¸å¡é¾è·¯ï¼OCR/è´¨æ£å¤å®/åç±»é¢æµ/RAGï¼å« API ä¾èµï¼ | |
| | | | 12-finance-flow | ä¼è®¡æ ¸ç®ï¼ç§ç®å»ºè´¦âåè¯å½å
¥(åè´·å¹³è¡¡æ ¡éª)âè¿è´¦/ä½åºâæ»è´¦æç»è´¦âèµäº§ææ§æéâçæ¿åæ° ERP å·²å®¡æ ¸åæ® | |
| | | |
| | | å¾ä¸ç¶ææ°åå为æºç æä¸¾çå®å¼ï¼å¦å·¥å 0è稿/1已确认/2宿/3åæ¶ï¼ERP å®¡æ¹ 15审æ¹ä¸/20å·²å®¡æ ¸ï¼ã |
| | | |
| | |
| | | "frontend": "mom-pro2-beforeï¼Vue3 管çåå°ï¼åä»åºåæ¾ï¼åªè¯»åèï¼" |
| | | }, |
| | | "stats": { |
| | | "businessModules": 13, |
| | | "coreObjects": 48, |
| | | "documentFlows": 6, |
| | | "businessModules": 14, |
| | | "coreObjects": 53, |
| | | "documentFlows": 7, |
| | | "approvalListeners": 13, |
| | | "aiCapabilities": 8, |
| | | "wmBillTypes": 15 |
| | |
| | | "MesWmSnDO æ°å¢ç uuid åæ®µçæ/æ¶è´¹é»è¾æªå¨æ ¸å¿ Service ä¸ç¡®è®¤", |
| | | "转æ£ç³è¯·(hrm_regularize_application)ãå¹è®è¯ä¹¦çä»
æ SQL ä¸èååå§åï¼Java ä¾§ Service/Controller æªå®ç°", |
| | | "NCR å¤ç½®ç»æï¼è¿å·¥/éè´§ï¼æªååè§¦åæºåæ®ï¼ä»
å°è´¦è®°å½", |
| | | "MPS ç¶ææä¸¾ç¬ç«ç¼å·(0/1/2/3)ï¼ä¸éç¨åæ®å¸¸é(0/1/4/5)ä¸ä¸è´" |
| | | "MPS ç¶ææä¸¾ç¬ç«ç¼å·(0/1/2/3)ï¼ä¸éç¨åæ®å¸¸é(0/1/4/5)ä¸ä¸è´", |
| | | "è´¢å¡ç®¡çï¼ä¼è®¡æ ¸ç®ï¼æ¨¡å yudao-module-finance 代ç å·²è½å°ï¼ä½â èå/æéæªé
ç½®ï¼éèªè¡å¨èå管ç建 finance:* æéï¼â¡å»ºè¡¨ä¸åå
¸èæ¬æªåæ¥è¿ docs/sql/config_export_all_<æ¥æ>.sql é¶æ®µä¸ï¼æç°æåå¹¶èæ¬åå§åæ°åºä¼ç¼º fin_* è¡¨ä¸ 6 ç» finance_* åå
¸ãå¾
确认ã" |
| | | ], |
| | | "generatedAt": "2026-09-10", |
| | | "analysisBasis": "åºäº dev_business 忝 87bf4a99 æºç ï¼6 ç»å¹¶è¡æºç 走读ï¼MES ç产质é / MES ä»å¨ / ERP / CRM+SRM / å®å+HRM / AI+BI+MDM+BPM+åºåº§ï¼" |
| | |
| | | {"stage": "å¤å®", "action": "é®é¢å¤å®: ä¸è¬/ç»´ä¿®/éè´§ï¼ä¸¥é度 0-3", "roles": ["å®åå·¥ç¨å¸"]}, |
| | | {"stage": "ç»´ä¿®", "action": "ç°åº/è¿å/è¿ç¨ç»´ä¿®ï¼è´¹ç¨ä¸ç»æè®°å½ï¼å®æèå¨å·¥åå®ç»", "roles": ["维修工ç¨å¸"]}, |
| | | {"stage": "éè´§", "action": "éè´§ç³è¯·å®¡æ ¸âèªå¨å»º MES éå®éè´§å(RQC)âè´¨æ£/å
¥åºåè°â鿬¾åè°âå
³é", "roles": ["å®å", "è´¨æ£", "è´¢å¡"]}]}, |
| | | {"id": "finance", "name": "ä¼è®¡æ ¸ç®æµç¨", "mermaid": "mermaid/12-finance-flow.mmd", "color": "#3ec9a7", |
| | | "summary": "ç¬ç«æ ¸ç®æ¨¡å yudao-module-financeï¼ä¼è®¡ç§ç®å»ºè´¦ â è®°è´¦åè¯å½å
¥(åè´·å¹³è¡¡æ ¡éª) â è¿è´¦ â æ»è´¦/æç»è´¦ â èµäº§è®¡æææ§ä¸æé â è´¢å¡æ¥è¡¨çæ¿åæ° ERP å·²å®¡æ ¸åæ®ã", |
| | | "steps": [ |
| | | {"stage": "建账", "action": "ç»´æ¤ä¼è®¡ç§ç® tree(subjectCode å¯ä¸ï¼å¯å»ºä¸çº§)ï¼é¦æ¬¡å¯å¯¼å
¥çº¦ 68 æ¡ä¸çº§ç§ç®ç§å", "roles": ["ä¼è®¡"]}, |
| | | {"stage": "è®°è´¦", "action": "å½å
¥åè¯(åå·ç空èªå¨çæ)+åå½ï¼åå½éè¡éç§ç®å¹¶å¡«å/è´·ï¼æ ¡éªè³å°ä¸è¡ãåè´·é½ä¸å¾åæ¶å¤§äº0ãå计ç¸çä¸å¤§äº0", "roles": ["ä¼è®¡"]}, |
| | | {"stage": "è¿è´¦", "action": "æªè¿è´¦0 â post è¿è´¦ â å·²è¿è´¦10(ä¸å¯åä¿®æ¹)ï¼æªè¿è´¦0 æ å·²è¿è´¦10 åå¯ cancel ä½åº â å·²ä½åº20", "roles": ["ä¼è®¡", "è´¢å¡ä¸»ç®¡"]}, |
| | | {"stage": "æ¥è´¦", "action": "æ»è´¦ææé´éææ±æ»ãæç»è´¦éæ¡åå½å¹¶ç»è½¬ä½é¢ï¼ä¸¤è
åªç»è®¡å·²è¿è´¦10çåè¯ï¼å¹¶æ¯æå¯¼åº", "roles": ["ä¼è®¡", "è´¢å¡ä¸»ç®¡"]}, |
| | | {"stage": "èµäº§", "action": "åºå®èµäº§(1å¨ç¨/2é²ç½®/3ç»´ä¿®ä¸/4å·²æ¥åº)䏿 å½¢èµäº§(1å¨ç¨/2已失æ/3å·²æéå®)计æï¼ä¼ ids æéä¸è®¡æï¼ids 为空对å
¨é¨æªæ¥åº/æªå¤±æèµäº§è®¡æä¸ä¸ªæ", "roles": ["èµäº§ä¼è®¡"]}, |
| | | {"stage": "æ¥è¡¨", "action": "çæ¿æ±æ»èµäº§ä¸åè¯æ¶ç¹æ° + ç» ErpFinanceStatisticsApi å ERP å·²å®¡æ ¸æ¶è´§ä»æ¬¾ä¸è´ééé¢ï¼è¾åºæåº¦æ¶æ¯è¶å¿", "roles": ["è´¢å¡ä¸»ç®¡", "管çå±"]}]}, |
| | | {"id": "ai", "name": "AI ä¸å¡æµç¨", "mermaid": "mermaid/11-ai-business-flow.mmd", "color": "#56c8d8", |
| | | "summary": "ç»ä¸æ¨¡å¼ï¼ä¸å¡ä¾§æ¶éä¸ä¸æ(å¿
è¦æ¶è° MDM/SRM/CRM API ååç§°)âç»è£
Promptâchat/chatWithImageâè§£æ JSONâå端é¢å¡«æå»ºè®®ï¼æ Function Callingï¼RAG ç¥è¯åºå·²å»ºæä½ææ ä¸å¡æ¶è´¹ã", |
| | | "steps": [ |
| | |
| | | "roles": ["éè´å", "éå®å", "åºçº³", "ä¼è®¡"], |
| | | "upstream": ["CRM(åå)", "SRM(宿 )", "ä¸»æ°æ®"], "downstream": ["ç产(MPS)", "ä»å¨(æ¶å)"], |
| | | "coreTables": ["erp_purchase_request", "erp_purchase_order", "erp_purchase_invoice", "erp_finance_payment", "erp_sale_order", "erp_finance_receipt", "erp_account"]}, |
| | | {"key": "finance", "name": "è´¢å¡ç®¡çï¼ä¼è®¡æ ¸ç®ï¼", "color": "#3ec9a7", "tag": "FIN", "flow": "finance", |
| | | "positioning": "ç¬ç«æ ¸ç®æ¨¡åï¼ä¼è®¡æ ¸ç® + èµäº§æ ¸ç® + è´¢å¡æ¥è¡¨çæ¿ï¼ä¸ ERP è¿éåè´¢å¡åæ®å离ï¼yudao-module-financeï¼", |
| | | "problem": "è¿éååªç®¡åæ®ä¸ç®¡è´¦ï¼ç¼ºå°ä¼è®¡ç§ç®/åè¯/账簿ä¸èµäº§ææ§æéæ²æ·ï¼æ æ³åºè´¦è¡¨ä¸èµäº§åå¼", |
| | | "features": ["ä¼è®¡ç§ç®æ (约68æ¡ä¸çº§ç§ç®ç§å·å¯å»ºä¸çº§)", "è®°è´¦åè¯(åå·èªå¨çæÂ·åå½å贷平衡åå端åéæ ¡éª)", "åè¯ç¶ææº æªè¿è´¦0âè¿è´¦10/ä½åº20ï¼å·²è¿è´¦ä¸å¯æ¹", "æ»è´¦ææé´éææ±æ»", "æç»è´¦éæ¡åå½å¹¶ç»è½¬ä½é¢", "åºå®èµäº§+è®¡æææ§", "æ å½¢èµäº§+计ææé", "ä¼è®¡æ ¸ç®çæ¿(æ¶æ¯/èµäº§/åè¯/æåº¦è¶å¿)", "éä»¶èµ°ç³»ç»éä»¶ä¸å¿ recordType=fin_voucher"], |
| | | "objects": ["ä¼è®¡ç§ç®", "è®°è´¦åè¯", "åè¯åå½", "åºå®èµäº§", "æ å½¢èµäº§"], |
| | | "roles": ["ä¼è®¡", "è´¢å¡ä¸»ç®¡", "èµäº§ä¼è®¡", "管çå±"], |
| | | "upstream": ["è¿éå(ERP å·²å®¡æ ¸æ¶è´§/仿¬¾/è´éåæ®)"], "downstream": ["è´¢å¡æ¥è¡¨çæ¿", "BI 管ç驾驶è±"], |
| | | "coreTables": ["fin_account_subject", "fin_voucher", "fin_voucher_entry", "fin_fixed_asset", "fin_intangible_asset"]}, |
| | | {"key": "pro", "name": "ç产管ç", "color": "#e0b34f", "tag": "MES-PRO", "flow": "production", |
| | | "positioning": "ç产æ§è¡æ ¸å¿ï¼è®¡å-å·¥å-ä»»å¡-æ¥å·¥", |
| | | "problem": "订åå°è½¦é´æ§è¡çéå±æè§£ä¸è¿ç¨å¯æ§", |
| | |
| | | {"name": "éè´æ¥ç¥¨", "module": "è¿éå", "table": "erp_purchase_invoice", "doc": "FPDç¼å·ï¼AI OCR é¢å¡«ï¼ç´¯è®¡â¤è®¢åæ»ä»·ï¼ä»æ¬¾åçåç½®", "upstream": ["éè´è®¢å"], "downstream": ["仿¬¾å"], "keywords": "æ¥ç¥¨ å票 éè´å票"}, |
| | | {"name": "仿¬¾å", "module": "è´¢å¡", "table": "erp_finance_payment", "doc": "FKDç¼å·ï¼å¿
é¡»å
³èæ¥ç¥¨+éä»¶ï¼ç´¯è®¡â¤æ¥ç¥¨éé¢ï¼BPM 审æ¹", "upstream": ["éè´æ¥ç¥¨"], "downstream": ["ç»ç®è´¦æ·"], "keywords": "仿¬¾ åºä» payment"}, |
| | | {"name": "æ¶æ¬¾å", "module": "è´¢å¡", "table": "erp_finance_receipt", "doc": "SKDç¼å·ï¼å
³è CRM å®¢æ·æ ¡éªï¼æ BPM(æå¨å®¡æ ¸)", "upstream": ["éå®(å¼±å
³è)"], "downstream": ["ç»ç®è´¦æ·"], "keywords": "æ¶æ¬¾ åºæ¶ receipt"}, |
| | | {"name": "ä¼è®¡ç§ç®", "module": "ä¼è®¡æ ¸ç®", "table": "fin_account_subject", "doc": "ç§ç®æ ï¼parent_id èªå
³èï¼ç§ç®ç±»å1èµäº§2è´åº3æç4ææ¬5æçï¼ä½é¢æ¹å1å2è´·ï¼ç¶æ0å¯ç¨1ç¦ç¨ï¼è´¦è¡¨ä¸åå½ç»ä¸æ subject_code åæ°", "upstream": ["ä¼è®¡ç§ç®ç§å约68æ¡ä¸çº§ç§ç®"], "downstream": ["è®°è´¦åè¯åå½", "æ»è´¦", "æç»è´¦"], "keywords": "ä¼è®¡ç§ç® ç§ç® subject account èµäº§ç±» è´åºç±» æçç±»"}, |
| | | {"name": "è®°è´¦åè¯", "module": "ä¼è®¡æ ¸ç®", "table": "fin_voucher", "doc": "åè¯åå·å¯ç空ç±å端èªå¨çæï¼ç¶æ æªè¿è´¦0/å·²è¿è´¦10/å·²ä½åº20ï¼å·²è¿è´¦ä¸å¯æ¹ï¼æªè¿è´¦ä¸å·²è¿è´¦åå¯ä½åºï¼æªè¿è´¦ä¸å·²ä½åºå¯å é¤ï¼éä»¶æ recordType=fin_voucher æç³»ç»éä»¶ä¸å¿", "upstream": ["ä¼è®¡ç§ç®"], "downstream": ["æ»è´¦", "æç»è´¦", "è´¢å¡æ¥è¡¨çæ¿"], "keywords": "è®°è´¦åè¯ åè¯ voucher è¿è´¦ ä½åº å贷平衡"}, |
| | | {"name": "åè¯åå½", "module": "ä¼è®¡æ ¸ç®", "table": "fin_voucher_entry", "doc": "åè¯ä¸éè¡åå½ï¼ç§ç®ç¼ç +å/è´·éé¢+è¾
婿 ¸ç®(1客æ·2ä¾åºå3é¨é¨4åå·¥5项ç®)ï¼ä¸è¡ä¸å¯åè´·åæ¶å¤§äº0ï¼å
¨è¡¨åè´·å计å¿
é¡»ç¸çä¸å¤§äº0", "upstream": ["è®°è´¦åè¯", "ä¼è®¡ç§ç®"], "downstream": ["æ»è´¦", "æç»è´¦"], "keywords": "åè¯åå½ åå½ entry åæ¹ è´·æ¹ è¾
婿 ¸ç®"}, |
| | | {"name": "åºå®èµäº§", "module": "ä¼è®¡æ ¸ç®", "table": "fin_fixed_asset", "doc": "èµäº§å¡çï¼ç¶æ 1å¨ç¨/2é²ç½®/3ç»´ä¿®ä¸/4å·²æ¥åºï¼æææ§é¢=(åå¼Ã(1-æ®å¼ç))÷(å¹´éÃ12)ï¼ç´¯è®¡ææ§ä¸åå¼ç±è®¡æç´¯å ï¼ä¸æ¥æ¶åç«¯ä¼ å¼", "upstream": [], "downstream": ["è´¢å¡æ¥è¡¨çæ¿", "æ»è´¦"], "keywords": "åºå®èµäº§ ææ§ èµäº§å¡ç fixed asset æ®å¼ç"}, |
| | | {"name": "æ å½¢èµäº§", "module": "ä¼è®¡æ ¸ç®", "table": "fin_intangible_asset", "doc": "æ å½¢èµäº§å¡ç(è¯ä¹¦ç¼å·/æææ)ï¼ç¶æ 1å¨ç¨/2已失æ/3å·²æéå®ï¼ææéé¢=(åå¼Ã(1-æ®å¼ç))÷(æéå¹´éÃ12)ï¼ç´¯è®¡æéä¸åå¼ç±è®¡æç´¯å ", "upstream": [], "downstream": ["è´¢å¡æ¥è¡¨çæ¿", "æ»è´¦"], "keywords": "æ å½¢èµäº§ æé 软件è使 ä¸å© intangible æææ"}, |
| | | {"name": "éå®è®¢å", "module": "è¿éå", "table": "erp_sale_order", "doc": "XSDDç¼å·ï¼BPM 审æ¹ï¼éç产è¡èªå¨å»º MPSï¼åºåºç¶æ:æª0å·²é¢ç1é¨å2å
¨é¨3ï¼çäº§å®æäºä»¶åå", "upstream": ["åå"], "downstream": ["MPS", "åè´§éç¥", "éå®åºåº", "å®åå·¥å"], "keywords": "éå®è®¢å sale"}, |
| | | {"name": "主ç产计å", "module": "ç产", "table": "mes_pro_mps", "doc": "MPS计åï¼è稿0âå·²ä¸å1â宿2/åæ¶3ï¼å¯åå¹¶ä¸å", "upstream": ["éå®è®¢å"], "downstream": ["ç产工å"], "keywords": "MPS 主计å ç产计å"}, |
| | | {"name": "ç产工å", "module": "ç产", "table": "mes_pro_work_order", "doc": "è稿0â已确认1â宿2/åæ¶3ï¼ç¡®è®¤æ¶æå·¥èºè·¯çº¿çæä»»å¡ï¼æåä¸éå·¥åºæ¥å·¥ååå·²ç产æ°é", "upstream": ["MPS"], "downstream": ["ç产任å¡", "颿", "å®å·¥å
¥åº"], "keywords": "å·¥å ç产工å work order"}, |
| | |
| | | {"role": "è´¨æ£å", "modules": ["MES-QC"], "operations": ["IQC/IPQC/OQC/RQC æ£éª", "NCR è¯å®¡å¤ç½®"], "data": ["mes_qc_*"], "scope": "inspectorUserId å½å±"}, |
| | | {"role": "设å¤å/维修工", "modules": ["MES-DV"], "operations": ["ç¹æ£ä¿å
»", "维修工å", "å·¥è£
é¢ç¨"], "data": ["mes_dv_*", "mes_tm_*"], "scope": "chargeUserId å½å±"}, |
| | | {"role": "客æ/å®åå·¥ç¨å¸", "modules": ["å®å"], "operations": ["å·¥ååçæ´¾å·¥", "ç»´ä¿®", "éè´§ç³è¯·"], "data": ["after_sale_*"], "scope": "è¡çº§æ°æ®æéåè§å¾ï¼æè´è´£/æåä¸/ä¸å±è´è´£/å
¨é¨(aftersales:view-all)"}, |
| | | {"role": "è´¢å¡", "modules": ["ERP", "CRM"], "operations": ["æ¶æ¬¾å", "仿¬¾å", "å¼ç¥¨å®¡æ ¸", "ç»ç®è´¦æ·"], "data": ["erp_finance_*", "crm_invoice", "crm_receivable"], "scope": "financeUserId å½å±"}, |
| | | {"role": "è´¢å¡", "modules": ["ERP", "CRM", "FIN"], "operations": ["æ¶æ¬¾å", "仿¬¾å", "å¼ç¥¨å®¡æ ¸", "ç»ç®è´¦æ·", "ä¼è®¡ç§ç®ç»´æ¤", "è®°è´¦åè¯å½å
¥ä¸è¿è´¦/ä½åº", "æ»è´¦ä¸æç»è´¦æ¥è¯¢", "åºå®èµäº§ææ§è®¡æ", "æ å½¢èµäº§æé计æ", "ä¼è®¡æ ¸ç®çæ¿"], "data": ["erp_finance_*", "crm_invoice", "crm_receivable", "fin_account_subject", "fin_voucher", "fin_voucher_entry", "fin_fixed_asset", "fin_intangible_asset"], "scope": "financeUserId å½å±ï¼è´¢å¡æ ¸ç®æ¨¡åæ finance:* æ¥å£æé + system_menu ææï¼ææ æ°æ®æéåæ®µ"}, |
| | | {"role": "HR", "modules": ["HRM"], "operations": ["å工档æ¡å
¥è½¬è°ç¦»", "èå¤è§åæç", "èªé
¬æ ¸ç®åæ¾", "离è交æ¥"], "data": ["hrm_*"], "scope": "é¨é¨èå´ dataScope"}, |
| | | {"role": "管çå±", "modules": ["BI"], "operations": ["æ¥çéè´éå®/ä»åº/ç产设å¤/è´¨é/人åäºå¤§ä¸»é¢å¤§å±"], "data": ["bi_dashboard"], "scope": "åªè¯»"} |
| | | ] |
| | |
| | | <a data-t="flow-quality"><span class="dot" style="background:var(--c-qc)"></span>è´¨éæµç¨</a> |
| | | <a data-t="flow-warehouse"><span class="dot" style="background:var(--c-wm)"></span>ä»å¨æµç¨</a> |
| | | <a data-t="flow-aftersales"><span class="dot" style="background:var(--c-as)"></span>å®åæµç¨</a> |
| | | <a data-t="flow-finance"><span class="dot" style="background:var(--c-fin)"></span>ä¼è®¡æ ¸ç®</a> |
| | | <div class="group">ç»æä¸æ°æ®</div> |
| | | <a data-t="relation"><span class="dot" style="background:var(--c-bpm)"></span>ç³»ç»å
³ç³»</a> |
| | | <a data-t="dataflow"><span class="dot" style="background:var(--c-fin)"></span>æ°æ®æµ</a> |
| | |
| | | <section class="page" id="flow-quality"></section> |
| | | <section class="page" id="flow-warehouse"></section> |
| | | <section class="page" id="flow-aftersales"></section> |
| | | <section class="page" id="flow-finance"></section> |
| | | <section class="page" id="relation"> |
| | | <h2 class="pt">ç³»ç»å
³ç³»</h2> |
| | | <p class="desc">模åä¹é´çè°ç¨ä¸æ°æ®ä¾èµï¼å®çº¿=åæ®/æ°æ®æµåï¼è线=审æ¹åè°ä¸è¾
å©è½åã</p> |
| | |
| | | "frontend": "mom-pro2-beforeï¼Vue3 管çåå°ï¼åä»åºåæ¾ï¼åªè¯»åèï¼" |
| | | }, |
| | | "stats": { |
| | | "businessModules": 13, |
| | | "coreObjects": 48, |
| | | "documentFlows": 6, |
| | | "businessModules": 14, |
| | | "coreObjects": 53, |
| | | "documentFlows": 7, |
| | | "approvalListeners": 13, |
| | | "aiCapabilities": 8, |
| | | "wmBillTypes": 15 |
| | |
| | | "MesWmSnDO æ°å¢ç uuid åæ®µçæ/æ¶è´¹é»è¾æªå¨æ ¸å¿ Service ä¸ç¡®è®¤", |
| | | "转æ£ç³è¯·(hrm_regularize_application)ãå¹è®è¯ä¹¦çä»
æ SQL ä¸èååå§åï¼Java ä¾§ Service/Controller æªå®ç°", |
| | | "NCR å¤ç½®ç»æï¼è¿å·¥/éè´§ï¼æªååè§¦åæºåæ®ï¼ä»
å°è´¦è®°å½", |
| | | "MPS ç¶ææä¸¾ç¬ç«ç¼å·(0/1/2/3)ï¼ä¸éç¨åæ®å¸¸é(0/1/4/5)ä¸ä¸è´" |
| | | "MPS ç¶ææä¸¾ç¬ç«ç¼å·(0/1/2/3)ï¼ä¸éç¨åæ®å¸¸é(0/1/4/5)ä¸ä¸è´", |
| | | "è´¢å¡ç®¡çï¼ä¼è®¡æ ¸ç®ï¼æ¨¡å yudao-module-finance 代ç å·²è½å°ï¼ä½â èå/æéæªé
ç½®ï¼éèªè¡å¨èå管ç建 finance:* æéï¼â¡å»ºè¡¨ä¸åå
¸èæ¬æªåæ¥è¿ docs/sql/config_export_all_<æ¥æ>.sql é¶æ®µä¸ï¼æç°æåå¹¶èæ¬åå§åæ°åºä¼ç¼º fin_* è¡¨ä¸ 6 ç» finance_* åå
¸ãå¾
确认ã" |
| | | ], |
| | | "generatedAt": "2026-09-10", |
| | | "analysisBasis": "åºäº dev_business 忝 87bf4a99 æºç ï¼6 ç»å¹¶è¡æºç 走读ï¼MES ç产质é / MES ä»å¨ / ERP / CRM+SRM / å®å+HRM / AI+BI+MDM+BPM+åºåº§ï¼" |
| | |
| | | "roles": ["éè´å", "éå®å", "åºçº³", "ä¼è®¡"], |
| | | "upstream": ["CRM(åå)", "SRM(宿 )", "ä¸»æ°æ®"], "downstream": ["ç产(MPS)", "ä»å¨(æ¶å)"], |
| | | "coreTables": ["erp_purchase_request", "erp_purchase_order", "erp_purchase_invoice", "erp_finance_payment", "erp_sale_order", "erp_finance_receipt", "erp_account"]}, |
| | | {"key": "finance", "name": "è´¢å¡ç®¡çï¼ä¼è®¡æ ¸ç®ï¼", "color": "#3ec9a7", "tag": "FIN", "flow": "finance", |
| | | "positioning": "ç¬ç«æ ¸ç®æ¨¡åï¼ä¼è®¡æ ¸ç® + èµäº§æ ¸ç® + è´¢å¡æ¥è¡¨çæ¿ï¼ä¸ ERP è¿éåè´¢å¡åæ®å离ï¼yudao-module-financeï¼", |
| | | "problem": "è¿éååªç®¡åæ®ä¸ç®¡è´¦ï¼ç¼ºå°ä¼è®¡ç§ç®/åè¯/账簿ä¸èµäº§ææ§æéæ²æ·ï¼æ æ³åºè´¦è¡¨ä¸èµäº§åå¼", |
| | | "features": ["ä¼è®¡ç§ç®æ (约68æ¡ä¸çº§ç§ç®ç§å·å¯å»ºä¸çº§)", "è®°è´¦åè¯(åå·èªå¨çæÂ·åå½å贷平衡åå端åéæ ¡éª)", "åè¯ç¶ææº æªè¿è´¦0âè¿è´¦10/ä½åº20ï¼å·²è¿è´¦ä¸å¯æ¹", "æ»è´¦ææé´éææ±æ»", "æç»è´¦éæ¡åå½å¹¶ç»è½¬ä½é¢", "åºå®èµäº§+è®¡æææ§", "æ å½¢èµäº§+计ææé", "ä¼è®¡æ ¸ç®çæ¿(æ¶æ¯/èµäº§/åè¯/æåº¦è¶å¿)", "éä»¶èµ°ç³»ç»éä»¶ä¸å¿ recordType=fin_voucher"], |
| | | "objects": ["ä¼è®¡ç§ç®", "è®°è´¦åè¯", "åè¯åå½", "åºå®èµäº§", "æ å½¢èµäº§"], |
| | | "roles": ["ä¼è®¡", "è´¢å¡ä¸»ç®¡", "èµäº§ä¼è®¡", "管çå±"], |
| | | "upstream": ["è¿éå(ERP å·²å®¡æ ¸æ¶è´§/仿¬¾/è´éåæ®)"], "downstream": ["è´¢å¡æ¥è¡¨çæ¿", "BI 管ç驾驶è±"], |
| | | "coreTables": ["fin_account_subject", "fin_voucher", "fin_voucher_entry", "fin_fixed_asset", "fin_intangible_asset"]}, |
| | | {"key": "pro", "name": "ç产管ç", "color": "#e0b34f", "tag": "MES-PRO", "flow": "production", |
| | | "positioning": "ç产æ§è¡æ ¸å¿ï¼è®¡å-å·¥å-ä»»å¡-æ¥å·¥", |
| | | "problem": "订åå°è½¦é´æ§è¡çéå±æè§£ä¸è¿ç¨å¯æ§", |
| | |
| | | {"name": "éè´æ¥ç¥¨", "module": "è¿éå", "table": "erp_purchase_invoice", "doc": "FPDç¼å·ï¼AI OCR é¢å¡«ï¼ç´¯è®¡â¤è®¢åæ»ä»·ï¼ä»æ¬¾åçåç½®", "upstream": ["éè´è®¢å"], "downstream": ["仿¬¾å"], "keywords": "æ¥ç¥¨ å票 éè´å票"}, |
| | | {"name": "仿¬¾å", "module": "è´¢å¡", "table": "erp_finance_payment", "doc": "FKDç¼å·ï¼å¿
é¡»å
³èæ¥ç¥¨+éä»¶ï¼ç´¯è®¡â¤æ¥ç¥¨éé¢ï¼BPM 审æ¹", "upstream": ["éè´æ¥ç¥¨"], "downstream": ["ç»ç®è´¦æ·"], "keywords": "仿¬¾ åºä» payment"}, |
| | | {"name": "æ¶æ¬¾å", "module": "è´¢å¡", "table": "erp_finance_receipt", "doc": "SKDç¼å·ï¼å
³è CRM å®¢æ·æ ¡éªï¼æ BPM(æå¨å®¡æ ¸)", "upstream": ["éå®(å¼±å
³è)"], "downstream": ["ç»ç®è´¦æ·"], "keywords": "æ¶æ¬¾ åºæ¶ receipt"}, |
| | | {"name": "ä¼è®¡ç§ç®", "module": "ä¼è®¡æ ¸ç®", "table": "fin_account_subject", "doc": "ç§ç®æ ï¼parent_id èªå
³èï¼ç§ç®ç±»å1èµäº§2è´åº3æç4ææ¬5æçï¼ä½é¢æ¹å1å2è´·ï¼ç¶æ0å¯ç¨1ç¦ç¨ï¼è´¦è¡¨ä¸åå½ç»ä¸æ subject_code åæ°", "upstream": ["ä¼è®¡ç§ç®ç§å约68æ¡ä¸çº§ç§ç®"], "downstream": ["è®°è´¦åè¯åå½", "æ»è´¦", "æç»è´¦"], "keywords": "ä¼è®¡ç§ç® ç§ç® subject account èµäº§ç±» è´åºç±» æçç±»"}, |
| | | {"name": "è®°è´¦åè¯", "module": "ä¼è®¡æ ¸ç®", "table": "fin_voucher", "doc": "åè¯åå·å¯ç空ç±å端èªå¨çæï¼ç¶æ æªè¿è´¦0/å·²è¿è´¦10/å·²ä½åº20ï¼å·²è¿è´¦ä¸å¯æ¹ï¼æªè¿è´¦ä¸å·²è¿è´¦åå¯ä½åºï¼æªè¿è´¦ä¸å·²ä½åºå¯å é¤ï¼éä»¶æ recordType=fin_voucher æç³»ç»éä»¶ä¸å¿", "upstream": ["ä¼è®¡ç§ç®"], "downstream": ["æ»è´¦", "æç»è´¦", "è´¢å¡æ¥è¡¨çæ¿"], "keywords": "è®°è´¦åè¯ åè¯ voucher è¿è´¦ ä½åº å贷平衡"}, |
| | | {"name": "åè¯åå½", "module": "ä¼è®¡æ ¸ç®", "table": "fin_voucher_entry", "doc": "åè¯ä¸éè¡åå½ï¼ç§ç®ç¼ç +å/è´·éé¢+è¾
婿 ¸ç®(1客æ·2ä¾åºå3é¨é¨4åå·¥5项ç®)ï¼ä¸è¡ä¸å¯åè´·åæ¶å¤§äº0ï¼å
¨è¡¨åè´·å计å¿
é¡»ç¸çä¸å¤§äº0", "upstream": ["è®°è´¦åè¯", "ä¼è®¡ç§ç®"], "downstream": ["æ»è´¦", "æç»è´¦"], "keywords": "åè¯åå½ åå½ entry åæ¹ è´·æ¹ è¾
婿 ¸ç®"}, |
| | | {"name": "åºå®èµäº§", "module": "ä¼è®¡æ ¸ç®", "table": "fin_fixed_asset", "doc": "èµäº§å¡çï¼ç¶æ 1å¨ç¨/2é²ç½®/3ç»´ä¿®ä¸/4å·²æ¥åºï¼æææ§é¢=(åå¼Ã(1-æ®å¼ç))÷(å¹´éÃ12)ï¼ç´¯è®¡ææ§ä¸åå¼ç±è®¡æç´¯å ï¼ä¸æ¥æ¶åç«¯ä¼ å¼", "upstream": [], "downstream": ["è´¢å¡æ¥è¡¨çæ¿", "æ»è´¦"], "keywords": "åºå®èµäº§ ææ§ èµäº§å¡ç fixed asset æ®å¼ç"}, |
| | | {"name": "æ å½¢èµäº§", "module": "ä¼è®¡æ ¸ç®", "table": "fin_intangible_asset", "doc": "æ å½¢èµäº§å¡ç(è¯ä¹¦ç¼å·/æææ)ï¼ç¶æ 1å¨ç¨/2已失æ/3å·²æéå®ï¼ææéé¢=(åå¼Ã(1-æ®å¼ç))÷(æéå¹´éÃ12)ï¼ç´¯è®¡æéä¸åå¼ç±è®¡æç´¯å ", "upstream": [], "downstream": ["è´¢å¡æ¥è¡¨çæ¿", "æ»è´¦"], "keywords": "æ å½¢èµäº§ æé 软件è使 ä¸å© intangible æææ"}, |
| | | {"name": "éå®è®¢å", "module": "è¿éå", "table": "erp_sale_order", "doc": "XSDDç¼å·ï¼BPM 审æ¹ï¼éç产è¡èªå¨å»º MPSï¼åºåºç¶æ:æª0å·²é¢ç1é¨å2å
¨é¨3ï¼çäº§å®æäºä»¶åå", "upstream": ["åå"], "downstream": ["MPS", "åè´§éç¥", "éå®åºåº", "å®åå·¥å"], "keywords": "éå®è®¢å sale"}, |
| | | {"name": "主ç产计å", "module": "ç产", "table": "mes_pro_mps", "doc": "MPS计åï¼è稿0âå·²ä¸å1â宿2/åæ¶3ï¼å¯åå¹¶ä¸å", "upstream": ["éå®è®¢å"], "downstream": ["ç产工å"], "keywords": "MPS 主计å ç产计å"}, |
| | | {"name": "ç产工å", "module": "ç产", "table": "mes_pro_work_order", "doc": "è稿0â已确认1â宿2/åæ¶3ï¼ç¡®è®¤æ¶æå·¥èºè·¯çº¿çæä»»å¡ï¼æåä¸éå·¥åºæ¥å·¥ååå·²ç产æ°é", "upstream": ["MPS"], "downstream": ["ç产任å¡", "颿", "å®å·¥å
¥åº"], "keywords": "å·¥å ç产工å work order"}, |
| | |
| | | {"stage": "å¤å®", "action": "é®é¢å¤å®: ä¸è¬/ç»´ä¿®/éè´§ï¼ä¸¥é度 0-3", "roles": ["å®åå·¥ç¨å¸"]}, |
| | | {"stage": "ç»´ä¿®", "action": "ç°åº/è¿å/è¿ç¨ç»´ä¿®ï¼è´¹ç¨ä¸ç»æè®°å½ï¼å®æèå¨å·¥åå®ç»", "roles": ["维修工ç¨å¸"]}, |
| | | {"stage": "éè´§", "action": "éè´§ç³è¯·å®¡æ ¸âèªå¨å»º MES éå®éè´§å(RQC)âè´¨æ£/å
¥åºåè°â鿬¾åè°âå
³é", "roles": ["å®å", "è´¨æ£", "è´¢å¡"]}]}, |
| | | {"id": "finance", "name": "ä¼è®¡æ ¸ç®æµç¨", "mermaid": "mermaid/12-finance-flow.mmd", "color": "#3ec9a7", |
| | | "summary": "ç¬ç«æ ¸ç®æ¨¡å yudao-module-financeï¼ä¼è®¡ç§ç®å»ºè´¦ â è®°è´¦åè¯å½å
¥(åè´·å¹³è¡¡æ ¡éª) â è¿è´¦ â æ»è´¦/æç»è´¦ â èµäº§è®¡æææ§ä¸æé â è´¢å¡æ¥è¡¨çæ¿åæ° ERP å·²å®¡æ ¸åæ®ã", |
| | | "steps": [ |
| | | {"stage": "建账", "action": "ç»´æ¤ä¼è®¡ç§ç® tree(subjectCode å¯ä¸ï¼å¯å»ºä¸çº§)ï¼é¦æ¬¡å¯å¯¼å
¥çº¦ 68 æ¡ä¸çº§ç§ç®ç§å", "roles": ["ä¼è®¡"]}, |
| | | {"stage": "è®°è´¦", "action": "å½å
¥åè¯(åå·ç空èªå¨çæ)+åå½ï¼åå½éè¡éç§ç®å¹¶å¡«å/è´·ï¼æ ¡éªè³å°ä¸è¡ãåè´·é½ä¸å¾åæ¶å¤§äº0ãå计ç¸çä¸å¤§äº0", "roles": ["ä¼è®¡"]}, |
| | | {"stage": "è¿è´¦", "action": "æªè¿è´¦0 â post è¿è´¦ â å·²è¿è´¦10(ä¸å¯åä¿®æ¹)ï¼æªè¿è´¦0 æ å·²è¿è´¦10 åå¯ cancel ä½åº â å·²ä½åº20", "roles": ["ä¼è®¡", "è´¢å¡ä¸»ç®¡"]}, |
| | | {"stage": "æ¥è´¦", "action": "æ»è´¦ææé´éææ±æ»ãæç»è´¦éæ¡åå½å¹¶ç»è½¬ä½é¢ï¼ä¸¤è
åªç»è®¡å·²è¿è´¦10çåè¯ï¼å¹¶æ¯æå¯¼åº", "roles": ["ä¼è®¡", "è´¢å¡ä¸»ç®¡"]}, |
| | | {"stage": "èµäº§", "action": "åºå®èµäº§(1å¨ç¨/2é²ç½®/3ç»´ä¿®ä¸/4å·²æ¥åº)䏿 å½¢èµäº§(1å¨ç¨/2已失æ/3å·²æéå®)计æï¼ä¼ ids æéä¸è®¡æï¼ids 为空对å
¨é¨æªæ¥åº/æªå¤±æèµäº§è®¡æä¸ä¸ªæ", "roles": ["èµäº§ä¼è®¡"]}, |
| | | {"stage": "æ¥è¡¨", "action": "çæ¿æ±æ»èµäº§ä¸åè¯æ¶ç¹æ° + ç» ErpFinanceStatisticsApi å ERP å·²å®¡æ ¸æ¶è´§ä»æ¬¾ä¸è´ééé¢ï¼è¾åºæåº¦æ¶æ¯è¶å¿", "roles": ["è´¢å¡ä¸»ç®¡", "管çå±"]}]}, |
| | | {"id": "ai", "name": "AI ä¸å¡æµç¨", "mermaid": "mermaid/11-ai-business-flow.mmd", "color": "#56c8d8", |
| | | "summary": "ç»ä¸æ¨¡å¼ï¼ä¸å¡ä¾§æ¶éä¸ä¸æ(å¿
è¦æ¶è° MDM/SRM/CRM API ååç§°)âç»è£
Promptâchat/chatWithImageâè§£æ JSONâå端é¢å¡«æå»ºè®®ï¼æ Function Callingï¼RAG ç¥è¯åºå·²å»ºæä½ææ ä¸å¡æ¶è´¹ã", |
| | | "steps": [ |
| | |
| | | {"role": "è´¨æ£å", "modules": ["MES-QC"], "operations": ["IQC/IPQC/OQC/RQC æ£éª", "NCR è¯å®¡å¤ç½®"], "data": ["mes_qc_*"], "scope": "inspectorUserId å½å±"}, |
| | | {"role": "设å¤å/维修工", "modules": ["MES-DV"], "operations": ["ç¹æ£ä¿å
»", "维修工å", "å·¥è£
é¢ç¨"], "data": ["mes_dv_*", "mes_tm_*"], "scope": "chargeUserId å½å±"}, |
| | | {"role": "客æ/å®åå·¥ç¨å¸", "modules": ["å®å"], "operations": ["å·¥ååçæ´¾å·¥", "ç»´ä¿®", "éè´§ç³è¯·"], "data": ["after_sale_*"], "scope": "è¡çº§æ°æ®æéåè§å¾ï¼æè´è´£/æåä¸/ä¸å±è´è´£/å
¨é¨(aftersales:view-all)"}, |
| | | {"role": "è´¢å¡", "modules": ["ERP", "CRM"], "operations": ["æ¶æ¬¾å", "仿¬¾å", "å¼ç¥¨å®¡æ ¸", "ç»ç®è´¦æ·"], "data": ["erp_finance_*", "crm_invoice", "crm_receivable"], "scope": "financeUserId å½å±"}, |
| | | {"role": "è´¢å¡", "modules": ["ERP", "CRM", "FIN"], "operations": ["æ¶æ¬¾å", "仿¬¾å", "å¼ç¥¨å®¡æ ¸", "ç»ç®è´¦æ·", "ä¼è®¡ç§ç®ç»´æ¤", "è®°è´¦åè¯å½å
¥ä¸è¿è´¦/ä½åº", "æ»è´¦ä¸æç»è´¦æ¥è¯¢", "åºå®èµäº§ææ§è®¡æ", "æ å½¢èµäº§æé计æ", "ä¼è®¡æ ¸ç®çæ¿"], "data": ["erp_finance_*", "crm_invoice", "crm_receivable", "fin_account_subject", "fin_voucher", "fin_voucher_entry", "fin_fixed_asset", "fin_intangible_asset"], "scope": "financeUserId å½å±ï¼è´¢å¡æ ¸ç®æ¨¡åæ finance:* æ¥å£æé + system_menu ææï¼ææ æ°æ®æéåæ®µ"}, |
| | | {"role": "HR", "modules": ["HRM"], "operations": ["å工档æ¡å
¥è½¬è°ç¦»", "èå¤è§åæç", "èªé
¬æ ¸ç®åæ¾", "离è交æ¥"], "data": ["hrm_*"], "scope": "é¨é¨èå´ dataScope"}, |
| | | {"role": "管çå±", "modules": ["BI"], "operations": ["æ¥çéè´éå®/ä»åº/ç产设å¤/è´¨é/人åäºå¤§ä¸»é¢å¤§å±"], "data": ["bi_dashboard"], "scope": "åªè¯»"} |
| | | ] |
| | |
| | | 仿¬¾å |
| | | æ¶æ¬¾å |
| | | ç»ç®è´¦æ· |
| | | è´¢å¡ç®¡ç ä¼è®¡æ ¸ç® FIN |
| | | ä¼è®¡ç§ç®æ |
| | | è®°è´¦åè¯ä¸åå½ |
| | | åè¯è¿è´¦ä¸ä½åº |
| | | æ»è´¦ä¸æç»è´¦ |
| | | åºå®èµäº§ä¸ææ§ |
| | | æ å½¢èµäº§ä¸æé |
| | | è´¢å¡æ¥è¡¨çæ¿ |
| | | ç产管ç MES |
| | | 主ç产计å MPS |
| | | ç产工å |
| | |
| | | ERP -->|éå®è®¢å审æ¹çæMPS| MES |
| | | MES -->|å
¥åºåºåºåååæ®è¿åº¦| ERP |
| | | MES -->|ProductionFinishedEvent| ERP |
| | | ERP -->|ErpFinanceStatisticsApi.getMonthlyStatistics·åªåå·²å®¡æ ¸ status=20 çæ¶æ¬¾ä»æ¬¾ä¸è´ééé¢| FIN[è´¢å¡æ ¸ç® FIN ç§ç®Â·åè¯Â·æ»è´¦æç»è´¦Â·èµäº§ææ§æé·æ¥è¡¨çæ¿] |
| | | MES -->|éè´§è´¨æ£å
¥åºåè°| AS[å®åå·¥åç»´ä¿®éè´§] |
| | | CRM -->|客æ·ä¸»æ°æ®| AS |
| | | HRM[HRM åå·¥å
¥è½¬è°ç¦»äº¤æ¥èå¤èªé
¬] -.->|expandUserIds æ°æ®å¯è§æ§æ©å±Â·æ¥å£å·²å°±ç»ªå¾
忍¡åæ¥å
¥| CRM |
| | |
| | | ERP --> BI |
| | | CRM --> BI |
| | | HRM --> BI |
| | | FIN --> BI |
| | | SYS[ç³»ç»åºåº§ 认è¯Â·RBAC·åå
¸Â·éä»¶ä¸å¿Â·å®æ¶ä»»å¡] --- MDM |
| | | SYS --- MES |
| | | STG[éä»¶ä¸å¿ storage-blob+attachment å
¨æ¨¡åç»ä¸æéä»¶] --- ERP |
| | | FIN -.->|åè¯éä»¶ recordType=fin_voucher| STG |
| | | </pre> |
| | | <pre style="display:none" class="mmd-src" data-mmd="09-data-flow"> |
| | | flowchart LR |
| | |
| | | RC[æ¶æ¬¾å] |
| | | PI[éè´æ¥ç¥¨] --> PA[仿¬¾å] |
| | | end |
| | | subgraph S5 [è´¢å¡æ ¸ç® FIN ç¬ç«æ¨¡å] |
| | | FA[ä¼è®¡ç§ç® fin_account_subject] --> FV[è®°è´¦åè¯ fin_voucher] |
| | | FV --> FE[åè¯åå½ fin_voucher_entry] |
| | | FE -->|åè´·å¹³è¡¡æ ¡éªÂ·ä¸å¹³è¡¡æå计为0忦ä¸| FVPOST{åè¯è¿è´¦} |
| | | FVPOST -->|å·²è¿è´¦10| GL[æ»è´¦Â·ææé´éææ±æ»] |
| | | FVPOST -->|å·²è¿è´¦10| DL[æç»è´¦Â·éæ¡åå½å¹¶ç»è½¬ä½é¢] |
| | | GL --> FDASH[ä¼è®¡æ ¸ç®çæ¿] |
| | | DL --> FDASH |
| | | FIX[åºå®èµäº§Â·1å¨ç¨2é²ç½®3ç»´ä¿®ä¸4å·²æ¥åº] -->|è®¡æææ§Â·ä¼ idsæéä¸ ç©ºidså
¨é| FDEP[ç´¯è®¡ææ§ä¸åå¼] |
| | | FINT[æ å½¢èµäº§Â·1å¨ç¨2已失æ3å·²æéå®] -->|计ææéÂ·ä¼ idsæéä¸ ç©ºidså
¨é| FAMR[累计æéä¸åå¼] |
| | | FDEP --> FDASH |
| | | FAMR --> FDASH |
| | | end |
| | | CT -->|generateSaleOrder 带å
¥å®¢æ·äº§åææ£å®é·ååorderId| SO |
| | | SO -->|审æ¹éè¿å¸¦å
¥ saleOrderId è¡ID æ°é å®¢æ· äº¤æ| MP |
| | | PO -->|确认æ¶è´§å¸¦å
¥è®¢åè¡ç©æä¾åºåæ°é| AN |
| | |
| | | IV -->|忬¾å¼ºå¶å
å¼ç¥¨| RK |
| | | RC -->|å
³èCRMå®¢æ·æ ¡éª| CU |
| | | PA -->|å
³èæ¥ç¥¨ä¸ä¾åºå| PI |
| | | RC -->|å·²å®¡æ ¸æ¶æ¬¾åéé¢ ErpFinanceStatisticsApi| FDASH |
| | | PA -->|å·²å®¡æ ¸ä»æ¬¾åéé¢ ErpFinanceStatisticsApi| FDASH |
| | | SO -->|å·²å®¡æ ¸éå®è®¢åéé¢ ErpFinanceStatisticsApi| FDASH |
| | | PO -->|å·²å®¡æ ¸éè´è®¢åéé¢ ErpFinanceStatisticsApi| FDASH |
| | | FV -.->|åè¯éä»¶ recordType=fin_voucher| PDFARCH |
| | | subgraph S4 [æºè½è´¨æ£æ¥å qcreport] |
| | | RPT[æ¥å模æ¿] --> RPTV[模æ¿çæ¬] |
| | | RPTVSAVE[设计å¨ä¿å create æ update] -->|åå
¥ä¾§é¸é¨ è§å101_006 ç»å¸å®å
¨101_009 ä¸åæ ¼ä¸è½åº| RPTV |
| | |
| | | hrm_employee ||--o| hrm_user_handover : "离èäº¤æ¥æ å°" |
| | | qc_report_template ||--o{ qc_report_template_version : "å¤çæ¬" |
| | | qc_report_template_version ||--o{ qc_report_instance : "å»ç»åºä»¶çæ¬" |
| | | fin_account_subject |o--o{ fin_voucher_entry : "å彿 subject_code 对åºç§ç®" |
| | | fin_voucher ||--o{ fin_voucher_entry : "åè¯å«åå½" |
| | | %% fin_fixed_asset åºå®èµäº§ä¸ fin_intangible_asset æ å½¢èµäº§ä¸ºç¬ç«èµäº§å¡çï¼é èµäº§ç¼å·èªç®¡çï¼æ å¤é®å
³èï¼æ
ä¸ä¸ ER |
| | | </pre> |
| | | <pre style="display:none" class="mmd-src" data-mmd="11-ai-business-flow"> |
| | | flowchart TD |
| | |
| | | MODE[模åå±:éä¹åé®ä¸ºä¸»Â·é¢çDeepSeek/OpenAI/Ollamaæªå®ç°] --- O2 |
| | | NOTE[å
¨é¡¹ç®æ Function Calling·AIåªè¾åºç»æåJSONç±ä¸å¡ä¾§è§£æ] --- J2 |
| | | </pre> |
| | | <pre style="display:none" class="mmd-src" data-mmd="12-finance-flow"> |
| | | flowchart TD |
| | | A[ä¼è®¡ç§ç® fin_account_subject·ä¸çº§ç§ç®ç§å约68æ¡] -->|建ä¸çº§ç§ç® parent_id| B[ç§ç®æ ·list ç»è£
children] |
| | | B -->|ç§ç®åå¼ç¨ subjectCode èé id| C[è®°è´¦åè¯ fin_voucher·ç空åèªå¨çæåå·] |
| | | C --> D[åè¯åå½ fin_voucher_entry·éè¡ç§ç®+å/è´·+è¾
婿 ¸ç®] |
| | | D -->|åç«¯æ ¡éªÂ·åç«¯å¤æ ¸| E{åè´·å¹³è¡¡æ ¡éª} |
| | | E -->|ä¸å¹³è¡¡æå计为0| E1[æ¦ä¸Â·æç¤ºåºéè¡ä¸åè´·å·®é¢] |
| | | E -->|平衡| F[ä¿å·æªè¿è´¦0] |
| | | F -->|å¯ç¼è¾ å¯è¿è´¦ å¯ä½åº å¯å é¤| F |
| | | F -->|è¿è´¦ post| G[å·²è¿è´¦10·ä¸å¯åä¿®æ¹] |
| | | F -->|ä½åº cancel| H[å·²ä½åº20] |
| | | G -->|ä½åº cancel| H |
| | | H -->|å é¤ delete| X[å é¤] |
| | | G -->|åªç»è®¡å·²è¿è´¦åè¯æç»| I[æ»è´¦ finance/ledger/general·ææé´éææ±æ»] |
| | | G -->|åªç»è®¡å·²è¿è´¦åè¯æç»| J[æç»è´¦ finance/ledger/detailÂ·éæ¡åå½å¹¶ç»è½¬ä½é¢] |
| | | I --> K[è´¢å¡æ¥è¡¨ / ä¼è®¡æ ¸ç®çæ¿] |
| | | J --> K |
| | | L[åºå®èµäº§ fin_fixed_assetÂ·ç¶æ 1å¨ç¨ 2é²ç½® 3ç»´ä¿®ä¸ 4å·²æ¥åº] -->|è®¡æææ§ depreciate·空ids=å
¨é| M[ç´¯è®¡ææ§éå¢Â·åå¼=åå¼-ç´¯è®¡ææ§] |
| | | N[æ å½¢èµäº§ fin_intangible_assetÂ·ç¶æ 1å¨ç¨ 2已失æ 3å·²æéå®] -->|计ææé amortize·空ids=å
¨é| O[累计æééå¢Â·åå¼=åå¼-累计æé] |
| | | M --> K |
| | | O --> K |
| | | P[ERP å·²å®¡æ ¸åæ® status=20 æ¶æ¬¾å 仿¬¾å éå®è®¢å éè´è®¢å] -->|ErpFinanceStatisticsApi.getMonthlyStatistics ææ| K |
| | | K -.->|ç§ç®æ° åè¯æ° æªè¿è´¦ å·²è¿è´¦ å·²ä½åº èµäº§åå¼ æåº¦è¶å¿| Q[çæ¿å¡ç+æåº¦è¶å¿å¾] |
| | | V[éä»¶ä¸å¿ recordType=fin_voucher] --- C |
| | | V -.->|ä¸è½ file_url å| C |
| | | </pre> |
| | | |
| | | <script type="module"> |
| | | const DATA = {}; |
| | |
| | | const mmdSrc = {}; |
| | | document.querySelectorAll('pre.mmd-src').forEach(p=>{ mmdSrc[p.dataset.mmd]=p.textContent.trim(); }); |
| | | |
| | | const flowColor = {sales:'var(--c-sale)',purchase:'var(--c-erp)',production:'var(--c-prod)',quality:'var(--c-qc)',warehouse:'var(--c-wm)',aftersales:'var(--c-as)',ai:'var(--c-ai)'}; |
| | | const flowColor = {sales:'var(--c-sale)',purchase:'var(--c-erp)',production:'var(--c-prod)',quality:'var(--c-qc)',warehouse:'var(--c-wm)',aftersales:'var(--c-as)',finance:'var(--c-fin)',ai:'var(--c-ai)'}; |
| | | |
| | | async function boot(){ |
| | | DATA.business = await loadJson('business'); |
| | |
| | | </div> |
| | | <h3 class="sec">ä¸å¡æ¨¡å</h3> |
| | | <div class="grid cards">`; |
| | | const targets = {crm:'flow-sales',erp:'flow-purchase',pro:'flow-production',wm:'flow-warehouse',qc:'flow-quality',aftersales:'flow-aftersales',ai:'ai',srm:'flow-purchase',mdm:'objects',dv:'objects',hrm:'objects',bpm:'relation'}; |
| | | const accs = {mdm:'var(--c-base)',crm:'var(--c-sale)',srm:'var(--c-sup)',erp:'var(--c-erp)',pro:'var(--c-prod)',wm:'var(--c-wm)',qc:'var(--c-qc)',dv:'var(--c-dv)',aftersales:'var(--c-as)',hrm:'var(--c-hrm)',bpm:'var(--c-bpm)',ai:'var(--c-ai)'}; |
| | | const targets = {crm:'flow-sales',erp:'flow-purchase',pro:'flow-production',wm:'flow-warehouse',qc:'flow-quality',aftersales:'flow-aftersales',ai:'ai',srm:'flow-purchase',mdm:'objects',dv:'objects',hrm:'objects',bpm:'relation',finance:'flow-finance'}; |
| | | const accs = {mdm:'var(--c-base)',crm:'var(--c-sale)',srm:'var(--c-sup)',erp:'var(--c-erp)',pro:'var(--c-prod)',wm:'var(--c-wm)',qc:'var(--c-qc)',dv:'var(--c-dv)',aftersales:'var(--c-as)',hrm:'var(--c-hrm)',bpm:'var(--c-bpm)',ai:'var(--c-ai)',finance:'var(--c-fin)'}; |
| | | DATA.modules.modules.forEach(m=>{ |
| | | html += `<div class="card" style="--acc:${accs[m.key]||'#2c5cff'}" data-goto="${targets[m.key]||'panorama'}"> |
| | | <h3>${esc(m.name)}<span class="tag">${esc(m.tag)}</span></h3> |
| | |
| | | 仿¬¾å |
| | | æ¶æ¬¾å |
| | | ç»ç®è´¦æ· |
| | | è´¢å¡ç®¡ç ä¼è®¡æ ¸ç® FIN |
| | | ä¼è®¡ç§ç®æ |
| | | è®°è´¦åè¯ä¸åå½ |
| | | åè¯è¿è´¦ä¸ä½åº |
| | | æ»è´¦ä¸æç»è´¦ |
| | | åºå®èµäº§ä¸ææ§ |
| | | æ å½¢èµäº§ä¸æé |
| | | è´¢å¡æ¥è¡¨çæ¿ |
| | | ç产管ç MES |
| | | 主ç产计å MPS |
| | | ç产工å |
| | |
| | | ERP -->|éå®è®¢å审æ¹çæMPS| MES |
| | | MES -->|å
¥åºåºåºåååæ®è¿åº¦| ERP |
| | | MES -->|ProductionFinishedEvent| ERP |
| | | ERP -->|ErpFinanceStatisticsApi.getMonthlyStatistics·åªåå·²å®¡æ ¸ status=20 çæ¶æ¬¾ä»æ¬¾ä¸è´ééé¢| FIN[è´¢å¡æ ¸ç® FIN ç§ç®Â·åè¯Â·æ»è´¦æç»è´¦Â·èµäº§ææ§æé·æ¥è¡¨çæ¿] |
| | | MES -->|éè´§è´¨æ£å
¥åºåè°| AS[å®åå·¥åç»´ä¿®éè´§] |
| | | CRM -->|客æ·ä¸»æ°æ®| AS |
| | | HRM[HRM åå·¥å
¥è½¬è°ç¦»äº¤æ¥èå¤èªé
¬] -.->|expandUserIds æ°æ®å¯è§æ§æ©å±Â·æ¥å£å·²å°±ç»ªå¾
忍¡åæ¥å
¥| CRM |
| | |
| | | ERP --> BI |
| | | CRM --> BI |
| | | HRM --> BI |
| | | FIN --> BI |
| | | SYS[ç³»ç»åºåº§ 认è¯Â·RBAC·åå
¸Â·éä»¶ä¸å¿Â·å®æ¶ä»»å¡] --- MDM |
| | | SYS --- MES |
| | | STG[éä»¶ä¸å¿ storage-blob+attachment å
¨æ¨¡åç»ä¸æéä»¶] --- ERP |
| | | FIN -.->|åè¯éä»¶ recordType=fin_voucher| STG |
| | |
| | | RC[æ¶æ¬¾å] |
| | | PI[éè´æ¥ç¥¨] --> PA[仿¬¾å] |
| | | end |
| | | subgraph S5 [è´¢å¡æ ¸ç® FIN ç¬ç«æ¨¡å] |
| | | FA[ä¼è®¡ç§ç® fin_account_subject] --> FV[è®°è´¦åè¯ fin_voucher] |
| | | FV --> FE[åè¯åå½ fin_voucher_entry] |
| | | FE -->|åè´·å¹³è¡¡æ ¡éªÂ·ä¸å¹³è¡¡æå计为0忦ä¸| FVPOST{åè¯è¿è´¦} |
| | | FVPOST -->|å·²è¿è´¦10| GL[æ»è´¦Â·ææé´éææ±æ»] |
| | | FVPOST -->|å·²è¿è´¦10| DL[æç»è´¦Â·éæ¡åå½å¹¶ç»è½¬ä½é¢] |
| | | GL --> FDASH[ä¼è®¡æ ¸ç®çæ¿] |
| | | DL --> FDASH |
| | | FIX[åºå®èµäº§Â·1å¨ç¨2é²ç½®3ç»´ä¿®ä¸4å·²æ¥åº] -->|è®¡æææ§Â·ä¼ idsæéä¸ ç©ºidså
¨é| FDEP[ç´¯è®¡ææ§ä¸åå¼] |
| | | FINT[æ å½¢èµäº§Â·1å¨ç¨2已失æ3å·²æéå®] -->|计ææéÂ·ä¼ idsæéä¸ ç©ºidså
¨é| FAMR[累计æéä¸åå¼] |
| | | FDEP --> FDASH |
| | | FAMR --> FDASH |
| | | end |
| | | CT -->|generateSaleOrder 带å
¥å®¢æ·äº§åææ£å®é·ååorderId| SO |
| | | SO -->|审æ¹éè¿å¸¦å
¥ saleOrderId è¡ID æ°é å®¢æ· äº¤æ| MP |
| | | PO -->|确认æ¶è´§å¸¦å
¥è®¢åè¡ç©æä¾åºåæ°é| AN |
| | |
| | | IV -->|忬¾å¼ºå¶å
å¼ç¥¨| RK |
| | | RC -->|å
³èCRMå®¢æ·æ ¡éª| CU |
| | | PA -->|å
³èæ¥ç¥¨ä¸ä¾åºå| PI |
| | | RC -->|å·²å®¡æ ¸æ¶æ¬¾åéé¢ ErpFinanceStatisticsApi| FDASH |
| | | PA -->|å·²å®¡æ ¸ä»æ¬¾åéé¢ ErpFinanceStatisticsApi| FDASH |
| | | SO -->|å·²å®¡æ ¸éå®è®¢åéé¢ ErpFinanceStatisticsApi| FDASH |
| | | PO -->|å·²å®¡æ ¸éè´è®¢åéé¢ ErpFinanceStatisticsApi| FDASH |
| | | FV -.->|åè¯éä»¶ recordType=fin_voucher| PDFARCH |
| | | subgraph S4 [æºè½è´¨æ£æ¥å qcreport] |
| | | RPT[æ¥å模æ¿] --> RPTV[模æ¿çæ¬] |
| | | RPTVSAVE[设计å¨ä¿å create æ update] -->|åå
¥ä¾§é¸é¨ è§å101_006 ç»å¸å®å
¨101_009 ä¸åæ ¼ä¸è½åº| RPTV |
| | |
| | | hrm_employee ||--o| hrm_user_handover : "离èäº¤æ¥æ å°" |
| | | qc_report_template ||--o{ qc_report_template_version : "å¤çæ¬" |
| | | qc_report_template_version ||--o{ qc_report_instance : "å»ç»åºä»¶çæ¬" |
| | | fin_account_subject |o--o{ fin_voucher_entry : "å彿 subject_code 对åºç§ç®" |
| | | fin_voucher ||--o{ fin_voucher_entry : "åè¯å«åå½" |
| | | %% fin_fixed_asset åºå®èµäº§ä¸ fin_intangible_asset æ å½¢èµäº§ä¸ºç¬ç«èµäº§å¡çï¼é èµäº§ç¼å·èªç®¡çï¼æ å¤é®å
³èï¼æ
ä¸ä¸ ER |
| | | |
| | |
| | | <module>yudao-module-crm-api</module> |
| | | <module>yudao-module-erp</module> |
| | | <module>yudao-module-erp-api</module> |
| | | <!-- è´¢å¡ç®¡ç模åï¼ä¼è®¡æ ¸ç®ï¼ç§ç®ãåè¯ãæ»è´¦ãèµäº§ãæ¥è¡¨ï¼ --> |
| | | <module>yudao-module-finance</module> |
| | | <!-- <module>yudao-module-iot</module>--> |
| | | <module>yudao-module-mes</module> |
| | | <module>yudao-module-mes-api</module> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ============================================= |
| | | -- è´¢å¡æ ¸ç®æ¨¡åèååå§åèæ¬ |
| | | -- ============================================= |
| | | -- 模åï¼yudao-module-finance |
| | | -- è®°è´¦åè¯ / æ»è´¦ / æç»è´¦ / ä¼è®¡ç§ç® / åºå®èµäº§ / æ å½¢èµäº§ / è´¢å¡æ¥è¡¨ |
| | | -- å端页é¢ï¼mom-pro2-before/src/views/erp/finance/** |
| | | -- å端æéç ï¼è§å Controller ç @PreAuthorize |
| | | -- |
| | | -- 说æï¼ |
| | | -- 1. æ°å»ºä¸çº§èåãè´¢å¡æ ¸ç®ã(/finance-core)ï¼ä¸è§¦ç¢°åæ ERP ä¸çãè´¢å¡ç®¡çã(id=2645) |
| | | -- åå
¶ ç»ç®è´¦æ·/仿¬¾å/æ¶æ¬¾å ä¸ä¸ªèåã |
| | | -- 2. 页é¢èå(type=2) åèªæºå¸¦ :query æéï¼å¢å æ¹/导åº/ææ§æéçæä½æé建ææé®(type=3)ã |
| | | -- 3. æ»è´¦ä¸æç»è´¦å
±ç¨ finance:ledger:queryãfinance:ledger:export 两个æéç ï¼ |
| | | -- å æ¤ã导åºè´¦ç°¿ãæé®åªæå¨ãæ»è´¦ãä¸ ââ å䏿éç å¨è§è²æææ éåºç°ä¸æ¬¡å³å¯ï¼ |
| | | -- æäºåãæç»è´¦ãçå¯¼åºæé®åæ ·çæã |
| | | -- 4. å¹çï¼å
å 餿¬èæ¬å ç¨ç id åºé´ (1075500~1075549) åæå
¥ï¼å¯é夿§è¡ã |
| | | -- 注æï¼è¥ä¹åå·²å¨ãè§è²ç®¡çãéç»è¿äºèåææï¼éè·æ¬èæ¬ä¼ä¸¢å¤±å¯¹åº system_role_menu è®°å½ã |
| | | -- 5. ä¸å« tenant_idï¼æ¬é¡¹ç®éå¤ç§æ·ï¼ã |
| | | -- ============================================= |
| | | |
| | | DELETE FROM system_menu WHERE id BETWEEN 1075500 AND 1075549; |
| | | |
| | | -- --------------------------------------------------------------- |
| | | -- ä¸çº§èå |
| | | -- --------------------------------------------------------------- |
| | | INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES |
| | | (1075500, 'è´¢å¡æ ¸ç®', '', 1, 4, 0, '/finance-core', 'ep:money', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | -- --------------------------------------------------------------- |
| | | -- 页é¢èå (type=2) |
| | | -- --------------------------------------------------------------- |
| | | INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES |
| | | (1075501, 'è®°è´¦åè¯', 'finance:voucher:query', 2, 1, 1075500, 'voucher', 'ep:document', 'erp/finance/voucher/index', 'FinVoucher', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | (1075502, 'æ»è´¦', 'finance:ledger:query', 2, 2, 1075500, 'general-ledger', 'ep:notebook', 'erp/finance/ledger/general/index', 'FinGeneralLedger', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | (1075503, 'æç»è´¦', 'finance:ledger:query', 2, 3, 1075500, 'detail-ledger', 'ep:list', 'erp/finance/ledger/detail/index', 'FinDetailLedger', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | (1075504, 'ä¼è®¡ç§ç®', 'finance:account-subject:query', 2, 4, 1075500, 'subject', 'ep:collection-tag', 'erp/finance/subject/index', 'FinAccountSubject', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | (1075505, 'åºå®èµäº§', 'finance:fixed-asset:query', 2, 5, 1075500, 'fixed-asset', 'ep:office-building', 'erp/finance/fixed-asset/index', 'FinFixedAsset', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | (1075506, 'æ å½¢èµäº§', 'finance:intangible-asset:query', 2, 6, 1075500, 'intangible-asset','ep:medal', 'erp/finance/intangible-asset/index', 'FinIntangibleAsset', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | (1075507, 'è´¢å¡æ¥è¡¨', 'finance:statistics:query', 2, 7, 1075500, 'statistics', 'ep:data-line', 'erp/finance/statistics/index', 'FinStatistics', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | -- --------------------------------------------------------------- |
| | | -- æé®æé (type=3) |
| | | -- --------------------------------------------------------------- |
| | | INSERT INTO system_menu (id, name, permission, type, sort, parent_id, path, icon, component, component_name, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted) VALUES |
| | | -- è®°è´¦åè¯ |
| | | (1075510, 'åè¯æ°å¢', 'finance:voucher:create', 3, 1, 1075501, '', '', '', '', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | (1075511, 'åè¯ä¿®æ¹', 'finance:voucher:update', 3, 2, 1075501, '', '', '', '', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | (1075512, 'åè¯å é¤', 'finance:voucher:delete', 3, 3, 1075501, '', '', '', '', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | (1075513, 'åè¯ç¶æåæ´', 'finance:voucher:update-status', 3, 4, 1075501, '', '', '', '', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | (1075514, 'åè¯å¯¼åº', 'finance:voucher:export', 3, 5, 1075501, '', '', '', '', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | -- æ»è´¦ / æç»è´¦ï¼ä¸¤é¡µå
±ç¨ finance:ledger:queryï¼å¯¼åºæéåªå¨æ¤å¤æä¸æ¬¡ï¼è§æä»¶å¤´è¯´æ 3ï¼ |
| | | (1075520, '账簿导åº', 'finance:ledger:export', 3, 1, 1075502, '', '', '', '', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | -- ä¼è®¡ç§ç® |
| | | (1075521, 'ç§ç®æ°å¢', 'finance:account-subject:create',3, 1, 1075504, '', '', '', '', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | (1075522, 'ç§ç®ä¿®æ¹', 'finance:account-subject:update',3, 2, 1075504, '', '', '', '', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | (1075523, 'ç§ç®å é¤', 'finance:account-subject:delete',3, 3, 1075504, '', '', '', '', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | (1075524, 'ç§ç®å¯¼åº', 'finance:account-subject:export',3, 4, 1075504, '', '', '', '', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | -- åºå®èµäº§ |
| | | (1075530, 'èµäº§æ°å¢', 'finance:fixed-asset:create', 3, 1, 1075505, '', '', '', '', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | (1075531, 'èµäº§ä¿®æ¹', 'finance:fixed-asset:update', 3, 2, 1075505, '', '', '', '', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | (1075532, 'èµäº§å é¤', 'finance:fixed-asset:delete', 3, 3, 1075505, '', '', '', '', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | (1075533, 'è®¡æææ§', 'finance:fixed-asset:depreciate',3, 4, 1075505, '', '', '', '', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | (1075534, 'èµäº§å¯¼åº', 'finance:fixed-asset:export', 3, 5, 1075505, '', '', '', '', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | -- æ å½¢èµäº§ |
| | | (1075540, 'èµäº§æ°å¢', 'finance:intangible-asset:create', 3, 1, 1075506, '', '', '', '', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | (1075541, 'èµäº§ä¿®æ¹', 'finance:intangible-asset:update', 3, 2, 1075506, '', '', '', '', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | (1075542, 'èµäº§å é¤', 'finance:intangible-asset:delete', 3, 3, 1075506, '', '', '', '', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | (1075543, 'æ å½¢èµäº§æé', 'finance:intangible-asset:amortize', 3, 4, 1075506, '', '', '', '', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'), |
| | | (1075544, 'èµäº§å¯¼åº', 'finance:intangible-asset:export', 3, 5, 1075506, '', '', '', '', 0, b'1', b'0', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | -- --------------------------------------------------------------- |
| | | -- è§è²ææï¼å¯éï¼ |
| | | -- è¶
级管çå (super_admin) ç±ä»£ç ç´æ¥è¿åå
¨é¨èåï¼æ éææã |
| | | -- è¥è¦æè´¢å¡æ ¸ç®æ¾ç»æä¸ªè§è²ï¼å¨ãç³»ç»ç®¡ç â è§è²ç®¡çãéå¾éå³å¯ï¼ |
| | | -- ä¹å¯ç¨ä¸é¢çè¯å¥ç´æ¥ææï¼æ <roleId> æ¢æç®æ è§è² idï¼åèï¼163 è®¾å¤ / 164 è´¨é / 165 éå®ï¼ï¼ |
| | | -- |
| | | -- INSERT INTO system_role_menu (role_id, menu_id, creator, create_time, updater, update_time, deleted) |
| | | -- SELECT 165, id, '1', NOW(), '1', NOW(), b'0' FROM system_menu WHERE id BETWEEN 1075500 AND 1075549; |
| | | -- --------------------------------------------------------------- |
| | | |
| | | -- --------------------------------------------------------------- |
| | | -- åæ»èæ¬ |
| | | -- DELETE FROM system_menu WHERE id BETWEEN 1075500 AND 1075549; |
| | | -- DELETE FROM system_role_menu WHERE menu_id BETWEEN 1075500 AND 1075549; |
| | | -- --------------------------------------------------------------- |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ===================================================================================== |
| | | -- è´¢å¡ç®¡ç模åï¼ä¼è®¡æ ¸ç®ï¼åå§åèæ¬ |
| | | -- 模åï¼yudao-module-finance æ¥å£åç¼ï¼/finance/** 表åç¼ï¼fin_ |
| | | -- |
| | | -- å
å®¹ï¼ |
| | | -- 1. 5 å¼ ä¸å¡è¡¨ï¼ä¼è®¡ç§ç®ãè®°è´¦åè¯ãåè¯åå½ãåºå®èµäº§ãæ å½¢èµäº§ |
| | | -- 2. 6 ç»åå
¸ï¼system_dict_type / system_dict_dataï¼ |
| | | -- 3. ä¸å¥ä¼ä¸ä¼è®¡åå常ç¨ä¼è®¡ç§ç®ç§åæ°æ®ï¼ä»
å¨ä¼è®¡ç§ç®è¡¨ä¸ºç©ºæ¶åå
¥ï¼ |
| | | -- |
| | | -- 说æï¼ |
| | | -- * æ¬èæ¬ä¸å«èå/æéé
ç½®ï¼èå请èªè¡å¨ãç³»ç»ç®¡ç - èå管çãä¸é
ç½®ï¼ |
| | | -- æ¥å£æé串è§ä¸æ¹åè¡¨çæ¥å£æ³¨éï¼finance:xxx:yyyï¼ã |
| | | -- * 项ç®ä¸ºåç§æ·ï¼è¡¨ç»æä¸å« tenant_id åæ®µã |
| | | -- * èæ¬å¯é夿§è¡ï¼å»ºè¡¨ç¨ CREATE TABLE IF NOT EXISTSï¼åå
¸/ç§ç®å带å卿§å¤æã |
| | | -- * æãæ°æ®åºåå§åä¸é
置导åºç»´æ¤è§åãï¼æ¬èæ¬å
容éåæ¥è¿ docs/sql/config_export_all_<æ¥æ>.sql |
| | | -- çé¶æ®µä¸ï¼ç»æ + åå
¸é
ç½®ï¼ï¼å¦åæ°åºåå§åä¼ç¼ºè¡¨ã |
| | | -- ===================================================================================== |
| | | |
| | | -- ------------------------------------------------------------------------------------- |
| | | -- 1.1 ä¼è®¡ç§ç® |
| | | -- æ¥å£ï¼/finance/account-subject æéï¼finance:account-subject:{query|create|update|delete|export} |
| | | -- ------------------------------------------------------------------------------------- |
| | | CREATE TABLE IF NOT EXISTS `fin_account_subject` |
| | | ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ç§ç®ç¼å·', |
| | | `parent_id` bigint NULL DEFAULT NULL COMMENT 'ä¸çº§ç§ç®ç¼å·ï¼NULL 表示ä¸çº§ç§ç®', |
| | | `subject_code` varchar(64) NOT NULL COMMENT 'ç§ç®ç¼ç ', |
| | | `subject_name` varchar(128) NOT NULL COMMENT 'ç§ç®åç§°', |
| | | `subject_type` tinyint NOT NULL COMMENT 'ç§ç®ç±»åï¼1èµäº§ç±» 2è´åºç±» 3ææè
æçç±» 4ææ¬ç±» 5æçç±»', |
| | | `balance_direction` tinyint NOT NULL COMMENT 'ä½é¢æ¹åï¼1å 2è´·', |
| | | `status` tinyint NOT NULL DEFAULT 0 COMMENT 'ç¶æï¼0å¯ç¨ 1ç¦ç¨', |
| | | `remark` varchar(500) NULL DEFAULT '' COMMENT '夿³¨', |
| | | `creator` varchar(64) NULL DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) NULL DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), |
| | | KEY `idx_fin_subject_code` (`deleted`, `subject_code`), |
| | | KEY `idx_fin_subject_parent` (`deleted`, `parent_id`) |
| | | ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = 'ä¼è®¡ç§ç®'; |
| | | |
| | | -- ------------------------------------------------------------------------------------- |
| | | -- 1.2 è®°è´¦åè¯ |
| | | -- æ¥å£ï¼/finance/voucher æéï¼finance:voucher:{query|create|update|delete|update-status|export} |
| | | -- ------------------------------------------------------------------------------------- |
| | | CREATE TABLE IF NOT EXISTS `fin_voucher` |
| | | ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'åè¯ç¼å·', |
| | | `voucher_no` varchar(64) NOT NULL COMMENT 'åè¯åå·ï¼ä¾å¦ï¼è®°2026090001', |
| | | `voucher_date` date NOT NULL COMMENT 'åè¯æ¥æ', |
| | | `summary` varchar(500) NULL DEFAULT '' COMMENT 'æè¦', |
| | | `debit` decimal(18,2) NOT NULL DEFAULT 0 COMMENT 'åæ¹å计', |
| | | `credit` decimal(18,2) NOT NULL DEFAULT 0 COMMENT 'è´·æ¹å计', |
| | | `status` tinyint NOT NULL DEFAULT 0 COMMENT 'åè¯ç¶æï¼0æªè¿è´¦ 10å·²è¿è´¦ 20å·²ä½åº', |
| | | `attachment_count` int NOT NULL DEFAULT 0 COMMENT 'éä»¶å¼ æ°', |
| | | `remark` varchar(500) NULL DEFAULT '' COMMENT '夿³¨', |
| | | `creator` varchar(64) NULL DEFAULT '' COMMENT 'å¶å人', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) NULL DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), |
| | | KEY `idx_fin_voucher_no` (`deleted`, `voucher_no`), |
| | | KEY `idx_fin_voucher_date` (`deleted`, `status`, `voucher_date`) |
| | | ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = 'è®°è´¦åè¯'; |
| | | |
| | | -- ------------------------------------------------------------------------------------- |
| | | -- 1.3 åè¯åå½ |
| | | -- ------------------------------------------------------------------------------------- |
| | | CREATE TABLE IF NOT EXISTS `fin_voucher_entry` |
| | | ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'åå½ç¼å·', |
| | | `voucher_id` bigint NOT NULL COMMENT 'åè¯ç¼å·ï¼å
³è fin_voucher.id', |
| | | `row_no` int NOT NULL DEFAULT 1 COMMENT 'è¡å·ï¼ä» 1 å¼å§', |
| | | `subject_code` varchar(64) NOT NULL COMMENT 'ç§ç®ç¼ç ï¼å
³è fin_account_subject.subject_code', |
| | | `subject_name` varchar(128) NULL DEFAULT '' COMMENT 'ç§ç®åç§°ï¼åä½ï¼', |
| | | `summary` varchar(500) NULL DEFAULT '' COMMENT 'æè¦', |
| | | `debit` decimal(18,2) NOT NULL DEFAULT 0 COMMENT 'åæ¹éé¢', |
| | | `credit` decimal(18,2) NOT NULL DEFAULT 0 COMMENT 'è´·æ¹éé¢', |
| | | `auxiliary_type` tinyint NULL DEFAULT NULL COMMENT 'è¾
婿 ¸ç®ç±»åï¼1å®¢æ· 2ä¾åºå 3é¨é¨ 4åå·¥ 5项ç®', |
| | | `auxiliary_id` varchar(64) NULL DEFAULT '' COMMENT 'è¾
婿 ¸ç®å¯¹è±¡ç¼å·', |
| | | `auxiliary_name` varchar(128) NULL DEFAULT '' COMMENT 'è¾
婿 ¸ç®å¯¹è±¡åç§°', |
| | | `creator` varchar(64) NULL DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) NULL DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), |
| | | KEY `idx_fin_entry_voucher` (`deleted`, `voucher_id`), |
| | | KEY `idx_fin_entry_subject` (`deleted`, `subject_code`) |
| | | ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = 'åè¯åå½'; |
| | | |
| | | -- ------------------------------------------------------------------------------------- |
| | | -- 1.4 åºå®èµäº§ |
| | | -- æ¥å£ï¼/finance/fixed-asset æéï¼finance:fixed-asset:{query|create|update|delete|depreciate|export} |
| | | -- ------------------------------------------------------------------------------------- |
| | | CREATE TABLE IF NOT EXISTS `fin_fixed_asset` |
| | | ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'èµäº§ç¼å·', |
| | | `asset_code` varchar(64) NOT NULL COMMENT 'èµäº§ç¼å·', |
| | | `asset_name` varchar(128) NOT NULL COMMENT 'èµäº§åç§°', |
| | | `category` varchar(64) NULL DEFAULT '' COMMENT 'èµäº§ç±»å«', |
| | | `specification` varchar(255) NULL DEFAULT '' COMMENT 'è§æ ¼åå·', |
| | | `purchase_date` date NOT NULL COMMENT 'è´ç½®æ¥æ', |
| | | `original_value` decimal(24,6) NOT NULL DEFAULT 0 COMMENT 'èµäº§åå¼', |
| | | `useful_life` int NOT NULL DEFAULT 1 COMMENT '使ç¨å¹´éï¼å¹´ï¼', |
| | | `residual_rate` decimal(5,2) NOT NULL DEFAULT 0 COMMENT 'æ®å¼çï¼%ï¼', |
| | | `accumulated_depreciation` decimal(24,6) NOT NULL DEFAULT 0 COMMENT 'ç´¯è®¡ææ§', |
| | | `net_value` decimal(24,6) NOT NULL DEFAULT 0 COMMENT 'åå¼ = åå¼ - ç´¯è®¡ææ§', |
| | | `location` varchar(255) NULL DEFAULT '' COMMENT 'åæ¾å°ç¹', |
| | | `department` varchar(128) NULL DEFAULT '' COMMENT '使ç¨é¨é¨', |
| | | `keeper` varchar(64) NULL DEFAULT '' COMMENT 'ä¿ç®¡äºº', |
| | | `status` tinyint NOT NULL DEFAULT 1 COMMENT 'ç¶æï¼1å¨ç¨ 2é²ç½® 3ç»´ä¿®ä¸ 4å·²æ¥åº', |
| | | `remark` varchar(500) NULL DEFAULT '' COMMENT '夿³¨', |
| | | `creator` varchar(64) NULL DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) NULL DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), |
| | | KEY `idx_fin_fixed_asset_code` (`deleted`, `asset_code`), |
| | | KEY `idx_fin_fixed_asset_status` (`deleted`, `status`) |
| | | ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = 'åºå®èµäº§'; |
| | | |
| | | -- ------------------------------------------------------------------------------------- |
| | | -- 1.5 æ å½¢èµäº§ |
| | | -- æ¥å£ï¼/finance/intangible-asset æéï¼finance:intangible-asset:{query|create|update|delete|amortize|export} |
| | | -- ------------------------------------------------------------------------------------- |
| | | CREATE TABLE IF NOT EXISTS `fin_intangible_asset` |
| | | ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'èµäº§ç¼å·', |
| | | `asset_code` varchar(64) NOT NULL COMMENT 'èµäº§ç¼å·', |
| | | `asset_name` varchar(128) NOT NULL COMMENT 'èµäº§åç§°', |
| | | `category` varchar(64) NULL DEFAULT '' COMMENT 'èµäº§ç±»å«', |
| | | `certificate_no` varchar(128) NULL DEFAULT '' COMMENT 'è¯ä¹¦ç¼å·', |
| | | `acquisition_date` date NOT NULL COMMENT 'å徿¥æ', |
| | | `original_value` decimal(24,6) NOT NULL DEFAULT 0 COMMENT 'èµäº§åå¼', |
| | | `amortization_period` int NOT NULL DEFAULT 1 COMMENT 'æéå¹´éï¼å¹´ï¼', |
| | | `residual_rate` decimal(5,2) NOT NULL DEFAULT 0 COMMENT 'æ®å¼çï¼%ï¼', |
| | | `accumulated_amortization` decimal(24,6) NOT NULL DEFAULT 0 COMMENT '累计æé', |
| | | `net_value` decimal(24,6) NOT NULL DEFAULT 0 COMMENT 'åå¼ = åå¼ - 累计æé', |
| | | `validity_date` date NULL DEFAULT NULL COMMENT 'æææè³', |
| | | `status` tinyint NOT NULL DEFAULT 1 COMMENT 'ç¶æï¼1å¨ç¨ 2已失æ 3å·²æéå®', |
| | | `description` varchar(500) NULL DEFAULT '' COMMENT 'èµäº§æè¿°', |
| | | `remark` varchar(500) NULL DEFAULT '' COMMENT '夿³¨', |
| | | `creator` varchar(64) NULL DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) NULL DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), |
| | | KEY `idx_fin_intangible_asset_code` (`deleted`, `asset_code`), |
| | | KEY `idx_fin_intangible_asset_status` (`deleted`, `status`) |
| | | ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = 'æ å½¢èµäº§'; |
| | | |
| | | -- ------------------------------------------------------------------------------------- |
| | | -- 2. åå
¸ |
| | | -- ------------------------------------------------------------------------------------- |
| | | INSERT INTO `system_dict_type` (`name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT 'ä¼è®¡ç§ç®ç±»å', 'finance_subject_type', 0, 'è´¢å¡ç®¡ç - ç§ç®ç±»å', '1', NOW(), '1', NOW(), b'0' |
| | | WHERE NOT EXISTS (SELECT 1 FROM `system_dict_type` WHERE `type` = 'finance_subject_type' AND `deleted` = b'0'); |
| | | |
| | | INSERT INTO `system_dict_type` (`name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT 'ä¼è®¡ä½é¢æ¹å', 'finance_balance_direction', 0, 'è´¢å¡ç®¡ç - ç§ç®ä½é¢æ¹å', '1', NOW(), '1', NOW(), b'0' |
| | | WHERE NOT EXISTS (SELECT 1 FROM `system_dict_type` WHERE `type` = 'finance_balance_direction' AND `deleted` = b'0'); |
| | | |
| | | INSERT INTO `system_dict_type` (`name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT 'è¾
婿 ¸ç®ç±»å', 'finance_auxiliary_type', 0, 'è´¢å¡ç®¡ç - åè¯åå½è¾
婿 ¸ç®ç±»å', '1', NOW(), '1', NOW(), b'0' |
| | | WHERE NOT EXISTS (SELECT 1 FROM `system_dict_type` WHERE `type` = 'finance_auxiliary_type' AND `deleted` = b'0'); |
| | | |
| | | INSERT INTO `system_dict_type` (`name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT 'åè¯ç¶æ', 'finance_voucher_status', 0, 'è´¢å¡ç®¡ç - è®°è´¦åè¯ç¶æ', '1', NOW(), '1', NOW(), b'0' |
| | | WHERE NOT EXISTS (SELECT 1 FROM `system_dict_type` WHERE `type` = 'finance_voucher_status' AND `deleted` = b'0'); |
| | | |
| | | INSERT INTO `system_dict_type` (`name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT 'åºå®èµäº§ç¶æ', 'finance_fixed_asset_status', 0, 'è´¢å¡ç®¡ç - åºå®èµäº§ç¶æ', '1', NOW(), '1', NOW(), b'0' |
| | | WHERE NOT EXISTS (SELECT 1 FROM `system_dict_type` WHERE `type` = 'finance_fixed_asset_status' AND `deleted` = b'0'); |
| | | |
| | | INSERT INTO `system_dict_type` (`name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT 'æ å½¢èµäº§ç¶æ', 'finance_intangible_asset_status', 0, 'è´¢å¡ç®¡ç - æ å½¢èµäº§ç¶æ', '1', NOW(), '1', NOW(), b'0' |
| | | WHERE NOT EXISTS (SELECT 1 FROM `system_dict_type` WHERE `type` = 'finance_intangible_asset_status' AND `deleted` = b'0'); |
| | | |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT 1, 'èµäº§ç±»', '1', 'finance_subject_type', 0, 'primary', '', 'ä¼è®¡ç§ç® - èµäº§ç±»', '1', NOW(), '1', NOW(), b'0' |
| | | WHERE NOT EXISTS (SELECT 1 FROM `system_dict_data` WHERE `dict_type` = 'finance_subject_type' AND `value` = '1' AND `deleted` = b'0'); |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT 2, 'è´åºç±»', '2', 'finance_subject_type', 0, 'warning', '', 'ä¼è®¡ç§ç® - è´åºç±»', '1', NOW(), '1', NOW(), b'0' |
| | | WHERE NOT EXISTS (SELECT 1 FROM `system_dict_data` WHERE `dict_type` = 'finance_subject_type' AND `value` = '2' AND `deleted` = b'0'); |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT 3, 'ææè
æçç±»', '3', 'finance_subject_type', 0, 'success', '', 'ä¼è®¡ç§ç® - ææè
æçç±»', '1', NOW(), '1', NOW(), b'0' |
| | | WHERE NOT EXISTS (SELECT 1 FROM `system_dict_data` WHERE `dict_type` = 'finance_subject_type' AND `value` = '3' AND `deleted` = b'0'); |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT 4, 'ææ¬ç±»', '4', 'finance_subject_type', 0, 'info', '', 'ä¼è®¡ç§ç® - ææ¬ç±»', '1', NOW(), '1', NOW(), b'0' |
| | | WHERE NOT EXISTS (SELECT 1 FROM `system_dict_data` WHERE `dict_type` = 'finance_subject_type' AND `value` = '4' AND `deleted` = b'0'); |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT 5, 'æçç±»', '5', 'finance_subject_type', 0, 'danger', '', 'ä¼è®¡ç§ç® - æçç±»', '1', NOW(), '1', NOW(), b'0' |
| | | WHERE NOT EXISTS (SELECT 1 FROM `system_dict_data` WHERE `dict_type` = 'finance_subject_type' AND `value` = '5' AND `deleted` = b'0'); |
| | | |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT 1, 'å', '1', 'finance_balance_direction', 0, 'primary', '', 'ä½é¢æ¹å - å', '1', NOW(), '1', NOW(), b'0' |
| | | WHERE NOT EXISTS (SELECT 1 FROM `system_dict_data` WHERE `dict_type` = 'finance_balance_direction' AND `value` = '1' AND `deleted` = b'0'); |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT 2, 'è´·', '2', 'finance_balance_direction', 0, 'warning', '', 'ä½é¢æ¹å - è´·', '1', NOW(), '1', NOW(), b'0' |
| | | WHERE NOT EXISTS (SELECT 1 FROM `system_dict_data` WHERE `dict_type` = 'finance_balance_direction' AND `value` = '2' AND `deleted` = b'0'); |
| | | |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT 1, '客æ·', '1', 'finance_auxiliary_type', 0, 'primary', '', 'è¾
婿 ¸ç® - 客æ·', '1', NOW(), '1', NOW(), b'0' |
| | | WHERE NOT EXISTS (SELECT 1 FROM `system_dict_data` WHERE `dict_type` = 'finance_auxiliary_type' AND `value` = '1' AND `deleted` = b'0'); |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT 2, 'ä¾åºå', '2', 'finance_auxiliary_type', 0, 'warning', '', 'è¾
婿 ¸ç® - ä¾åºå', '1', NOW(), '1', NOW(), b'0' |
| | | WHERE NOT EXISTS (SELECT 1 FROM `system_dict_data` WHERE `dict_type` = 'finance_auxiliary_type' AND `value` = '2' AND `deleted` = b'0'); |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT 3, 'é¨é¨', '3', 'finance_auxiliary_type', 0, 'info', '', 'è¾
婿 ¸ç® - é¨é¨', '1', NOW(), '1', NOW(), b'0' |
| | | WHERE NOT EXISTS (SELECT 1 FROM `system_dict_data` WHERE `dict_type` = 'finance_auxiliary_type' AND `value` = '3' AND `deleted` = b'0'); |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT 4, 'åå·¥', '4', 'finance_auxiliary_type', 0, 'success', '', 'è¾
婿 ¸ç® - åå·¥', '1', NOW(), '1', NOW(), b'0' |
| | | WHERE NOT EXISTS (SELECT 1 FROM `system_dict_data` WHERE `dict_type` = 'finance_auxiliary_type' AND `value` = '4' AND `deleted` = b'0'); |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT 5, '项ç®', '5', 'finance_auxiliary_type', 0, 'default', '', 'è¾
婿 ¸ç® - 项ç®', '1', NOW(), '1', NOW(), b'0' |
| | | WHERE NOT EXISTS (SELECT 1 FROM `system_dict_data` WHERE `dict_type` = 'finance_auxiliary_type' AND `value` = '5' AND `deleted` = b'0'); |
| | | |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT 1, 'æªè¿è´¦', '0', 'finance_voucher_status', 0, 'info', '', 'åè¯ç¶æ - æªè¿è´¦', '1', NOW(), '1', NOW(), b'0' |
| | | WHERE NOT EXISTS (SELECT 1 FROM `system_dict_data` WHERE `dict_type` = 'finance_voucher_status' AND `value` = '0' AND `deleted` = b'0'); |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT 2, 'å·²è¿è´¦', '10', 'finance_voucher_status', 0, 'success', '', 'åè¯ç¶æ - å·²è¿è´¦', '1', NOW(), '1', NOW(), b'0' |
| | | WHERE NOT EXISTS (SELECT 1 FROM `system_dict_data` WHERE `dict_type` = 'finance_voucher_status' AND `value` = '10' AND `deleted` = b'0'); |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT 3, 'å·²ä½åº', '20', 'finance_voucher_status', 0, 'danger', '', 'åè¯ç¶æ - å·²ä½åº', '1', NOW(), '1', NOW(), b'0' |
| | | WHERE NOT EXISTS (SELECT 1 FROM `system_dict_data` WHERE `dict_type` = 'finance_voucher_status' AND `value` = '20' AND `deleted` = b'0'); |
| | | |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT 1, 'å¨ç¨', '1', 'finance_fixed_asset_status', 0, 'success', '', 'åºå®èµäº§ - å¨ç¨', '1', NOW(), '1', NOW(), b'0' |
| | | WHERE NOT EXISTS (SELECT 1 FROM `system_dict_data` WHERE `dict_type` = 'finance_fixed_asset_status' AND `value` = '1' AND `deleted` = b'0'); |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT 2, 'é²ç½®', '2', 'finance_fixed_asset_status', 0, 'info', '', 'åºå®èµäº§ - é²ç½®', '1', NOW(), '1', NOW(), b'0' |
| | | WHERE NOT EXISTS (SELECT 1 FROM `system_dict_data` WHERE `dict_type` = 'finance_fixed_asset_status' AND `value` = '2' AND `deleted` = b'0'); |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT 3, 'ç»´ä¿®ä¸', '3', 'finance_fixed_asset_status', 0, 'warning', '', 'åºå®èµäº§ - ç»´ä¿®ä¸', '1', NOW(), '1', NOW(), b'0' |
| | | WHERE NOT EXISTS (SELECT 1 FROM `system_dict_data` WHERE `dict_type` = 'finance_fixed_asset_status' AND `value` = '3' AND `deleted` = b'0'); |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT 4, 'å·²æ¥åº', '4', 'finance_fixed_asset_status', 0, 'danger', '', 'åºå®èµäº§ - å·²æ¥åº', '1', NOW(), '1', NOW(), b'0' |
| | | WHERE NOT EXISTS (SELECT 1 FROM `system_dict_data` WHERE `dict_type` = 'finance_fixed_asset_status' AND `value` = '4' AND `deleted` = b'0'); |
| | | |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT 1, 'å¨ç¨', '1', 'finance_intangible_asset_status', 0, 'success', '', 'æ å½¢èµäº§ - å¨ç¨', '1', NOW(), '1', NOW(), b'0' |
| | | WHERE NOT EXISTS (SELECT 1 FROM `system_dict_data` WHERE `dict_type` = 'finance_intangible_asset_status' AND `value` = '1' AND `deleted` = b'0'); |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT 2, '已失æ', '2', 'finance_intangible_asset_status', 0, 'danger', '', 'æ å½¢èµäº§ - 已失æ', '1', NOW(), '1', NOW(), b'0' |
| | | WHERE NOT EXISTS (SELECT 1 FROM `system_dict_data` WHERE `dict_type` = 'finance_intangible_asset_status' AND `value` = '2' AND `deleted` = b'0'); |
| | | INSERT INTO `system_dict_data` (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT 3, 'å·²æéå®', '3', 'finance_intangible_asset_status', 0, 'info', '', 'æ å½¢èµäº§ - å·²æéå®', '1', NOW(), '1', NOW(), b'0' |
| | | WHERE NOT EXISTS (SELECT 1 FROM `system_dict_data` WHERE `dict_type` = 'finance_intangible_asset_status' AND `value` = '3' AND `deleted` = b'0'); |
| | | |
| | | -- ------------------------------------------------------------------------------------- |
| | | -- 3. ä¼è®¡ç§ç®ç§åæ°æ®ï¼ä¼ä¸ä¼è®¡åå常ç¨ç§ç®ï¼ |
| | | -- ä»
å½ fin_account_subject 为空æ¶åå
¥ï¼é¿å
è¦çç¨æ·å·²ç»´æ¤çç§ç®è¡¨ |
| | | -- parent_id 为 NULL 表示ä¸çº§ç§ç®ï¼ç§ç®ç¼ç éµå¾ªã4 ä½ä¸çº§ + 2 ä½äºçº§ãçå±çº§è§å |
| | | -- ------------------------------------------------------------------------------------- |
| | | INSERT INTO `fin_account_subject` (`parent_id`, `subject_code`, `subject_name`, `subject_type`, `balance_direction`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | SELECT * |
| | | FROM (SELECT NULL AS parent_id, '1001' AS subject_code, 'åºåç°é' AS subject_name, 1 AS subject_type, 1 AS balance_direction, 0 AS status, '' AS remark, '1' AS creator, NOW() AS create_time, '1' AS updater, NOW() AS update_time, b'0' AS deleted |
| | | UNION ALL SELECT NULL, '1002', 'é¶è¡å款', 1, 1, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '1012', 'å
¶ä»è´§å¸èµé', 1, 1, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '1101', 'äº¤ææ§éèèµäº§', 1, 1, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '1121', 'åºæ¶ç¥¨æ®', 1, 1, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '1122', 'åºæ¶è´¦æ¬¾', 1, 1, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '1123', 'é¢ä»è´¦æ¬¾', 1, 1, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '1131', 'åºæ¶è¡å©', 1, 1, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '1132', 'åºæ¶å©æ¯', 1, 1, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '1221', 'å
¶ä»åºæ¶æ¬¾', 1, 1, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '1231', 'åè´¦åå¤', 1, 2, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '1401', 'ææéè´', 1, 1, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '1402', 'å¨éç©èµ', 1, 1, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '1403', 'åææ', 1, 1, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '1405', 'åºååå', 1, 1, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '1406', 'ååºåå', 1, 1, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '1408', 'å§æå å·¥ç©èµ', 1, 1, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '1411', 'å¨è½¬ææ', 1, 1, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '1471', 'åè´§è·ä»·åå¤', 1, 2, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '1501', 'åºææèµ', 1, 1, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '1601', 'åºå®èµäº§', 1, 1, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '1602', 'ç´¯è®¡ææ§', 1, 2, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '1603', 'åºå®èµäº§åå¼åå¤', 1, 2, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '1604', 'å¨å»ºå·¥ç¨', 1, 1, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '1605', 'å·¥ç¨ç©èµ', 1, 1, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '1606', 'åºå®èµäº§æ¸
ç', 1, 1, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '1701', 'æ å½¢èµäº§', 1, 1, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '1702', '累计æé', 1, 2, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '1703', 'æ å½¢èµäº§åå¼åå¤', 1, 2, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '1801', 'é¿æå¾
æè´¹ç¨', 1, 1, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '1811', 'éå»¶æå¾ç¨èµäº§', 1, 1, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '1901', 'å¾
å¤çè´¢äº§ææº¢', 1, 1, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '2001', 'çæå款', 2, 2, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '2201', 'åºä»ç¥¨æ®', 2, 2, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '2202', 'åºä»è´¦æ¬¾', 2, 2, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '2203', '颿¶è´¦æ¬¾', 2, 2, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '2211', 'åºä»èå·¥èªé
¬', 2, 2, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '2221', 'åºäº¤ç¨è´¹', 2, 2, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '2231', 'åºä»å©æ¯', 2, 2, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '2232', 'åºä»è¡å©', 2, 2, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '2241', 'å
¶ä»åºä»æ¬¾', 2, 2, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '2501', 'é¿æåæ¬¾', 2, 2, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '2801', 'é¢è®¡è´åº', 2, 2, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '2901', 'éå»¶æå¾ç¨è´åº', 2, 2, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '4001', '宿¶èµæ¬', 3, 2, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '4002', 'èµæ¬å
¬ç§¯', 3, 2, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '4101', 'çä½å
¬ç§¯', 3, 2, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '4103', 'æ¬å¹´å©æ¶¦', 3, 2, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '4104', '婿¶¦åé
', 3, 2, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '5001', 'çäº§ææ¬', 4, 1, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '5101', 'å¶é è´¹ç¨', 4, 1, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '5201', 'å³å¡ææ¬', 4, 1, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '5301', 'ç 忝åº', 4, 1, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '6001', '主è¥ä¸å¡æ¶å
¥', 5, 2, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '6051', 'å
¶ä»ä¸å¡æ¶å
¥', 5, 2, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '6101', 'å
Œ
ä»·å¼å卿ç', 5, 2, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '6111', 'æèµæ¶ç', 5, 2, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '6301', 'è¥ä¸å¤æ¶å
¥', 5, 2, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '6401', '主è¥ä¸å¡ææ¬', 5, 1, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '6402', 'å
¶ä»ä¸å¡ææ¬', 5, 1, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '6403', 'ç¨éåéå ', 5, 1, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '6601', 'éå®è´¹ç¨', 5, 1, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '6602', '管çè´¹ç¨', 5, 1, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '6603', 'è´¢å¡è´¹ç¨', 5, 1, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '6701', 'èµäº§å弿失', 5, 1, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '6711', 'è¥ä¸å¤æ¯åº', 5, 1, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '6801', 'æå¾ç¨è´¹ç¨', 5, 1, 0, '', '1', NOW(), '1', NOW(), b'0' |
| | | UNION ALL SELECT NULL, '6901', '以å年度æçè°æ´', 5, 1, 0, '', '1', NOW(), '1', NOW(), b'0') AS seed |
| | | WHERE NOT EXISTS (SELECT 1 FROM `fin_account_subject` WHERE `deleted` = b'0'); |
| | |
| | | if (columnWidth < 0) { |
| | | return; |
| | | } |
| | | // åæ®µä¸å£°æäº @ColumnWidth æ¶ï¼ä»¥å£°æå¼ä¸ºä¸éã |
| | | // å¦å注解å¼ä¼è¢«æ¬çç¥è¦çï¼EasyExcel èªå·±ç AbstractHeadColumnWidthStyleStrategyï¼è´è´£æ |
| | | // @ColumnWidth åè¿å宽ï¼ä¸æ¬çç¥ order ç¸åï¼é½æ¯ 0ï¼ææ³¨åé¡ºåºæå¨åé¢ï¼ï¼ |
| | | // æ¬çç¥æå
容é¿åº¦ååï¼ç´æ¥æå£°æçå®½åº¦å²æ ââ ä¾å¦ã2026-10-13 10:10:20ãåªæ 19 个åç¬¦ï¼ |
| | | // å宽就åå¨ 19ï¼å£°æå大乿²¡ç¨ãåæå¤§å¼åï¼æ³¨è§£æäºå
容é¿åº¦çä¸éï¼åªæ¾å®½ä¸æ¶çªã |
| | | if (isHead && head != null && head.getColumnWidthProperty() != null) { |
| | | columnWidth = Math.max(columnWidth, head.getColumnWidthProperty().getWidth()); |
| | | } |
| | | if (columnWidth > MAX_COLUMN_WIDTH) { |
| | | columnWidth = MAX_COLUMN_WIDTH; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.api.finance; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.module.erp.api.finance.dto.ErpFinanceMonthlyStatisticsRespDTO; |
| | | |
| | | import java.time.LocalDateTime; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * ERP è´¢å¡ç»è®¡ API æ¥å£ |
| | | * |
| | | * ä¾è´¢å¡æ¨¡åï¼yudao-module-financeï¼çè´¢å¡æ¥è¡¨ / ä¼è®¡æ ¸ç®çæ¿åæ°ä½¿ç¨ï¼ |
| | | * é¿å
跨模åç´æ¥æ¥ erp çåºè¡¨ |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | public interface ErpFinanceStatisticsApi { |
| | | |
| | | /** |
| | | * ææç»è®¡ ERP çæ¶æ¬¾ã仿¬¾ãéå®è®¢åãéè´è®¢åéé¢ |
| | | * |
| | | * ç»è®¡å£å¾ï¼åªç»è®¡å·²å®¡æ ¸ï¼status = 20ï¼çåæ®ï¼å·²ä½åºã审æ¹ä¸ãè稿çåæ®ä¸è®¡å
¥ |
| | | * |
| | | * @param startTime å¼å§æ¶é´ï¼å«ï¼ |
| | | * @param endTime ç»ææ¶é´ï¼ä¸å«ï¼ |
| | | * @return ææç»è®¡ç»æï¼ææä»½ååºï¼æ²¡ææ°æ®çæä»½ä¸ä¼è¿å |
| | | */ |
| | | CommonResult<List<ErpFinanceMonthlyStatisticsRespDTO>> getMonthlyStatistics(LocalDateTime startTime, |
| | | LocalDateTime endTime); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.api.finance.dto; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | @Schema(description = "RPC æå¡ - ERP è´¢å¡æåº¦ç»è®¡ Response DTO") |
| | | @Data |
| | | public class ErpFinanceMonthlyStatisticsRespDTO { |
| | | |
| | | @Schema(description = "æä»½ï¼æ ¼å¼ yyyy-MM", requiredMode = Schema.RequiredMode.REQUIRED, example = "2026-10") |
| | | private String month; |
| | | |
| | | @Schema(description = "æ¶æ¬¾éé¢ï¼æ¶æ¬¾åï¼", requiredMode = Schema.RequiredMode.REQUIRED, example = "100000.00") |
| | | private BigDecimal receiptPrice; |
| | | |
| | | @Schema(description = "仿¬¾éé¢ï¼ä»æ¬¾åï¼", requiredMode = Schema.RequiredMode.REQUIRED, example = "60000.00") |
| | | private BigDecimal paymentPrice; |
| | | |
| | | @Schema(description = "éå®è®¢åéé¢", requiredMode = Schema.RequiredMode.REQUIRED, example = "150000.00") |
| | | private BigDecimal saleOrderPrice; |
| | | |
| | | @Schema(description = "éè´è®¢åéé¢", requiredMode = Schema.RequiredMode.REQUIRED, example = "80000.00") |
| | | private BigDecimal purchaseOrderPrice; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.api.finance; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.module.erp.api.finance.dto.ErpFinanceMonthlyStatisticsRespDTO; |
| | | import cn.iocoder.yudao.module.erp.dal.mysql.finance.ErpFinanceStatisticsMapper; |
| | | import cn.iocoder.yudao.module.erp.enums.ErpAuditStatus; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.time.LocalDateTime; |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | /** |
| | | * ERP è´¢å¡ç»è®¡ API å®ç°ç±» |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @Service |
| | | @Validated |
| | | public class ErpFinanceStatisticsApiImpl implements ErpFinanceStatisticsApi { |
| | | |
| | | @Resource |
| | | private ErpFinanceStatisticsMapper financeStatisticsMapper; |
| | | |
| | | @Override |
| | | public CommonResult<List<ErpFinanceMonthlyStatisticsRespDTO>> getMonthlyStatistics(LocalDateTime startTime, |
| | | LocalDateTime endTime) { |
| | | return success(financeStatisticsMapper.selectMonthlyStatistics(ErpAuditStatus.APPROVE.getStatus(), |
| | | startTime, endTime)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.dal.mysql.finance; |
| | | |
| | | import cn.iocoder.yudao.module.erp.api.finance.dto.ErpFinanceMonthlyStatisticsRespDTO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | import org.apache.ibatis.annotations.Param; |
| | | |
| | | import java.time.LocalDateTime; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * ERP è´¢å¡ç»è®¡ Mapper |
| | | * |
| | | * ä¸ºè´¢å¡æ¨¡åçæ¥è¡¨ãçæ¿æä¾ææèåçæ¶æ¬¾ / 仿¬¾ / éå®è®¢å / éè´è®¢åéé¢ |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @Mapper |
| | | public interface ErpFinanceStatisticsMapper { |
| | | |
| | | /** |
| | | * ææç»è®¡æ¶æ¬¾ã仿¬¾ãéå®è®¢åãéè´è®¢åéé¢ |
| | | * |
| | | * @param approveStatus å·²å®¡æ ¸ç¶æå¼ |
| | | * @param startTime å¼å§æ¶é´ï¼å«ï¼ |
| | | * @param endTime ç»ææ¶é´ï¼ä¸å«ï¼ |
| | | * @return æåº¦ç»è®¡åè¡¨ï¼ææä»½ååº |
| | | */ |
| | | List<ErpFinanceMonthlyStatisticsRespDTO> selectMonthlyStatistics(@Param("approveStatus") Integer approveStatus, |
| | | @Param("startTime") LocalDateTime startTime, |
| | | @Param("endTime") LocalDateTime endTime); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <?xml version="1.0" encoding="UTF-8"?> |
| | | <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
| | | <mapper namespace="cn.iocoder.yudao.module.erp.dal.mysql.finance.ErpFinanceStatisticsMapper"> |
| | | |
| | | <select id="selectMonthlyStatistics" |
| | | resultType="cn.iocoder.yudao.module.erp.api.finance.dto.ErpFinanceMonthlyStatisticsRespDTO"> |
| | | SELECT t.month AS month, |
| | | IFNULL(SUM(t.receiptPrice), 0) AS receiptPrice, |
| | | IFNULL(SUM(t.paymentPrice), 0) AS paymentPrice, |
| | | IFNULL(SUM(t.saleOrderPrice), 0) AS saleOrderPrice, |
| | | IFNULL(SUM(t.purchaseOrderPrice), 0) AS purchaseOrderPrice |
| | | FROM ( |
| | | SELECT DATE_FORMAT(receipt_time, '%Y-%m') AS month, |
| | | IFNULL(SUM(receipt_price), 0) AS receiptPrice, |
| | | 0 AS paymentPrice, |
| | | 0 AS saleOrderPrice, |
| | | 0 AS purchaseOrderPrice |
| | | FROM erp_finance_receipt |
| | | WHERE deleted = 0 |
| | | AND status = #{approveStatus} |
| | | AND receipt_time >= #{startTime} |
| | | AND receipt_time < #{endTime} |
| | | GROUP BY DATE_FORMAT(receipt_time, '%Y-%m') |
| | | UNION ALL |
| | | SELECT DATE_FORMAT(payment_time, '%Y-%m'), |
| | | IFNULL(SUM(payment_price), 0), |
| | | 0, |
| | | 0, |
| | | 0 |
| | | FROM erp_finance_payment |
| | | WHERE deleted = 0 |
| | | AND status = #{approveStatus} |
| | | AND payment_time >= #{startTime} |
| | | AND payment_time < #{endTime} |
| | | GROUP BY DATE_FORMAT(payment_time, '%Y-%m') |
| | | UNION ALL |
| | | SELECT DATE_FORMAT(order_time, '%Y-%m'), |
| | | IFNULL(SUM(total_price), 0), |
| | | 0, |
| | | 0, |
| | | 0 |
| | | FROM erp_sale_order |
| | | WHERE deleted = 0 |
| | | AND status = #{approveStatus} |
| | | AND order_time >= #{startTime} |
| | | AND order_time < #{endTime} |
| | | GROUP BY DATE_FORMAT(order_time, '%Y-%m') |
| | | UNION ALL |
| | | SELECT DATE_FORMAT(order_time, '%Y-%m'), |
| | | IFNULL(SUM(total_price), 0), |
| | | 0, |
| | | 0, |
| | | 0 |
| | | FROM erp_purchase_order |
| | | WHERE deleted = 0 |
| | | AND status = #{approveStatus} |
| | | AND order_time >= #{startTime} |
| | | AND order_time < #{endTime} |
| | | GROUP BY DATE_FORMAT(order_time, '%Y-%m') |
| | | ) t |
| | | GROUP BY t.month |
| | | ORDER BY t.month |
| | | </select> |
| | | |
| | | </mapper> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <?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</artifactId> |
| | | <packaging>jar</packaging> |
| | | |
| | | <name>${project.artifactId}</name> |
| | | <description> |
| | | finance å
ä¸ï¼è´¢å¡ç®¡çï¼Financial Managementï¼ã |
| | | ä¾å¦è¯´ï¼ä¼è®¡ç§ç®ãåè¯ãæ»è´¦ãæç»è´¦ãåºå®èµäº§ãæ å½¢èµäº§ãè´¢å¡æ¥è¡¨çç |
| | | </description> |
| | | |
| | | <dependencies> |
| | | <!-- System 模åï¼æä»¶ä¸ä¼ èµ° system 模åç Storage éä»¶æºå¶ï¼ --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-module-system</artifactId> |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <!-- ERP 模å APIï¼è´¢å¡æ¥è¡¨éè¦è¯»åæ¶ä»æ¬¾åãéè´éå®è®¢åæ°æ®ï¼ --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-module-erp-api</artifactId> |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <!-- Web ç¸å
³ --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-spring-boot-starter-web</artifactId> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-spring-boot-starter-security</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- DB ç¸å
³ --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-spring-boot-starter-mybatis</artifactId> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-spring-boot-starter-redis</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- å·¥å
·ç±»ç¸å
³ --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-spring-boot-starter-excel</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- Test æµè¯ç¸å
³ --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-spring-boot-starter-test</artifactId> |
| | | </dependency> |
| | | </dependencies> |
| | | |
| | | </project> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.controller.admin.asset; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.collection.MapUtils; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.asset.vo.FinFixedAssetDepreciateRespVO; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.asset.vo.FinFixedAssetPageReqVO; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.asset.vo.FinFixedAssetRespVO; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.asset.vo.FinFixedAssetSaveReqVO; |
| | | import cn.iocoder.yudao.module.finance.dal.dataobject.asset.FinFixedAssetDO; |
| | | import cn.iocoder.yudao.module.finance.service.asset.FinAssetAmountUtils; |
| | | import cn.iocoder.yudao.module.finance.service.asset.FinFixedAssetService; |
| | | import cn.iocoder.yudao.module.system.api.dept.DeptApi; |
| | | import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | | import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | | import jakarta.validation.Valid; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.io.IOException; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.Set; |
| | | |
| | | import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| | | |
| | | @Tag(name = "管çåå° - åºå®èµäº§") |
| | | @RestController |
| | | @RequestMapping("/finance/fixed-asset") |
| | | @Validated |
| | | public class FinFixedAssetController { |
| | | |
| | | @Resource |
| | | private FinFixedAssetService fixedAssetService; |
| | | @Resource |
| | | private DeptApi deptApi; |
| | | @Resource |
| | | private AdminUserApi adminUserApi; |
| | | |
| | | @PostMapping("/create") |
| | | @Operation(summary = "å建åºå®èµäº§") |
| | | @PreAuthorize("@ss.hasPermission('finance:fixed-asset:create')") |
| | | public CommonResult<Long> createFixedAsset(@Valid @RequestBody FinFixedAssetSaveReqVO createReqVO) { |
| | | return success(fixedAssetService.createFixedAsset(createReqVO)); |
| | | } |
| | | |
| | | @PutMapping("/update") |
| | | @Operation(summary = "æ´æ°åºå®èµäº§") |
| | | @PreAuthorize("@ss.hasPermission('finance:fixed-asset:update')") |
| | | public CommonResult<Boolean> updateFixedAsset(@Valid @RequestBody FinFixedAssetSaveReqVO updateReqVO) { |
| | | fixedAssetService.updateFixedAsset(updateReqVO); |
| | | return success(true); |
| | | } |
| | | |
| | | @DeleteMapping("/delete") |
| | | @Operation(summary = "å é¤åºå®èµäº§") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true) |
| | | @PreAuthorize("@ss.hasPermission('finance:fixed-asset:delete')") |
| | | public CommonResult<Boolean> deleteFixedAsset(@RequestParam("id") Long id) { |
| | | fixedAssetService.deleteFixedAsset(id); |
| | | return success(true); |
| | | } |
| | | |
| | | @DeleteMapping("/delete-list") |
| | | @Operation(summary = "æ¹éå é¤åºå®èµäº§") |
| | | @Parameter(name = "ids", description = "ç¼å·å表", required = true) |
| | | @PreAuthorize("@ss.hasPermission('finance:fixed-asset:delete')") |
| | | public CommonResult<Boolean> deleteFixedAssetList(@RequestParam("ids") List<Long> ids) { |
| | | fixedAssetService.deleteFixedAssetList(ids); |
| | | return success(true); |
| | | } |
| | | |
| | | @PostMapping("/depreciate") |
| | | @Operation(summary = "è®¡æææ§", description = "æèµäº§é个计æä¸ä¸ªæçææ§ï¼ids 为空æ¶å¯¹æææªæ¥åºèµäº§è®¡æ") |
| | | @Parameter(name = "ids", description = "èµäº§ç¼å·å表ï¼ä¸ºç©ºè¡¨ç¤ºå
¨é¨", required = false) |
| | | @PreAuthorize("@ss.hasPermission('finance:fixed-asset:depreciate')") |
| | | public CommonResult<FinFixedAssetDepreciateRespVO> depreciateFixedAssetList( |
| | | @RequestParam(value = "ids", required = false) List<Long> ids) { |
| | | return success(fixedAssetService.depreciateFixedAssetList(ids)); |
| | | } |
| | | |
| | | @GetMapping("/get") |
| | | @Operation(summary = "è·å¾åºå®èµäº§") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true, example = "1024") |
| | | @PreAuthorize("@ss.hasPermission('finance:fixed-asset:query')") |
| | | public CommonResult<FinFixedAssetRespVO> getFixedAsset(@RequestParam("id") Long id) { |
| | | FinFixedAssetDO asset = fixedAssetService.getFixedAsset(id); |
| | | if (asset == null) { |
| | | return success(null); |
| | | } |
| | | FinFixedAssetRespVO respVO = toRespVO(asset); |
| | | fillDepartmentAndKeeper(List.of(respVO)); |
| | | return success(respVO); |
| | | } |
| | | |
| | | @GetMapping("/page") |
| | | @Operation(summary = "è·å¾åºå®èµäº§å页") |
| | | @PreAuthorize("@ss.hasPermission('finance:fixed-asset:query')") |
| | | public CommonResult<PageResult<FinFixedAssetRespVO>> getFixedAssetPage(@Valid FinFixedAssetPageReqVO pageReqVO) { |
| | | PageResult<FinFixedAssetDO> pageResult = fixedAssetService.getFixedAssetPage(pageReqVO); |
| | | PageResult<FinFixedAssetRespVO> result = BeanUtils.toBean(pageResult, FinFixedAssetRespVO.class, |
| | | this::fillMonthlyDepreciation); |
| | | fillDepartmentAndKeeper(result.getList()); |
| | | return success(result); |
| | | } |
| | | |
| | | @GetMapping("/list") |
| | | @Operation(summary = "è·å¾åºå®èµäº§å表") |
| | | @PreAuthorize("@ss.hasPermission('finance:fixed-asset:query')") |
| | | public CommonResult<List<FinFixedAssetRespVO>> getFixedAssetList() { |
| | | List<FinFixedAssetDO> list = fixedAssetService.getFixedAssetList(); |
| | | List<FinFixedAssetRespVO> voList = convertList(list, this::toRespVO); |
| | | fillDepartmentAndKeeper(voList); |
| | | return success(voList); |
| | | } |
| | | |
| | | @GetMapping("/export-excel") |
| | | @Operation(summary = "导åºåºå®èµäº§ Excel") |
| | | @PreAuthorize("@ss.hasPermission('finance:fixed-asset:export')") |
| | | @ApiAccessLog(operateType = EXPORT) |
| | | public void exportFixedAssetExcel(@Valid FinFixedAssetPageReqVO pageReqVO, |
| | | HttpServletResponse response) throws IOException { |
| | | pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); |
| | | List<FinFixedAssetDO> list = fixedAssetService.getFixedAssetPage(pageReqVO).getList(); |
| | | List<FinFixedAssetRespVO> voList = BeanUtils.toBean(list, FinFixedAssetRespVO.class, |
| | | this::fillMonthlyDepreciation); |
| | | fillDepartmentAndKeeper(voList); |
| | | // å¯¼åº Excel |
| | | ExcelUtils.write(response, "åºå®èµäº§.xls", "æ°æ®", FinFixedAssetRespVO.class, voList); |
| | | } |
| | | |
| | | private FinFixedAssetRespVO toRespVO(FinFixedAssetDO asset) { |
| | | return fillMonthlyDepreciation(BeanUtils.toBean(asset, FinFixedAssetRespVO.class)); |
| | | } |
| | | |
| | | /** |
| | | * åå¡«æææ§é¢ï¼ä¸è½åºï¼ä»
ç¨äºå±ç¤ºï¼å£å¾ä¸è®¡æææ§ä¸è´ï¼ |
| | | */ |
| | | private FinFixedAssetRespVO fillMonthlyDepreciation(FinFixedAssetRespVO respVO) { |
| | | if (respVO.getUsefulLife() == null || respVO.getUsefulLife() <= 0 |
| | | || respVO.getOriginalValue() == null) { |
| | | return respVO; |
| | | } |
| | | return respVO.setMonthlyDepreciation(FinAssetAmountUtils.calcMonthlyAmount( |
| | | respVO.getOriginalValue(), respVO.getResidualRate(), respVO.getUsefulLife())); |
| | | } |
| | | |
| | | /** |
| | | * æ¹éåå¡«ã使ç¨é¨é¨åç§°ãä¸ãä¿ç®¡äººæµç§°ãã |
| | | * |
| | | * DO ä¸åçæ¯ departmentId / keeperIdï¼èå表ä¸å¯¼åºè¦å±ç¤ºåç§°ï¼ |
| | | * æä»¥æ ERP æ¶æ¬¾åçæ¢æå£å¾ï¼å¨è¿éæé¨é¨ãç¨æ·åæ¹éæ¥ä¸æ¬¡ååå¡«ï¼é¿å
éè¡æ¥åºã |
| | | * è§£æä¸å°çï¼é¨é¨/ç¨æ·è¢«å é¤ãç¼å·ä¸ºç©ºï¼å°±ä¿æä¸ºç©ºï¼ä¸æå¼å¸¸ã |
| | | */ |
| | | private void fillDepartmentAndKeeper(List<FinFixedAssetRespVO> list) { |
| | | if (CollUtil.isEmpty(list)) { |
| | | return; |
| | | } |
| | | Set<Long> deptIds = convertSet(list, FinFixedAssetRespVO::getDepartmentId, |
| | | respVO -> respVO.getDepartmentId() != null); |
| | | Set<Long> keeperIds = convertSet(list, FinFixedAssetRespVO::getKeeperId, |
| | | respVO -> respVO.getKeeperId() != null); |
| | | Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(deptIds); |
| | | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(keeperIds); |
| | | list.forEach(respVO -> { |
| | | MapUtils.findAndThen(deptMap, respVO.getDepartmentId(), |
| | | dept -> respVO.setDepartmentName(dept.getName())); |
| | | MapUtils.findAndThen(userMap, respVO.getKeeperId(), |
| | | user -> respVO.setKeeperName(user.getNickname())); |
| | | }); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.controller.admin.asset; |
| | | |
| | | import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.asset.vo.FinIntangibleAssetAmortizeRespVO; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.asset.vo.FinIntangibleAssetPageReqVO; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.asset.vo.FinIntangibleAssetRespVO; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.asset.vo.FinIntangibleAssetSaveReqVO; |
| | | import cn.iocoder.yudao.module.finance.dal.dataobject.asset.FinIntangibleAssetDO; |
| | | import cn.iocoder.yudao.module.finance.service.asset.FinAssetAmountUtils; |
| | | import cn.iocoder.yudao.module.finance.service.asset.FinIntangibleAssetService; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | | import jakarta.validation.Valid; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.io.IOException; |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; |
| | | |
| | | @Tag(name = "管çåå° - æ å½¢èµäº§") |
| | | @RestController |
| | | @RequestMapping("/finance/intangible-asset") |
| | | @Validated |
| | | public class FinIntangibleAssetController { |
| | | |
| | | @Resource |
| | | private FinIntangibleAssetService intangibleAssetService; |
| | | |
| | | @PostMapping("/create") |
| | | @Operation(summary = "å建æ å½¢èµäº§") |
| | | @PreAuthorize("@ss.hasPermission('finance:intangible-asset:create')") |
| | | public CommonResult<Long> createIntangibleAsset(@Valid @RequestBody FinIntangibleAssetSaveReqVO createReqVO) { |
| | | return success(intangibleAssetService.createIntangibleAsset(createReqVO)); |
| | | } |
| | | |
| | | @PutMapping("/update") |
| | | @Operation(summary = "æ´æ°æ å½¢èµäº§") |
| | | @PreAuthorize("@ss.hasPermission('finance:intangible-asset:update')") |
| | | public CommonResult<Boolean> updateIntangibleAsset(@Valid @RequestBody FinIntangibleAssetSaveReqVO updateReqVO) { |
| | | intangibleAssetService.updateIntangibleAsset(updateReqVO); |
| | | return success(true); |
| | | } |
| | | |
| | | @DeleteMapping("/delete") |
| | | @Operation(summary = "å 餿 å½¢èµäº§") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true) |
| | | @PreAuthorize("@ss.hasPermission('finance:intangible-asset:delete')") |
| | | public CommonResult<Boolean> deleteIntangibleAsset(@RequestParam("id") Long id) { |
| | | intangibleAssetService.deleteIntangibleAsset(id); |
| | | return success(true); |
| | | } |
| | | |
| | | @DeleteMapping("/delete-list") |
| | | @Operation(summary = "æ¹éå 餿 å½¢èµäº§") |
| | | @Parameter(name = "ids", description = "ç¼å·å表", required = true) |
| | | @PreAuthorize("@ss.hasPermission('finance:intangible-asset:delete')") |
| | | public CommonResult<Boolean> deleteIntangibleAssetList(@RequestParam("ids") List<Long> ids) { |
| | | intangibleAssetService.deleteIntangibleAssetList(ids); |
| | | return success(true); |
| | | } |
| | | |
| | | @PostMapping("/amortize") |
| | | @Operation(summary = "计ææé", description = "æèµäº§é个计æä¸ä¸ªæçæéï¼ids 为空æ¶å¯¹æææªå¤±æèµäº§è®¡æ") |
| | | @Parameter(name = "ids", description = "èµäº§ç¼å·å表ï¼ä¸ºç©ºè¡¨ç¤ºå
¨é¨", required = false) |
| | | @PreAuthorize("@ss.hasPermission('finance:intangible-asset:amortize')") |
| | | public CommonResult<FinIntangibleAssetAmortizeRespVO> amortizeIntangibleAssetList( |
| | | @RequestParam(value = "ids", required = false) List<Long> ids) { |
| | | return success(intangibleAssetService.amortizeIntangibleAssetList(ids)); |
| | | } |
| | | |
| | | @GetMapping("/get") |
| | | @Operation(summary = "è·å¾æ å½¢èµäº§") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true, example = "1024") |
| | | @PreAuthorize("@ss.hasPermission('finance:intangible-asset:query')") |
| | | public CommonResult<FinIntangibleAssetRespVO> getIntangibleAsset(@RequestParam("id") Long id) { |
| | | FinIntangibleAssetDO asset = intangibleAssetService.getIntangibleAsset(id); |
| | | return success(asset == null ? null : toRespVO(asset)); |
| | | } |
| | | |
| | | @GetMapping("/page") |
| | | @Operation(summary = "è·å¾æ å½¢èµäº§å页") |
| | | @PreAuthorize("@ss.hasPermission('finance:intangible-asset:query')") |
| | | public CommonResult<PageResult<FinIntangibleAssetRespVO>> getIntangibleAssetPage( |
| | | @Valid FinIntangibleAssetPageReqVO pageReqVO) { |
| | | PageResult<FinIntangibleAssetDO> pageResult = intangibleAssetService.getIntangibleAssetPage(pageReqVO); |
| | | return success(BeanUtils.toBean(pageResult, FinIntangibleAssetRespVO.class, this::fillMonthlyAmortization)); |
| | | } |
| | | |
| | | @GetMapping("/list") |
| | | @Operation(summary = "è·å¾æ å½¢èµäº§å表") |
| | | @PreAuthorize("@ss.hasPermission('finance:intangible-asset:query')") |
| | | public CommonResult<List<FinIntangibleAssetRespVO>> getIntangibleAssetList() { |
| | | List<FinIntangibleAssetDO> list = intangibleAssetService.getIntangibleAssetList(); |
| | | return success(convertList(list, this::toRespVO)); |
| | | } |
| | | |
| | | @GetMapping("/export-excel") |
| | | @Operation(summary = "å¯¼åºæ å½¢èµäº§ Excel") |
| | | @PreAuthorize("@ss.hasPermission('finance:intangible-asset:export')") |
| | | @ApiAccessLog(operateType = EXPORT) |
| | | public void exportIntangibleAssetExcel(@Valid FinIntangibleAssetPageReqVO pageReqVO, |
| | | HttpServletResponse response) throws IOException { |
| | | pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); |
| | | List<FinIntangibleAssetDO> list = intangibleAssetService.getIntangibleAssetPage(pageReqVO).getList(); |
| | | // å¯¼åº Excel |
| | | ExcelUtils.write(response, "æ å½¢èµäº§.xls", "æ°æ®", FinIntangibleAssetRespVO.class, |
| | | BeanUtils.toBean(list, FinIntangibleAssetRespVO.class, this::fillMonthlyAmortization)); |
| | | } |
| | | |
| | | private FinIntangibleAssetRespVO toRespVO(FinIntangibleAssetDO asset) { |
| | | return fillMonthlyAmortization(BeanUtils.toBean(asset, FinIntangibleAssetRespVO.class)); |
| | | } |
| | | |
| | | /** |
| | | * åå¡«ææéé¢ï¼ä¸è½åºï¼ä»
ç¨äºå±ç¤ºï¼å£å¾ä¸è®¡ææéä¸è´ï¼ |
| | | */ |
| | | private FinIntangibleAssetRespVO fillMonthlyAmortization(FinIntangibleAssetRespVO respVO) { |
| | | if (respVO.getAmortizationPeriod() == null || respVO.getAmortizationPeriod() <= 0 |
| | | || respVO.getOriginalValue() == null) { |
| | | return respVO; |
| | | } |
| | | return respVO.setMonthlyAmortization(FinAssetAmountUtils.calcMonthlyAmount( |
| | | respVO.getOriginalValue(), respVO.getResidualRate(), respVO.getAmortizationPeriod())); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.controller.admin.asset.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | @Schema(description = "管çåå° - åºå®èµäº§è®¡æææ§ Response VO") |
| | | @Data |
| | | public class FinFixedAssetDepreciateRespVO { |
| | | |
| | | @Schema(description = "æ¬æ¬¡è®¡æææ§çèµäº§æ°é", requiredMode = Schema.RequiredMode.REQUIRED, example = "3") |
| | | private Integer processedCount; |
| | | |
| | | @Schema(description = "æ¬æ¬¡è®¡æçæææ§é¢å计", requiredMode = Schema.RequiredMode.REQUIRED, example = "2850.00") |
| | | private BigDecimal totalMonthlyDepreciation; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.controller.admin.asset.vo; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import lombok.ToString; |
| | | import org.springframework.format.annotation.DateTimeFormat; |
| | | |
| | | import java.time.LocalDate; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; |
| | | |
| | | @Schema(description = "管çåå° - åºå®èµäº§å页 Request VO") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | public class FinFixedAssetPageReqVO extends PageParam { |
| | | |
| | | @Schema(description = "èµäº§ç¼å·", example = "GD202610120001") |
| | | private String assetCode; |
| | | |
| | | @Schema(description = "èµäº§åç§°", example = "æ°æ§è½¦åº") |
| | | private String assetName; |
| | | |
| | | @Schema(description = "èµäº§ç±»å«", example = "ç产设å¤") |
| | | private String category; |
| | | |
| | | @Schema(description = "使ç¨é¨é¨ç¼å·", example = "100") |
| | | private Long departmentId; |
| | | |
| | | @Schema(description = "ä¿ç®¡äººç¼å·ï¼ç¨æ·ç¼å·ï¼", example = "1") |
| | | private Long keeperId; |
| | | |
| | | @Schema(description = "ç¶æ", example = "1") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "è´ç½®æ¥æåºé´") |
| | | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) |
| | | private LocalDate[] purchaseDate; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.controller.admin.asset.vo; |
| | | |
| | | import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; |
| | | import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; |
| | | import cn.iocoder.yudao.module.finance.enums.DictTypeConstants; |
| | | import cn.idev.excel.annotation.ExcelIgnoreUnannotated; |
| | | import cn.idev.excel.annotation.ExcelProperty; |
| | | import cn.idev.excel.annotation.write.style.ColumnWidth; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Schema(description = "管çåå° - åºå®èµäº§ Response VO") |
| | | @Data |
| | | @ExcelIgnoreUnannotated |
| | | public class FinFixedAssetRespVO { |
| | | |
| | | @Schema(description = "èµäº§ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") |
| | | private Long id; |
| | | |
| | | @Schema(description = "èµäº§ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "GD202610120001") |
| | | @ExcelProperty("èµäº§ç¼å·") |
| | | private String assetCode; |
| | | |
| | | @Schema(description = "èµäº§åç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "æ°æ§è½¦åº") |
| | | @ExcelProperty("èµäº§åç§°") |
| | | private String assetName; |
| | | |
| | | @Schema(description = "èµäº§ç±»å«", example = "ç产设å¤") |
| | | @ExcelProperty("èµäº§ç±»å«") |
| | | private String category; |
| | | |
| | | @Schema(description = "è§æ ¼åå·", example = "CK6140") |
| | | @ExcelProperty("è§æ ¼åå·") |
| | | private String specification; |
| | | |
| | | @Schema(description = "è´ç½®æ¥æ", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | @ExcelProperty("è´ç½®æ¥æ") |
| | | private LocalDate purchaseDate; |
| | | |
| | | @Schema(description = "èµäº§åå¼", requiredMode = Schema.RequiredMode.REQUIRED, example = "120000.00") |
| | | @ExcelProperty("èµäº§åå¼") |
| | | private BigDecimal originalValue; |
| | | |
| | | @Schema(description = "使ç¨å¹´éï¼å¹´ï¼", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") |
| | | @ExcelProperty("使ç¨å¹´é(å¹´)") |
| | | private Integer usefulLife; |
| | | |
| | | @Schema(description = "æ®å¼çï¼%ï¼", example = "5.00") |
| | | @ExcelProperty("æ®å¼ç(%)") |
| | | private BigDecimal residualRate; |
| | | |
| | | @Schema(description = "æææ§é¢", example = "950.00") |
| | | @ExcelProperty("æææ§é¢") |
| | | private BigDecimal monthlyDepreciation; |
| | | |
| | | @Schema(description = "ç´¯è®¡ææ§", requiredMode = Schema.RequiredMode.REQUIRED, example = "11400.00") |
| | | @ExcelProperty("ç´¯è®¡ææ§") |
| | | private BigDecimal accumulatedDepreciation; |
| | | |
| | | @Schema(description = "åå¼", requiredMode = Schema.RequiredMode.REQUIRED, example = "108600.00") |
| | | @ExcelProperty("åå¼") |
| | | private BigDecimal netValue; |
| | | |
| | | @Schema(description = "åæ¾å°ç¹", example = "ä¸å·è½¦é´") |
| | | @ExcelProperty("åæ¾å°ç¹") |
| | | private String location; |
| | | |
| | | @Schema(description = "使ç¨é¨é¨ç¼å·", example = "100") |
| | | private Long departmentId; |
| | | |
| | | /** |
| | | * 使ç¨é¨é¨åç§°ï¼åè¡¨ä¸ Excel 导åºç¨ã |
| | | * departmentId åçæ¯é¨é¨ç¼å·ï¼ç´æ¥å±ç¤ºå°±æ¯ä¸ä¸²æ°åï¼æä»¥å¦ç¨è¿ä¸ªå段æ¿è½½åç§°ï¼ |
| | | * ä¸åè¯çå¶å人æµç§° creatorName åä¸å¥å£å¾ï¼ç± Controller æ¹éè§£æååå¡«ã |
| | | */ |
| | | @Schema(description = "使ç¨é¨é¨åç§°", example = "ç产é¨") |
| | | @ExcelProperty("使ç¨é¨é¨") |
| | | private String departmentName; |
| | | |
| | | @Schema(description = "ä¿ç®¡äººç¼å·ï¼ç¨æ·ç¼å·ï¼", example = "1") |
| | | private Long keeperId; |
| | | |
| | | @Schema(description = "ä¿ç®¡äººæµç§°", example = "å¼ ä¸") |
| | | @ExcelProperty("ä¿ç®¡äºº") |
| | | private String keeperName; |
| | | |
| | | @Schema(description = "ç¶æ", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @ExcelProperty(value = "ç¶æ", converter = DictConvert.class) |
| | | @DictFormat(DictTypeConstants.FIXED_ASSET_STATUS) |
| | | private Integer status; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨") |
| | | @ExcelProperty("夿³¨") |
| | | private String remark; |
| | | |
| | | @Schema(description = "å建æ¶é´", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | // ãyyyy-MM-dd HH:mm:ssãæ£å¥½ 19 个å符ï¼èªéåºå宽就åªç» 19ï¼è´´çè¾¹å¾é¾çï¼è¿éæ¾å®½å° 22 |
| | | @ColumnWidth(22) |
| | | @ExcelProperty("å建æ¶é´") |
| | | private LocalDateTime createTime; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.controller.admin.asset.vo; |
| | | |
| | | import cn.iocoder.yudao.framework.common.validation.InEnum; |
| | | import cn.iocoder.yudao.module.finance.enums.FinFixedAssetStatusEnum; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import jakarta.validation.constraints.DecimalMax; |
| | | import jakarta.validation.constraints.DecimalMin; |
| | | import jakarta.validation.constraints.Min; |
| | | import jakarta.validation.constraints.NotEmpty; |
| | | import jakarta.validation.constraints.NotNull; |
| | | import jakarta.validation.constraints.Size; |
| | | import lombok.Data; |
| | | import org.springframework.format.annotation.DateTimeFormat; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; |
| | | |
| | | @Schema(description = "管çåå° - åºå®èµäº§æ°å¢/ä¿®æ¹ Request VO") |
| | | @Data |
| | | public class FinFixedAssetSaveReqVO { |
| | | |
| | | @Schema(description = "èµäº§ç¼å·", example = "1024") |
| | | private Long id; |
| | | |
| | | @Schema(description = "èµäº§ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "GD202610120001") |
| | | @NotEmpty(message = "èµäº§ç¼å·ä¸è½ä¸ºç©º") |
| | | @Size(max = 64, message = "èµäº§ç¼å·é¿åº¦ä¸è½è¶
è¿ 64 个å符") |
| | | private String assetCode; |
| | | |
| | | @Schema(description = "èµäº§åç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "æ°æ§è½¦åº") |
| | | @NotEmpty(message = "èµäº§åç§°ä¸è½ä¸ºç©º") |
| | | @Size(max = 128, message = "èµäº§åç§°é¿åº¦ä¸è½è¶
è¿ 128 个å符") |
| | | private String assetName; |
| | | |
| | | @Schema(description = "èµäº§ç±»å«", example = "ç产设å¤") |
| | | @Size(max = 64, message = "èµäº§ç±»å«é¿åº¦ä¸è½è¶
è¿ 64 个å符") |
| | | private String category; |
| | | |
| | | @Schema(description = "è§æ ¼åå·", example = "CK6140") |
| | | @Size(max = 255, message = "è§æ ¼åå·é¿åº¦ä¸è½è¶
è¿ 255 个å符") |
| | | private String specification; |
| | | |
| | | @Schema(description = "è´ç½®æ¥æ", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | @NotNull(message = "è´ç½®æ¥æä¸è½ä¸ºç©º") |
| | | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) |
| | | private LocalDate purchaseDate; |
| | | |
| | | @Schema(description = "èµäº§åå¼", requiredMode = Schema.RequiredMode.REQUIRED, example = "120000.00") |
| | | @NotNull(message = "èµäº§åå¼ä¸è½ä¸ºç©º") |
| | | @DecimalMin(value = "0", message = "èµäº§åå¼ä¸è½å°äº 0") |
| | | private BigDecimal originalValue; |
| | | |
| | | @Schema(description = "使ç¨å¹´éï¼å¹´ï¼", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") |
| | | @NotNull(message = "使ç¨å¹´éä¸è½ä¸ºç©º") |
| | | @Min(value = 1, message = "使ç¨å¹´éå¿
须大äºçäº 1 å¹´") |
| | | private Integer usefulLife; |
| | | |
| | | @Schema(description = "æ®å¼çï¼%ï¼", example = "5.00") |
| | | @DecimalMin(value = "0", message = "æ®å¼çä¸è½å°äº 0") |
| | | @DecimalMax(value = "100", message = "æ®å¼çä¸è½å¤§äº 100") |
| | | private BigDecimal residualRate; |
| | | |
| | | @Schema(description = "åæ¾å°ç¹", example = "ä¸å·è½¦é´") |
| | | @Size(max = 255, message = "åæ¾å°ç¹é¿åº¦ä¸è½è¶
è¿ 255 个å符") |
| | | private String location; |
| | | |
| | | @Schema(description = "使ç¨é¨é¨ç¼å·", example = "100") |
| | | private Long departmentId; |
| | | |
| | | @Schema(description = "ä¿ç®¡äººç¼å·ï¼ç¨æ·ç¼å·ï¼", example = "1") |
| | | private Long keeperId; |
| | | |
| | | @Schema(description = "ç¶æ", example = "1") |
| | | @InEnum(value = FinFixedAssetStatusEnum.class, message = "ç¶æå¿
é¡»æ¯ {value}") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨") |
| | | @Size(max = 500, message = "夿³¨é¿åº¦ä¸è½è¶
è¿ 500 个å符") |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.controller.admin.asset.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | @Schema(description = "管çåå° - æ å½¢èµäº§è®¡ææé Response VO") |
| | | @Data |
| | | public class FinIntangibleAssetAmortizeRespVO { |
| | | |
| | | @Schema(description = "æ¬æ¬¡è®¡ææéçèµäº§æ°é", requiredMode = Schema.RequiredMode.REQUIRED, example = "3") |
| | | private Integer processedCount; |
| | | |
| | | @Schema(description = "æ¬æ¬¡è®¡æçææéé¢å计", requiredMode = Schema.RequiredMode.REQUIRED, example = "3000.00") |
| | | private BigDecimal totalMonthlyAmortization; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.controller.admin.asset.vo; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import lombok.ToString; |
| | | import org.springframework.format.annotation.DateTimeFormat; |
| | | |
| | | import java.time.LocalDate; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; |
| | | |
| | | @Schema(description = "管çåå° - æ å½¢èµäº§å页 Request VO") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | public class FinIntangibleAssetPageReqVO extends PageParam { |
| | | |
| | | @Schema(description = "èµäº§ç¼å·", example = "WX202610120001") |
| | | private String assetCode; |
| | | |
| | | @Schema(description = "èµäº§åç§°", example = "ERP 软件è使") |
| | | private String assetName; |
| | | |
| | | @Schema(description = "èµäº§ç±»å«", example = "软件") |
| | | private String category; |
| | | |
| | | @Schema(description = "è¯ä¹¦ç¼å·", example = "软èç»å第 1234567 å·") |
| | | private String certificateNo; |
| | | |
| | | @Schema(description = "ç¶æ", example = "1") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "å徿¥æåºé´") |
| | | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) |
| | | private LocalDate[] acquisitionDate; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.controller.admin.asset.vo; |
| | | |
| | | import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; |
| | | import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; |
| | | import cn.iocoder.yudao.module.finance.enums.DictTypeConstants; |
| | | import cn.idev.excel.annotation.ExcelIgnoreUnannotated; |
| | | import cn.idev.excel.annotation.ExcelProperty; |
| | | import cn.idev.excel.annotation.write.style.ColumnWidth; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Schema(description = "管çåå° - æ å½¢èµäº§ Response VO") |
| | | @Data |
| | | @ExcelIgnoreUnannotated |
| | | public class FinIntangibleAssetRespVO { |
| | | |
| | | @Schema(description = "èµäº§ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") |
| | | private Long id; |
| | | |
| | | @Schema(description = "èµäº§ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "WX202610120001") |
| | | @ExcelProperty("èµäº§ç¼å·") |
| | | private String assetCode; |
| | | |
| | | @Schema(description = "èµäº§åç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "ERP 软件è使") |
| | | @ExcelProperty("èµäº§åç§°") |
| | | private String assetName; |
| | | |
| | | @Schema(description = "èµäº§ç±»å«", example = "软件") |
| | | @ExcelProperty("èµäº§ç±»å«") |
| | | private String category; |
| | | |
| | | @Schema(description = "è¯ä¹¦ç¼å·", example = "软èç»å第 1234567 å·") |
| | | @ExcelProperty("è¯ä¹¦ç¼å·") |
| | | private String certificateNo; |
| | | |
| | | @Schema(description = "å徿¥æ", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | @ExcelProperty("å徿¥æ") |
| | | private LocalDate acquisitionDate; |
| | | |
| | | @Schema(description = "èµäº§åå¼", requiredMode = Schema.RequiredMode.REQUIRED, example = "60000.00") |
| | | @ExcelProperty("èµäº§åå¼") |
| | | private BigDecimal originalValue; |
| | | |
| | | @Schema(description = "æéå¹´éï¼å¹´ï¼", requiredMode = Schema.RequiredMode.REQUIRED, example = "5") |
| | | @ExcelProperty("æéå¹´é(å¹´)") |
| | | private Integer amortizationPeriod; |
| | | |
| | | @Schema(description = "æ®å¼çï¼%ï¼", example = "0.00") |
| | | @ExcelProperty("æ®å¼ç(%)") |
| | | private BigDecimal residualRate; |
| | | |
| | | @Schema(description = "ææéé¢", example = "1000.00") |
| | | @ExcelProperty("ææéé¢") |
| | | private BigDecimal monthlyAmortization; |
| | | |
| | | @Schema(description = "累计æé", requiredMode = Schema.RequiredMode.REQUIRED, example = "20000.00") |
| | | @ExcelProperty("累计æé") |
| | | private BigDecimal accumulatedAmortization; |
| | | |
| | | @Schema(description = "åå¼", requiredMode = Schema.RequiredMode.REQUIRED, example = "40000.00") |
| | | @ExcelProperty("åå¼") |
| | | private BigDecimal netValue; |
| | | |
| | | @Schema(description = "æææè³") |
| | | @ExcelProperty("æææè³") |
| | | private LocalDate validityDate; |
| | | |
| | | @Schema(description = "ç¶æ", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @ExcelProperty(value = "ç¶æ", converter = DictConvert.class) |
| | | @DictFormat(DictTypeConstants.INTANGIBLE_ASSET_STATUS) |
| | | private Integer status; |
| | | |
| | | @Schema(description = "èµäº§æè¿°", example = "æè¿°") |
| | | @ExcelProperty("èµäº§æè¿°") |
| | | private String description; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨") |
| | | @ExcelProperty("夿³¨") |
| | | private String remark; |
| | | |
| | | @Schema(description = "å建æ¶é´", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | // ãyyyy-MM-dd HH:mm:ssãæ£å¥½ 19 个å符ï¼èªéåºå宽就åªç» 19ï¼è´´çè¾¹å¾é¾çï¼è¿éæ¾å®½å° 22 |
| | | @ColumnWidth(22) |
| | | @ExcelProperty("å建æ¶é´") |
| | | private LocalDateTime createTime; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.controller.admin.asset.vo; |
| | | |
| | | import cn.iocoder.yudao.framework.common.validation.InEnum; |
| | | import cn.iocoder.yudao.module.finance.enums.FinIntangibleAssetStatusEnum; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import jakarta.validation.constraints.DecimalMax; |
| | | import jakarta.validation.constraints.DecimalMin; |
| | | import jakarta.validation.constraints.Min; |
| | | import jakarta.validation.constraints.NotEmpty; |
| | | import jakarta.validation.constraints.NotNull; |
| | | import jakarta.validation.constraints.Size; |
| | | import lombok.Data; |
| | | import org.springframework.format.annotation.DateTimeFormat; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; |
| | | |
| | | @Schema(description = "管çåå° - æ å½¢èµäº§æ°å¢/ä¿®æ¹ Request VO") |
| | | @Data |
| | | public class FinIntangibleAssetSaveReqVO { |
| | | |
| | | @Schema(description = "èµäº§ç¼å·", example = "1024") |
| | | private Long id; |
| | | |
| | | @Schema(description = "èµäº§ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "WX202610120001") |
| | | @NotEmpty(message = "èµäº§ç¼å·ä¸è½ä¸ºç©º") |
| | | @Size(max = 64, message = "èµäº§ç¼å·é¿åº¦ä¸è½è¶
è¿ 64 个å符") |
| | | private String assetCode; |
| | | |
| | | @Schema(description = "èµäº§åç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "ERP 软件è使") |
| | | @NotEmpty(message = "èµäº§åç§°ä¸è½ä¸ºç©º") |
| | | @Size(max = 128, message = "èµäº§åç§°é¿åº¦ä¸è½è¶
è¿ 128 个å符") |
| | | private String assetName; |
| | | |
| | | @Schema(description = "èµäº§ç±»å«", example = "软件") |
| | | @Size(max = 64, message = "èµäº§ç±»å«é¿åº¦ä¸è½è¶
è¿ 64 个å符") |
| | | private String category; |
| | | |
| | | @Schema(description = "è¯ä¹¦ç¼å·", example = "软èç»å第 1234567 å·") |
| | | @Size(max = 128, message = "è¯ä¹¦ç¼å·é¿åº¦ä¸è½è¶
è¿ 128 个å符") |
| | | private String certificateNo; |
| | | |
| | | @Schema(description = "å徿¥æ", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | @NotNull(message = "å徿¥æä¸è½ä¸ºç©º") |
| | | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) |
| | | private LocalDate acquisitionDate; |
| | | |
| | | @Schema(description = "èµäº§åå¼", requiredMode = Schema.RequiredMode.REQUIRED, example = "60000.00") |
| | | @NotNull(message = "èµäº§åå¼ä¸è½ä¸ºç©º") |
| | | @DecimalMin(value = "0", message = "èµäº§åå¼ä¸è½å°äº 0") |
| | | private BigDecimal originalValue; |
| | | |
| | | @Schema(description = "æéå¹´éï¼å¹´ï¼", requiredMode = Schema.RequiredMode.REQUIRED, example = "5") |
| | | @NotNull(message = "æéå¹´éä¸è½ä¸ºç©º") |
| | | @Min(value = 1, message = "æéå¹´éå¿
须大äºçäº 1 å¹´") |
| | | private Integer amortizationPeriod; |
| | | |
| | | @Schema(description = "æ®å¼çï¼%ï¼", example = "0.00") |
| | | @DecimalMin(value = "0", message = "æ®å¼çä¸è½å°äº 0") |
| | | @DecimalMax(value = "100", message = "æ®å¼çä¸è½å¤§äº 100") |
| | | private BigDecimal residualRate; |
| | | |
| | | @Schema(description = "æææè³") |
| | | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) |
| | | private LocalDate validityDate; |
| | | |
| | | @Schema(description = "ç¶æ", example = "1") |
| | | @InEnum(value = FinIntangibleAssetStatusEnum.class, message = "ç¶æå¿
é¡»æ¯ {value}") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "èµäº§æè¿°", example = "æè¿°") |
| | | @Size(max = 500, message = "èµäº§æè¿°é¿åº¦ä¸è½è¶
è¿ 500 个å符") |
| | | private String description; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨") |
| | | @Size(max = 500, message = "夿³¨é¿åº¦ä¸è½è¶
è¿ 500 个å符") |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.controller.admin.ledger; |
| | | |
| | | import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.ledger.vo.FinLedgerReqVO; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.ledger.vo.FinLedgerRespVO; |
| | | import cn.iocoder.yudao.module.finance.service.ledger.FinLedgerService; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | | import jakarta.validation.Valid; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.GetMapping; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | |
| | | import java.io.IOException; |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | @Tag(name = "管çåå° - æ»è´¦ / æç»è´¦") |
| | | @RestController |
| | | @RequestMapping("/finance/ledger") |
| | | @Validated |
| | | public class FinLedgerController { |
| | | |
| | | @Resource |
| | | private FinLedgerService ledgerService; |
| | | |
| | | @GetMapping("/general") |
| | | @Operation(summary = "è·å¾æ»è´¦", description = "ææé´éææ±æ»ï¼åªç»è®¡å·²è¿è´¦åè¯") |
| | | @PreAuthorize("@ss.hasPermission('finance:ledger:query')") |
| | | public CommonResult<List<FinLedgerRespVO>> getGeneralLedgerList(@Valid FinLedgerReqVO reqVO) { |
| | | return success(ledgerService.getGeneralLedgerList(reqVO)); |
| | | } |
| | | |
| | | @GetMapping("/detail") |
| | | @Operation(summary = "è·å¾æç»è´¦", description = "éæ¡åå½å±ç¤ºå¹¶ç»è½¬ä½é¢ï¼åªç»è®¡å·²è¿è´¦åè¯") |
| | | @PreAuthorize("@ss.hasPermission('finance:ledger:query')") |
| | | public CommonResult<List<FinLedgerRespVO>> getDetailLedgerList(@Valid FinLedgerReqVO reqVO) { |
| | | return success(ledgerService.getDetailLedgerList(reqVO)); |
| | | } |
| | | |
| | | @GetMapping("/general/export-excel") |
| | | @Operation(summary = "å¯¼åºæ»è´¦ Excel") |
| | | @PreAuthorize("@ss.hasPermission('finance:ledger:export')") |
| | | @ApiAccessLog(operateType = EXPORT) |
| | | public void exportGeneralLedgerExcel(@Valid FinLedgerReqVO reqVO, |
| | | HttpServletResponse response) throws IOException { |
| | | List<FinLedgerRespVO> list = ledgerService.getGeneralLedgerList(reqVO); |
| | | ExcelUtils.write(response, "æ»è´¦.xls", "æ°æ®", FinLedgerRespVO.class, list); |
| | | } |
| | | |
| | | @GetMapping("/detail/export-excel") |
| | | @Operation(summary = "å¯¼åºæç»è´¦ Excel") |
| | | @PreAuthorize("@ss.hasPermission('finance:ledger:export')") |
| | | @ApiAccessLog(operateType = EXPORT) |
| | | public void exportDetailLedgerExcel(@Valid FinLedgerReqVO reqVO, |
| | | HttpServletResponse response) throws IOException { |
| | | List<FinLedgerRespVO> list = ledgerService.getDetailLedgerList(reqVO); |
| | | ExcelUtils.write(response, "æç»è´¦.xls", "æ°æ®", FinLedgerRespVO.class, list); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.controller.admin.ledger.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import jakarta.validation.constraints.NotEmpty; |
| | | import jakarta.validation.constraints.NotNull; |
| | | import lombok.Data; |
| | | import org.springframework.format.annotation.DateTimeFormat; |
| | | |
| | | import java.time.YearMonth; |
| | | |
| | | @Schema(description = "管çåå° - æ»è´¦/æç»è´¦æ¥è¯¢ Request VO") |
| | | @Data |
| | | public class FinLedgerReqVO { |
| | | |
| | | @Schema(description = "ç§ç®ç¼ç ", requiredMode = Schema.RequiredMode.REQUIRED, example = "1001") |
| | | @NotEmpty(message = "æ¥è¯¢æ»è´¦/æç»è´¦å¿
é¡»æå®ä¼è®¡ç§ç®") |
| | | private String subjectCode; |
| | | |
| | | // 注æï¼è¿éå¿
é¡»æ¯ YearMonthï¼ä¸è½æ¯ LocalDateã |
| | | // å端æä»½éæ©å¨ä¼ çæ¯ "2026-01"ï¼LocalDate æ æ³ä»ãå¹´+æãè¿ååºãæ¥ãï¼ |
| | | // ä¼å¨åæ°ç»å®é¶æ®µå°±æ "Failed to convert ... to java.time.LocalDate"ï¼400ï¼ï¼ |
| | | // å³ä½¿åäº @DateTimeFormat(pattern = "yyyy-MM") 乿ä¸äº ââ æ¯å段类åéäºï¼ä¸æ¯æ ¼å¼éäºã |
| | | @Schema(description = "å¼å§æä»½ï¼æ ¼å¼ yyyy-MMï¼å该æ 1 å·ä¸ºè´¦æèµ·ç¹", requiredMode = Schema.RequiredMode.REQUIRED, example = "2026-01") |
| | | @NotNull(message = "å¼å§æä»½ä¸è½ä¸ºç©º") |
| | | @DateTimeFormat(pattern = "yyyy-MM") |
| | | private YearMonth startMonth; |
| | | |
| | | @Schema(description = "ç»ææä»½ï¼æ ¼å¼ yyyy-MMï¼å该ææåä¸å¤©ä¸ºè´¦æç»ç¹", requiredMode = Schema.RequiredMode.REQUIRED, example = "2026-12") |
| | | @NotNull(message = "ç»ææä»½ä¸è½ä¸ºç©º") |
| | | @DateTimeFormat(pattern = "yyyy-MM") |
| | | private YearMonth endMonth; |
| | | |
| | | @Schema(description = "æ¯å¦å
å«ä¸çº§ç§ç®", example = "true") |
| | | private Boolean includeChildren; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.controller.admin.ledger.vo; |
| | | |
| | | import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; |
| | | import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; |
| | | import cn.iocoder.yudao.module.finance.enums.DictTypeConstants; |
| | | import cn.idev.excel.annotation.ExcelIgnoreUnannotated; |
| | | import cn.idev.excel.annotation.ExcelProperty; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | |
| | | @Schema(description = "管çåå° - æ»è´¦/æç»è´¦è¡ Response VO") |
| | | @Data |
| | | @ExcelIgnoreUnannotated |
| | | public class FinLedgerRespVO { |
| | | |
| | | @Schema(description = "è¡ç±»åï¼opening æåä½é¢ãentry æç»ãmonthly_total æ¬æå计ãyearly_total æ¬å¹´ç´¯è®¡", |
| | | requiredMode = Schema.RequiredMode.REQUIRED, example = "entry") |
| | | private String rowType; |
| | | |
| | | /** |
| | | * è¡ç±»åç䏿åï¼ä¸ä¾ Excel 导åºã |
| | | * rowType åçæ¯æä¸¾ç ï¼opening/entry/monthly_total/yearly_totalï¼ï¼EasyExcel ä¼åæ ·åè¿åå
æ ¼ï¼ |
| | | * æä»¥å¯¼åºçãè¡ç±»åãåå¿
é¡»ç±å¦ä¸ä¸ªå段æ¿è½½ä¸æï¼rowType æ¬èº«ä»ä¿çå¨ JSON éï¼å端é å®åæ ç¾æ å°ã |
| | | */ |
| | | @Schema(description = "è¡ç±»ååç§°", example = "æç»") |
| | | @ExcelProperty("è¡ç±»å") |
| | | private String rowTypeName; |
| | | |
| | | @Schema(description = "æå±æé´ï¼æ ¼å¼ yyyy-MM", example = "2026-10") |
| | | @ExcelProperty("æé´") |
| | | private String period; |
| | | |
| | | @Schema(description = "æ¥æ", example = "2026-10-12") |
| | | @ExcelProperty("æ¥æ") |
| | | private LocalDate date; |
| | | |
| | | @Schema(description = "åè¯åå·", example = "è®°2026100001") |
| | | @ExcelProperty("åè¯åå·") |
| | | private String voucherNo; |
| | | |
| | | @Schema(description = "ç§ç®ç¼ç ", example = "1001") |
| | | @ExcelProperty("ç§ç®ç¼ç ") |
| | | private String subjectCode; |
| | | |
| | | @Schema(description = "ç§ç®åç§°", example = "åºåç°é") |
| | | @ExcelProperty("ç§ç®åç§°") |
| | | private String subjectName; |
| | | |
| | | @Schema(description = "æè¦", example = "æ¶å°è´§æ¬¾") |
| | | @ExcelProperty("æè¦") |
| | | private String summary; |
| | | |
| | | @Schema(description = "åæ¹éé¢", example = "1000.00") |
| | | @ExcelProperty("åæ¹éé¢") |
| | | private BigDecimal debit; |
| | | |
| | | @Schema(description = "è´·æ¹éé¢", example = "0.00") |
| | | @ExcelProperty("è´·æ¹éé¢") |
| | | private BigDecimal credit; |
| | | |
| | | @Schema(description = "ä½é¢æ¹å", example = "1") |
| | | @ExcelProperty(value = "ä½é¢æ¹å", converter = DictConvert.class) |
| | | @DictFormat(DictTypeConstants.BALANCE_DIRECTION) |
| | | private Integer direction; |
| | | |
| | | @Schema(description = "ä½é¢ï¼åæ¹ä¸ºæ£ãè´·æ¹ä¸ºè´", example = "1000.00") |
| | | @ExcelProperty("ä½é¢") |
| | | private BigDecimal balance; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.controller.admin.statistics; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.statistics.vo.FinStatisticsOverviewRespVO; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.statistics.vo.FinStatisticsReqVO; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.statistics.vo.FinStatisticsTrendRespVO; |
| | | import cn.iocoder.yudao.module.finance.service.statistics.FinStatisticsService; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.validation.Valid; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.GetMapping; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | @Tag(name = "管çåå° - è´¢å¡æ¥è¡¨ / ä¼è®¡æ ¸ç®çæ¿") |
| | | @RestController |
| | | @RequestMapping("/finance/statistics") |
| | | @Validated |
| | | public class FinStatisticsController { |
| | | |
| | | @Resource |
| | | private FinStatisticsService statisticsService; |
| | | |
| | | @GetMapping("/overview") |
| | | @Operation(summary = "è·å¾ä¼è®¡æ ¸ç®çæ¿æ»è§", |
| | | description = "æ¶æ¯ãè´ééé¢åèª ERP å·²å®¡æ ¸çæ¶æ¬¾å/仿¬¾å/éå®è®¢å/éè´è®¢åï¼èµäº§ä¸åè¯åèªæ¬æ¨¡å") |
| | | @PreAuthorize("@ss.hasPermission('finance:statistics:query')") |
| | | public CommonResult<FinStatisticsOverviewRespVO> getStatisticsOverview(@Valid FinStatisticsReqVO reqVO) { |
| | | return success(statisticsService.getStatisticsOverview(reqVO)); |
| | | } |
| | | |
| | | @GetMapping("/trend") |
| | | @Operation(summary = "è·å¾æåº¦æ¶æ¯è¶å¿", description = "æé´å
æ²¡ææ°æ®çæä»½è¡¥ 0ï¼ä¾¿äºåç«¯ç´æ¥ç»å¾") |
| | | @PreAuthorize("@ss.hasPermission('finance:statistics:query')") |
| | | public CommonResult<List<FinStatisticsTrendRespVO>> getStatisticsTrend(@Valid FinStatisticsReqVO reqVO) { |
| | | return success(statisticsService.getStatisticsTrend(reqVO)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.controller.admin.statistics.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | |
| | | @Schema(description = "管çåå° - ä¼è®¡æ ¸ç®çæ¿æ»è§ Response VO") |
| | | @Data |
| | | public class FinStatisticsOverviewRespVO { |
| | | |
| | | @Schema(description = "å¼å§æ¥æ", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | private LocalDate startDate; |
| | | |
| | | @Schema(description = "ç»ææ¥æ", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | private LocalDate endDate; |
| | | |
| | | // ========== æ¶æ¯ï¼æ¥æºï¼ERP æ¶æ¬¾å / 仿¬¾åï¼åªç»è®¡å·²å®¡æ ¸åæ®ï¼ ========== |
| | | |
| | | @Schema(description = "æ»è¥æ¶ï¼æ¶æ¬¾åæ¶æ¬¾éé¢å计ï¼", requiredMode = Schema.RequiredMode.REQUIRED, example = "100000.00") |
| | | private BigDecimal receiptPrice; |
| | | |
| | | @Schema(description = "æ»æ¯åºï¼ä»æ¬¾å仿¬¾éé¢å计ï¼", requiredMode = Schema.RequiredMode.REQUIRED, example = "60000.00") |
| | | private BigDecimal paymentPrice; |
| | | |
| | | @Schema(description = "å婿¶¦ï¼æ»è¥æ¶ - æ»æ¯åºï¼", requiredMode = Schema.RequiredMode.REQUIRED, example = "40000.00") |
| | | private BigDecimal netProfit; |
| | | |
| | | // ========== è´éï¼æ¥æºï¼ERP éå®è®¢å / éè´è®¢åï¼åªç»è®¡å·²å®¡æ ¸åæ®ï¼ ========== |
| | | |
| | | @Schema(description = "éå®è®¢åéé¢å计ï¼åºæ¶å£å¾ï¼", requiredMode = Schema.RequiredMode.REQUIRED, example = "150000.00") |
| | | private BigDecimal saleOrderPrice; |
| | | |
| | | @Schema(description = "éè´è®¢åéé¢å计ï¼åºä»å£å¾ï¼", requiredMode = Schema.RequiredMode.REQUIRED, example = "80000.00") |
| | | private BigDecimal purchaseOrderPrice; |
| | | |
| | | // ========== èµäº§ï¼æ¶ç¹æ°ï¼åå½åå
¨é¨èµäº§ï¼ ========== |
| | | |
| | | @Schema(description = "åºå®èµäº§åå¼å计", requiredMode = Schema.RequiredMode.REQUIRED, example = "1200000.00") |
| | | private BigDecimal fixedAssetOriginalValue; |
| | | |
| | | @Schema(description = "åºå®èµäº§ç´¯è®¡ææ§å计", requiredMode = Schema.RequiredMode.REQUIRED, example = "240000.00") |
| | | private BigDecimal fixedAssetAccumulatedDepreciation; |
| | | |
| | | @Schema(description = "åºå®èµäº§åå¼å计", requiredMode = Schema.RequiredMode.REQUIRED, example = "960000.00") |
| | | private BigDecimal fixedAssetNetValue; |
| | | |
| | | @Schema(description = "æ å½¢èµäº§åå¼å计", requiredMode = Schema.RequiredMode.REQUIRED, example = "300000.00") |
| | | private BigDecimal intangibleAssetOriginalValue; |
| | | |
| | | @Schema(description = "æ å½¢èµäº§ç´¯è®¡æéå计", requiredMode = Schema.RequiredMode.REQUIRED, example = "60000.00") |
| | | private BigDecimal intangibleAssetAccumulatedAmortization; |
| | | |
| | | @Schema(description = "æ å½¢èµäº§åå¼å计", requiredMode = Schema.RequiredMode.REQUIRED, example = "240000.00") |
| | | private BigDecimal intangibleAssetNetValue; |
| | | |
| | | @Schema(description = "èµäº§åå¼å计ï¼åºå®èµäº§ + æ å½¢èµäº§ï¼", requiredMode = Schema.RequiredMode.REQUIRED, example = "1200000.00") |
| | | private BigDecimal totalAssetNetValue; |
| | | |
| | | // ========== ä¼è®¡æ ¸ç®ï¼æ¶ç¹æ°ï¼ ========== |
| | | |
| | | @Schema(description = "ä¼è®¡ç§ç®æ°é", requiredMode = Schema.RequiredMode.REQUIRED, example = "120") |
| | | private Long subjectCount; |
| | | |
| | | @Schema(description = "åè¯æ»æ°", requiredMode = Schema.RequiredMode.REQUIRED, example = "300") |
| | | private Long voucherCount; |
| | | |
| | | @Schema(description = "æªè¿è´¦åè¯æ°é", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") |
| | | private Long voucherUnpostedCount; |
| | | |
| | | @Schema(description = "å·²è¿è´¦åè¯æ°é", requiredMode = Schema.RequiredMode.REQUIRED, example = "280") |
| | | private Long voucherPostedCount; |
| | | |
| | | @Schema(description = "å·²ä½åºåè¯æ°é", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") |
| | | private Long voucherCancelledCount; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.controller.admin.statistics.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | import org.springframework.format.annotation.DateTimeFormat; |
| | | |
| | | import java.time.YearMonth; |
| | | |
| | | @Schema(description = "管çåå° - è´¢å¡æ¥è¡¨ / ä¼è®¡æ ¸ç®çæ¿æ¥è¯¢ Request VO") |
| | | @Data |
| | | public class FinStatisticsReqVO { |
| | | |
| | | // å FinLedgerReqVOï¼æä»½åæ°å¿
é¡»æ¯ YearMonthï¼LocalDate æ æ³æ¥æ¶ "2026-01"ã |
| | | @Schema(description = "å¼å§æä»½ï¼æ ¼å¼ yyyy-MMï¼ä¸ºç©ºæ¶åæ¬å¹´ 1 æ", example = "2026-01") |
| | | @DateTimeFormat(pattern = "yyyy-MM") |
| | | private YearMonth startMonth; |
| | | |
| | | @Schema(description = "ç»ææä»½ï¼æ ¼å¼ yyyy-MMï¼ä¸ºç©ºæ¶åå½åæ", example = "2026-12") |
| | | @DateTimeFormat(pattern = "yyyy-MM") |
| | | private YearMonth endMonth; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.controller.admin.statistics.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | @Schema(description = "管çåå° - è´¢å¡ä¼è®¡æ ¸ç®çæ¿æåº¦è¶å¿ Response VO") |
| | | @Data |
| | | public class FinStatisticsTrendRespVO { |
| | | |
| | | @Schema(description = "æä»½ï¼æ ¼å¼ yyyy-MM", requiredMode = Schema.RequiredMode.REQUIRED, example = "2026-10") |
| | | private String month; |
| | | |
| | | @Schema(description = "æ¶æ¬¾éé¢", requiredMode = Schema.RequiredMode.REQUIRED, example = "100000.00") |
| | | private BigDecimal receiptPrice; |
| | | |
| | | @Schema(description = "仿¬¾éé¢", requiredMode = Schema.RequiredMode.REQUIRED, example = "60000.00") |
| | | private BigDecimal paymentPrice; |
| | | |
| | | @Schema(description = "å婿¶¦ï¼æ¶æ¬¾ - 仿¬¾ï¼", requiredMode = Schema.RequiredMode.REQUIRED, example = "40000.00") |
| | | private BigDecimal netProfit; |
| | | |
| | | @Schema(description = "éå®è®¢åéé¢", requiredMode = Schema.RequiredMode.REQUIRED, example = "150000.00") |
| | | private BigDecimal saleOrderPrice; |
| | | |
| | | @Schema(description = "éè´è®¢åéé¢", requiredMode = Schema.RequiredMode.REQUIRED, example = "80000.00") |
| | | private BigDecimal purchaseOrderPrice; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.controller.admin.subject; |
| | | |
| | | import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.subject.vo.FinAccountSubjectPageReqVO; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.subject.vo.FinAccountSubjectRespVO; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.subject.vo.FinAccountSubjectSaveReqVO; |
| | | import cn.iocoder.yudao.module.finance.dal.dataobject.subject.FinAccountSubjectDO; |
| | | import cn.iocoder.yudao.module.finance.service.subject.FinAccountSubjectService; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | | import jakarta.validation.Valid; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.io.IOException; |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; |
| | | |
| | | @Tag(name = "管çåå° - è´¢å¡ä¼è®¡ç§ç®") |
| | | @RestController |
| | | @RequestMapping("/finance/account-subject") |
| | | @Validated |
| | | public class FinAccountSubjectController { |
| | | |
| | | @Resource |
| | | private FinAccountSubjectService accountSubjectService; |
| | | |
| | | @PostMapping("/create") |
| | | @Operation(summary = "å建ä¼è®¡ç§ç®") |
| | | @PreAuthorize("@ss.hasPermission('finance:account-subject:create')") |
| | | public CommonResult<Long> createAccountSubject(@Valid @RequestBody FinAccountSubjectSaveReqVO createReqVO) { |
| | | return success(accountSubjectService.createAccountSubject(createReqVO)); |
| | | } |
| | | |
| | | @PutMapping("/update") |
| | | @Operation(summary = "æ´æ°ä¼è®¡ç§ç®") |
| | | @PreAuthorize("@ss.hasPermission('finance:account-subject:update')") |
| | | public CommonResult<Boolean> updateAccountSubject(@Valid @RequestBody FinAccountSubjectSaveReqVO updateReqVO) { |
| | | accountSubjectService.updateAccountSubject(updateReqVO); |
| | | return success(true); |
| | | } |
| | | |
| | | @DeleteMapping("/delete") |
| | | @Operation(summary = "å é¤ä¼è®¡ç§ç®", description = "åå¨ä¸çº§ç§ç®æè¢«åè¯åå½å¼ç¨æ¶ä¸å
许å é¤") |
| | | @Parameter(name = "ids", description = "ç§ç®ç¼å·æ°ç»", required = true, example = "1,2,3") |
| | | @PreAuthorize("@ss.hasPermission('finance:account-subject:delete')") |
| | | public CommonResult<Boolean> deleteAccountSubject(@RequestParam("ids") List<Long> ids) { |
| | | accountSubjectService.deleteAccountSubjectList(ids); |
| | | return success(true); |
| | | } |
| | | |
| | | @GetMapping("/get") |
| | | @Operation(summary = "è·å¾ä¼è®¡ç§ç®") |
| | | @Parameter(name = "id", description = "ç§ç®ç¼å·", required = true, example = "1024") |
| | | @PreAuthorize("@ss.hasPermission('finance:account-subject:query')") |
| | | public CommonResult<FinAccountSubjectRespVO> getAccountSubject(@RequestParam("id") Long id) { |
| | | FinAccountSubjectDO subject = accountSubjectService.getAccountSubject(id); |
| | | return success(BeanUtils.toBean(subject, FinAccountSubjectRespVO.class)); |
| | | } |
| | | |
| | | /** |
| | | * ä¼è®¡ç§ç®æ å½¢å表页çåæ°æ¹å¼ï¼ä¸æ¬¡æå
¨éå½ä¸çç§ç®ï¼åå¨å端å
åéç»æ ï¼åé¡µå¯¹æ æ²¡ææä¹ï¼ |
| | | * æä»¥åç«¯ä¼ pageSize = -1ï¼å³æ¡æ¶ç PageParam.PAGE_SIZE_NONEï¼è¯ä¹æ¯ãæ¥è¯¢å
¨é¨ãï¼ã |
| | | * |
| | | * ä½ PageParam 䏿ç @Min(1) @Max(200)ï¼è¯·æ±éç -1 ä¼è¢«åæ°æ ¡éªç´æ¥æ¦æ |
| | | * 400ãæ¯é¡µæ¡æ°æå°å¼ä¸º 1ããPAGE_SIZE_NONE 卿¡æ¶éä¸ç´æ¯æå¡ç«¯å¯¼åºæ¹æ³å
é¨ set ç |
| | | * ï¼è§ä¸æ¹ export-excelï¼ï¼ä»æ²¡èµ° HTTP åæ°æ ¡éªï¼æä»¥è¿éå¿
须廿 @Validï¼ |
| | | * æ¹ä¸ºå¨æ¹æ³å
æ pageSize < 1 æ¾å¼å½ä¸ä¸º PAGE_SIZE_NONEï¼è®©ãæ¥è¯¢å
¨é¨ãè¿æ¡è·¯èµ°å¾éã |
| | | */ |
| | | @GetMapping("/page") |
| | | @Operation(summary = "è·å¾ä¼è®¡ç§ç®å页", description = "pageSize ä¼ -1 表示æ¥è¯¢å
¨é¨ï¼æ å½¢åè¡¨é¡µç»æ ç¨ï¼") |
| | | @PreAuthorize("@ss.hasPermission('finance:account-subject:query')") |
| | | public CommonResult<PageResult<FinAccountSubjectRespVO>> getAccountSubjectPage(FinAccountSubjectPageReqVO pageReqVO) { |
| | | if (pageReqVO.getPageSize() == null || pageReqVO.getPageSize() < 1) { |
| | | pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); |
| | | } |
| | | PageResult<FinAccountSubjectDO> pageResult = accountSubjectService.getAccountSubjectPage(pageReqVO); |
| | | return success(BeanUtils.toBean(pageResult, FinAccountSubjectRespVO.class)); |
| | | } |
| | | |
| | | @GetMapping("/list") |
| | | @Operation(summary = "è·å¾ä¼è®¡ç§ç®æ å表", description = "è¿åå
¨éç§ç®ï¼æç¶åå±çº§ç»è£
children") |
| | | @PreAuthorize("@ss.hasPermission('finance:account-subject:query')") |
| | | public CommonResult<List<FinAccountSubjectRespVO>> getAccountSubjectList() { |
| | | return success(buildTree(accountSubjectService.getAccountSubjectList())); |
| | | } |
| | | |
| | | @GetMapping("/simple-list") |
| | | @Operation(summary = "è·å¾ä¼è®¡ç§ç®ç²¾ç®å表", description = "ç¨äºåè¯åå½çç§ç®ä¸æ/æ éæ©") |
| | | public CommonResult<List<FinAccountSubjectRespVO>> getAccountSubjectSimpleList() { |
| | | List<FinAccountSubjectDO> list = accountSubjectService.getAccountSubjectList(); |
| | | return success(convertList(list, subject -> new FinAccountSubjectRespVO() |
| | | .setId(subject.getId()).setParentId(subject.getParentId()) |
| | | .setSubjectCode(subject.getSubjectCode()).setSubjectName(subject.getSubjectName()) |
| | | .setSubjectType(subject.getSubjectType()).setBalanceDirection(subject.getBalanceDirection()) |
| | | .setStatus(subject.getStatus()))); |
| | | } |
| | | |
| | | @GetMapping("/export-excel") |
| | | @Operation(summary = "导åºä¼è®¡ç§ç® Excel") |
| | | @PreAuthorize("@ss.hasPermission('finance:account-subject:export')") |
| | | @ApiAccessLog(operateType = EXPORT) |
| | | public void exportAccountSubjectExcel(@Valid FinAccountSubjectPageReqVO pageReqVO, |
| | | HttpServletResponse response) throws IOException { |
| | | pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); |
| | | List<FinAccountSubjectDO> list = accountSubjectService.getAccountSubjectPage(pageReqVO).getList(); |
| | | // å¯¼åº Excel |
| | | ExcelUtils.write(response, "ä¼è®¡ç§ç®.xls", "æ°æ®", FinAccountSubjectRespVO.class, |
| | | BeanUtils.toBean(list, FinAccountSubjectRespVO.class)); |
| | | } |
| | | |
| | | /** |
| | | * å°æå¹³ç§ç®å表ç»è£
为æ ï¼ä¸çº§ç§ç®ä¸åå¨ï¼å·²è¢«å é¤ï¼æ¶ï¼ææ ¹èç¹å¤çï¼é¿å
èç¹ä¸¢å¤± |
| | | */ |
| | | private List<FinAccountSubjectRespVO> buildTree(List<FinAccountSubjectDO> list) { |
| | | List<FinAccountSubjectRespVO> voList = BeanUtils.toBean(list, FinAccountSubjectRespVO.class); |
| | | Map<Long, FinAccountSubjectRespVO> idMap = convertMap(voList, FinAccountSubjectRespVO::getId); |
| | | List<FinAccountSubjectRespVO> roots = new ArrayList<>(); |
| | | voList.forEach(vo -> { |
| | | FinAccountSubjectRespVO parent = vo.getParentId() == null ? null : idMap.get(vo.getParentId()); |
| | | if (parent == null) { |
| | | roots.add(vo); |
| | | } else { |
| | | if (parent.getChildren() == null) { |
| | | parent.setChildren(new ArrayList<>()); |
| | | } |
| | | parent.getChildren().add(vo); |
| | | } |
| | | }); |
| | | return roots; |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.controller.admin.subject.vo; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import lombok.ToString; |
| | | |
| | | @Schema(description = "管çåå° - ä¼è®¡ç§ç®å页 Request VO") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | public class FinAccountSubjectPageReqVO extends PageParam { |
| | | |
| | | @Schema(description = "ç§ç®ç¼ç ", example = "1001") |
| | | private String subjectCode; |
| | | |
| | | @Schema(description = "ç§ç®åç§°", example = "åºåç°é") |
| | | private String subjectName; |
| | | |
| | | @Schema(description = "ç§ç®ç±»å", example = "1") |
| | | private Integer subjectType; |
| | | |
| | | @Schema(description = "ç¶æ", example = "0") |
| | | private Integer status; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.controller.admin.subject.vo; |
| | | |
| | | import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; |
| | | import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; |
| | | import cn.iocoder.yudao.module.finance.enums.DictTypeConstants; |
| | | import cn.idev.excel.annotation.ExcelIgnoreUnannotated; |
| | | import cn.idev.excel.annotation.ExcelProperty; |
| | | import cn.idev.excel.annotation.write.style.ColumnWidth; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.time.LocalDateTime; |
| | | import java.util.List; |
| | | |
| | | @Schema(description = "管çåå° - ä¼è®¡ç§ç® Response VO") |
| | | @Data |
| | | @ExcelIgnoreUnannotated |
| | | public class FinAccountSubjectRespVO { |
| | | |
| | | @Schema(description = "ç§ç®ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") |
| | | @ExcelProperty("ç§ç®ç¼å·") |
| | | private Long id; |
| | | |
| | | @Schema(description = "ç¶ç§ç®ç¼å·", example = "1024") |
| | | private Long parentId; |
| | | |
| | | @Schema(description = "ç§ç®ç¼ç ", requiredMode = Schema.RequiredMode.REQUIRED, example = "1001") |
| | | @ExcelProperty("ç§ç®ç¼ç ") |
| | | private String subjectCode; |
| | | |
| | | @Schema(description = "ç§ç®åç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "åºåç°é") |
| | | @ExcelProperty("ç§ç®åç§°") |
| | | private String subjectName; |
| | | |
| | | @Schema(description = "ç§ç®ç±»å", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @ExcelProperty(value = "ç§ç®ç±»å", converter = DictConvert.class) |
| | | @DictFormat(DictTypeConstants.SUBJECT_TYPE) |
| | | private Integer subjectType; |
| | | |
| | | @Schema(description = "ä½é¢æ¹å", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @ExcelProperty(value = "ä½é¢æ¹å", converter = DictConvert.class) |
| | | @DictFormat(DictTypeConstants.BALANCE_DIRECTION) |
| | | private Integer balanceDirection; |
| | | |
| | | @Schema(description = "ç¶æ", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") |
| | | @ExcelProperty(value = "ç¶æ", converter = DictConvert.class) |
| | | @DictFormat(cn.iocoder.yudao.module.system.enums.DictTypeConstants.COMMON_STATUS) |
| | | private Integer status; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨") |
| | | @ExcelProperty("夿³¨") |
| | | private String remark; |
| | | |
| | | @Schema(description = "å建æ¶é´", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | // ãyyyy-MM-dd HH:mm:ssãæ£å¥½ 19 个å符ï¼èªéåºå宽就åªç» 19ï¼è´´çè¾¹å¾é¾çï¼è¿éæ¾å®½å° 22 |
| | | @ColumnWidth(22) |
| | | @ExcelProperty("å建æ¶é´") |
| | | private LocalDateTime createTime; |
| | | |
| | | @Schema(description = "åç§ç®", example = "[]") |
| | | private List<FinAccountSubjectRespVO> children; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.controller.admin.subject.vo; |
| | | |
| | | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; |
| | | import cn.iocoder.yudao.framework.common.validation.InEnum; |
| | | import cn.iocoder.yudao.module.finance.enums.FinBalanceDirectionEnum; |
| | | import cn.iocoder.yudao.module.finance.enums.FinSubjectTypeEnum; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import jakarta.validation.constraints.NotEmpty; |
| | | import jakarta.validation.constraints.NotNull; |
| | | import jakarta.validation.constraints.Size; |
| | | import lombok.Data; |
| | | |
| | | @Schema(description = "管çåå° - ä¼è®¡ç§ç®æ°å¢/ä¿®æ¹ Request VO") |
| | | @Data |
| | | public class FinAccountSubjectSaveReqVO { |
| | | |
| | | @Schema(description = "ç§ç®ç¼å·", example = "1024") |
| | | private Long id; |
| | | |
| | | @Schema(description = "ç¶ç§ç®ç¼å·", example = "1024") |
| | | private Long parentId; |
| | | |
| | | @Schema(description = "ç§ç®ç¼ç ", requiredMode = Schema.RequiredMode.REQUIRED, example = "1001") |
| | | @NotEmpty(message = "ç§ç®ç¼ç ä¸è½ä¸ºç©º") |
| | | @Size(max = 64, message = "ç§ç®ç¼ç é¿åº¦ä¸è½è¶
è¿ 64 个å符") |
| | | private String subjectCode; |
| | | |
| | | @Schema(description = "ç§ç®åç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "åºåç°é") |
| | | @NotEmpty(message = "ç§ç®åç§°ä¸è½ä¸ºç©º") |
| | | @Size(max = 128, message = "ç§ç®åç§°é¿åº¦ä¸è½è¶
è¿ 128 个å符") |
| | | private String subjectName; |
| | | |
| | | @Schema(description = "ç§ç®ç±»å", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "ç§ç®ç±»åä¸è½ä¸ºç©º") |
| | | @InEnum(value = FinSubjectTypeEnum.class, message = "ç§ç®ç±»åå¿
é¡»æ¯ {value}") |
| | | private Integer subjectType; |
| | | |
| | | @Schema(description = "ä½é¢æ¹å", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "ä½é¢æ¹åä¸è½ä¸ºç©º") |
| | | @InEnum(value = FinBalanceDirectionEnum.class, message = "ä½é¢æ¹åå¿
é¡»æ¯ {value}") |
| | | private Integer balanceDirection; |
| | | |
| | | @Schema(description = "ç¶æ", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") |
| | | @NotNull(message = "ç¶æä¸è½ä¸ºç©º") |
| | | @InEnum(value = CommonStatusEnum.class, message = "ç¶æå¿
é¡»æ¯ {value}") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨") |
| | | @Size(max = 500, message = "夿³¨é¿åº¦ä¸è½è¶
è¿ 500 个å符") |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.controller.admin.voucher; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.collection.MapUtils; |
| | | import cn.iocoder.yudao.framework.common.util.number.NumberUtils; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.voucher.vo.FinVoucherEntryRespVO; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.voucher.vo.FinVoucherPageReqVO; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.voucher.vo.FinVoucherRespVO; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.voucher.vo.FinVoucherSaveReqVO; |
| | | import cn.iocoder.yudao.module.finance.dal.dataobject.voucher.FinVoucherDO; |
| | | import cn.iocoder.yudao.module.finance.dal.dataobject.voucher.FinVoucherEntryDO; |
| | | import cn.iocoder.yudao.module.finance.service.voucher.FinVoucherService; |
| | | import cn.iocoder.yudao.module.system.api.storage.StorageAttachmentApi; |
| | | import cn.iocoder.yudao.module.system.api.storage.dto.StorageBlobRespDTO; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | | import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | | import jakarta.validation.Valid; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.io.IOException; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.stream.Stream; |
| | | |
| | | import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertListByFlatMap; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMultiMap; |
| | | |
| | | @Tag(name = "管çåå° - è®°è´¦åè¯") |
| | | @RestController |
| | | @RequestMapping("/finance/voucher") |
| | | @Validated |
| | | public class FinVoucherController { |
| | | |
| | | /** |
| | | * éä»¶çä¸å¡è®°å½ç±»å |
| | | */ |
| | | private static final String ATTACHMENT_RECORD_TYPE = "fin_voucher"; |
| | | |
| | | @Resource |
| | | private FinVoucherService voucherService; |
| | | @Resource |
| | | private StorageAttachmentApi storageAttachmentApi; |
| | | @Resource |
| | | private AdminUserApi adminUserApi; |
| | | |
| | | @PostMapping("/create") |
| | | @Operation(summary = "å建记账åè¯") |
| | | @PreAuthorize("@ss.hasPermission('finance:voucher:create')") |
| | | public CommonResult<Long> createVoucher(@Valid @RequestBody FinVoucherSaveReqVO createReqVO) { |
| | | return success(voucherService.createVoucher(createReqVO)); |
| | | } |
| | | |
| | | @PutMapping("/update") |
| | | @Operation(summary = "æ´æ°è®°è´¦åè¯", description = "ä»
æªè¿è´¦çåè¯å
许修æ¹") |
| | | @PreAuthorize("@ss.hasPermission('finance:voucher:update')") |
| | | public CommonResult<Boolean> updateVoucher(@Valid @RequestBody FinVoucherSaveReqVO updateReqVO) { |
| | | voucherService.updateVoucher(updateReqVO); |
| | | return success(true); |
| | | } |
| | | |
| | | @DeleteMapping("/delete") |
| | | @Operation(summary = "å é¤è®°è´¦åè¯") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true) |
| | | @PreAuthorize("@ss.hasPermission('finance:voucher:delete')") |
| | | public CommonResult<Boolean> deleteVoucher(@RequestParam("id") Long id) { |
| | | voucherService.deleteVoucher(id); |
| | | return success(true); |
| | | } |
| | | |
| | | @DeleteMapping("/delete-list") |
| | | @Operation(summary = "æ¹éå é¤è®°è´¦åè¯") |
| | | @Parameter(name = "ids", description = "ç¼å·å表", required = true) |
| | | @PreAuthorize("@ss.hasPermission('finance:voucher:delete')") |
| | | public CommonResult<Boolean> deleteVoucherList(@RequestParam("ids") List<Long> ids) { |
| | | voucherService.deleteVoucherList(ids); |
| | | return success(true); |
| | | } |
| | | |
| | | @PutMapping("/post") |
| | | @Operation(summary = "åè¯è¿è´¦", description = "æªè¿è´¦ -> å·²è¿è´¦ï¼è¿è´¦ååè¯ä¸å¯åä¿®æ¹") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true) |
| | | @PreAuthorize("@ss.hasPermission('finance:voucher:update-status')") |
| | | public CommonResult<Boolean> postVoucher(@RequestParam("id") Long id) { |
| | | voucherService.postVoucher(id); |
| | | return success(true); |
| | | } |
| | | |
| | | @PutMapping("/cancel") |
| | | @Operation(summary = "åè¯ä½åº", description = "æªè¿è´¦ -> å·²ä½åº") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true) |
| | | @PreAuthorize("@ss.hasPermission('finance:voucher:update-status')") |
| | | public CommonResult<Boolean> cancelVoucher(@RequestParam("id") Long id) { |
| | | voucherService.cancelVoucher(id); |
| | | return success(true); |
| | | } |
| | | |
| | | @GetMapping("/get") |
| | | @Operation(summary = "è·å¾è®°è´¦åè¯", description = "å
å«åè¯åå½ä¸éä»¶å表") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true, example = "1024") |
| | | @PreAuthorize("@ss.hasPermission('finance:voucher:query')") |
| | | public CommonResult<FinVoucherRespVO> getVoucher(@RequestParam("id") Long id) { |
| | | FinVoucherDO voucher = voucherService.getVoucher(id); |
| | | if (voucher == null) { |
| | | return success(null); |
| | | } |
| | | FinVoucherRespVO respVO = BeanUtils.toBean(voucher, FinVoucherRespVO.class); |
| | | respVO.setEntries(BeanUtils.toBean(voucherService.getVoucherEntryListByVoucherId(id), FinVoucherEntryRespVO.class)); |
| | | // 注æï¼StorageAttachmentApi.listAttachments å¨ãè¯¥è®°å½æ²¡æä»»ä½éä»¶ãæ¶è¿å nullï¼è䏿¯ç©ºéåã |
| | | // ç´æ¥ .isEmpty() ä¼ NPEï¼æ°å¢çåè¯è¿æ²¡ä¼ éä»¶æ¶ï¼ä¸æ¥è¯¦æ
å°± 500ï¼å¿
é¡»å
å
åºæç©ºå表ã |
| | | List<StorageBlobRespDTO> attachments = storageAttachmentApi.listAttachments(ATTACHMENT_RECORD_TYPE, id); |
| | | if (attachments == null) { |
| | | attachments = List.of(); |
| | | } |
| | | respVO.setAttachmentList(attachments); |
| | | respVO.setHasAttachment(!attachments.isEmpty()); |
| | | return success(respVO); |
| | | } |
| | | |
| | | @GetMapping("/page") |
| | | @Operation(summary = "è·å¾è®°è´¦åè¯å页") |
| | | @PreAuthorize("@ss.hasPermission('finance:voucher:query')") |
| | | public CommonResult<PageResult<FinVoucherRespVO>> getVoucherPage(@Valid FinVoucherPageReqVO pageReqVO) { |
| | | PageResult<FinVoucherDO> pageResult = voucherService.getVoucherPage(pageReqVO); |
| | | PageResult<FinVoucherRespVO> result = BeanUtils.toBean(pageResult, FinVoucherRespVO.class); |
| | | fillCreatorName(result.getList()); |
| | | return success(result); |
| | | } |
| | | |
| | | @GetMapping("/page-with-entry") |
| | | @Operation(summary = "è·å¾è®°è´¦åè¯å页ï¼å«åå½ï¼", description = "䏿¬¡æ§è¿åæ¬é¡µææåè¯çåå½ï¼é¿å
åç«¯éæ¡æ¥è¯¢") |
| | | @PreAuthorize("@ss.hasPermission('finance:voucher:query')") |
| | | public CommonResult<PageResult<FinVoucherRespVO>> getVoucherPageWithEntry(@Valid FinVoucherPageReqVO pageReqVO) { |
| | | PageResult<FinVoucherDO> pageResult = voucherService.getVoucherPage(pageReqVO); |
| | | PageResult<FinVoucherRespVO> result = BeanUtils.toBean(pageResult, FinVoucherRespVO.class); |
| | | if (result.getList().isEmpty()) { |
| | | return success(result); |
| | | } |
| | | fillCreatorName(result.getList()); |
| | | // æ¹éæ¥è¯¢æ¬é¡µåè¯çåå½ |
| | | Map<Long, List<FinVoucherEntryDO>> entryMap = convertMultiMap( |
| | | voucherService.getVoucherEntryListByVoucherIds( |
| | | convertList(result.getList(), FinVoucherRespVO::getId)), |
| | | FinVoucherEntryDO::getVoucherId); |
| | | result.getList().forEach(voucher -> { |
| | | voucher.setEntries(BeanUtils.toBean( |
| | | entryMap.getOrDefault(voucher.getId(), List.of()), FinVoucherEntryRespVO.class)); |
| | | // å表页ä¹éè¦å±ç¤ºéä»¶æ è®°ï¼é件表æ recordId åæ¡æ¥è¯¢ï¼æ¬é¡µæå¤ 20 æ¡ï¼ææ¬å¯æ¥å |
| | | // åä¸ï¼æ²¡æéä»¶æ¶ listAttachments è¿å nullï¼å¿
é¡»å
åºï¼å¦åå表éåªè¦æä¸æ¡æ²¡éä»¶çåè¯å°±æ´é¡µ 500 |
| | | List<StorageBlobRespDTO> attachments = storageAttachmentApi.listAttachments(ATTACHMENT_RECORD_TYPE, voucher.getId()); |
| | | if (attachments == null) { |
| | | attachments = List.of(); |
| | | } |
| | | voucher.setAttachmentList(attachments); |
| | | voucher.setHasAttachment(!attachments.isEmpty()); |
| | | }); |
| | | return success(result); |
| | | } |
| | | |
| | | @GetMapping("/export-excel") |
| | | @Operation(summary = "导åºè®°è´¦åè¯ Excel") |
| | | @PreAuthorize("@ss.hasPermission('finance:voucher:export')") |
| | | @ApiAccessLog(operateType = EXPORT) |
| | | public void exportVoucherExcel(@Valid FinVoucherPageReqVO pageReqVO, |
| | | HttpServletResponse response) throws IOException { |
| | | pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); |
| | | List<FinVoucherDO> list = voucherService.getVoucherPage(pageReqVO).getList(); |
| | | List<FinVoucherRespVO> voList = BeanUtils.toBean(list, FinVoucherRespVO.class); |
| | | fillCreatorName(voList); |
| | | // å¯¼åº Excel |
| | | ExcelUtils.write(response, "è®°è´¦åè¯.xls", "æ°æ®", FinVoucherRespVO.class, voList); |
| | | } |
| | | |
| | | /** |
| | | * å¡«å
å¶å人æµç§°ã |
| | | * BaseDO.creator åçæ¯ç¨æ· IDï¼å表ä¸å¯¼åºè¡¨éç´æ¥å±ç¤ºå°±æ¯ä¸ä¸²æ°åï¼ |
| | | * æä»¥æ ERP æ¶æ¬¾å/仿¬¾åçæ¢æå£å¾ï¼ç»ä¸å¨è¿éæç¨æ·ä¿¡æ¯æ¹éæ¥ä¸æ¬¡ååå¡«ã |
| | | */ |
| | | private void fillCreatorName(List<FinVoucherRespVO> list) { |
| | | if (CollUtil.isEmpty(list)) { |
| | | return; |
| | | } |
| | | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertListByFlatMap(list, |
| | | voucher -> Stream.of(NumberUtils.parseLong(voucher.getCreator())))); |
| | | list.forEach(voucher -> MapUtils.findAndThen(userMap, NumberUtils.parseLong(voucher.getCreator()), |
| | | user -> voucher.setCreatorName(user.getNickname()))); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.controller.admin.voucher.vo; |
| | | |
| | | import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; |
| | | import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; |
| | | import cn.iocoder.yudao.module.finance.enums.DictTypeConstants; |
| | | import cn.idev.excel.annotation.ExcelIgnoreUnannotated; |
| | | import cn.idev.excel.annotation.ExcelProperty; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | @Schema(description = "管çåå° - åè¯åå½ Response VO") |
| | | @Data |
| | | @ExcelIgnoreUnannotated |
| | | public class FinVoucherEntryRespVO { |
| | | |
| | | @Schema(description = "åå½ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") |
| | | private Long id; |
| | | |
| | | @Schema(description = "è¡å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Integer rowNo; |
| | | |
| | | @Schema(description = "ç§ç®ç¼ç ", requiredMode = Schema.RequiredMode.REQUIRED, example = "1001") |
| | | @ExcelProperty("ç§ç®ç¼ç ") |
| | | private String subjectCode; |
| | | |
| | | @Schema(description = "ç§ç®åç§°", example = "åºåç°é") |
| | | @ExcelProperty("ç§ç®åç§°") |
| | | private String subjectName; |
| | | |
| | | @Schema(description = "æè¦", example = "æ¶å°è´§æ¬¾") |
| | | @ExcelProperty("æè¦") |
| | | private String summary; |
| | | |
| | | @Schema(description = "åæ¹éé¢", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000.00") |
| | | @ExcelProperty("åæ¹éé¢") |
| | | private BigDecimal debit; |
| | | |
| | | @Schema(description = "è´·æ¹éé¢", requiredMode = Schema.RequiredMode.REQUIRED, example = "0.00") |
| | | @ExcelProperty("è´·æ¹éé¢") |
| | | private BigDecimal credit; |
| | | |
| | | @Schema(description = "è¾
婿 ¸ç®ç±»å", example = "1") |
| | | @ExcelProperty(value = "è¾
婿 ¸ç®ç±»å", converter = DictConvert.class) |
| | | @DictFormat(DictTypeConstants.AUXILIARY_TYPE) |
| | | private Integer auxiliaryType; |
| | | |
| | | @Schema(description = "è¾
婿 ¸ç®å¯¹è±¡ç¼å·", example = "1024") |
| | | private String auxiliaryId; |
| | | |
| | | @Schema(description = "è¾
婿 ¸ç®å¯¹è±¡åç§°", example = "æå·ææå
¬å¸") |
| | | @ExcelProperty("è¾
婿 ¸ç®å¯¹è±¡") |
| | | private String auxiliaryName; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.controller.admin.voucher.vo; |
| | | |
| | | import cn.iocoder.yudao.module.finance.enums.FinAuxiliaryTypeEnum; |
| | | import cn.iocoder.yudao.framework.common.validation.InEnum; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import jakarta.validation.constraints.NotEmpty; |
| | | import jakarta.validation.constraints.Size; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | @Schema(description = "管çåå° - åè¯å彿°å¢/ä¿®æ¹ Request VO") |
| | | @Data |
| | | public class FinVoucherEntrySaveReqVO { |
| | | |
| | | @Schema(description = "ç§ç®ç¼ç ", requiredMode = Schema.RequiredMode.REQUIRED, example = "1001") |
| | | @NotEmpty(message = "åå½çç§ç®ç¼ç ä¸è½ä¸ºç©º") |
| | | private String subjectCode; |
| | | |
| | | @Schema(description = "ç§ç®åç§°", example = "åºåç°é") |
| | | private String subjectName; |
| | | |
| | | @Schema(description = "æè¦", example = "æ¶å°è´§æ¬¾") |
| | | @Size(max = 500, message = "å彿è¦é¿åº¦ä¸è½è¶
è¿ 500 个å符") |
| | | private String summary; |
| | | |
| | | @Schema(description = "åæ¹éé¢", example = "1000.00") |
| | | private BigDecimal debit; |
| | | |
| | | @Schema(description = "è´·æ¹éé¢", example = "0.00") |
| | | private BigDecimal credit; |
| | | |
| | | @Schema(description = "è¾
婿 ¸ç®ç±»å", example = "1") |
| | | @InEnum(value = FinAuxiliaryTypeEnum.class, message = "è¾
婿 ¸ç®ç±»åå¿
é¡»æ¯ {value}") |
| | | private Integer auxiliaryType; |
| | | |
| | | @Schema(description = "è¾
婿 ¸ç®å¯¹è±¡ç¼å·", example = "1024") |
| | | private String auxiliaryId; |
| | | |
| | | @Schema(description = "è¾
婿 ¸ç®å¯¹è±¡åç§°", example = "æå·ææå
¬å¸") |
| | | private String auxiliaryName; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.controller.admin.voucher.vo; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import lombok.ToString; |
| | | import org.springframework.format.annotation.DateTimeFormat; |
| | | |
| | | import java.time.LocalDate; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; |
| | | |
| | | @Schema(description = "管çåå° - è®°è´¦åè¯å页 Request VO") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | public class FinVoucherPageReqVO extends PageParam { |
| | | |
| | | @Schema(description = "åè¯åå·", example = "è®°-0001") |
| | | private String voucherNo; |
| | | |
| | | @Schema(description = "æè¦") |
| | | private String summary; |
| | | |
| | | @Schema(description = "å¶å人", example = "admin") |
| | | private String creator; |
| | | |
| | | @Schema(description = "åè¯ç¶æ", example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "åè¯æ¥æåºé´") |
| | | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) |
| | | private LocalDate[] voucherDate; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.controller.admin.voucher.vo; |
| | | |
| | | import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; |
| | | import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; |
| | | import cn.iocoder.yudao.module.finance.enums.DictTypeConstants; |
| | | import cn.iocoder.yudao.module.system.api.storage.dto.StorageBlobRespDTO; |
| | | import cn.idev.excel.annotation.ExcelIgnoreUnannotated; |
| | | import cn.idev.excel.annotation.ExcelProperty; |
| | | import cn.idev.excel.annotation.write.style.ColumnWidth; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.util.List; |
| | | |
| | | @Schema(description = "管çåå° - è®°è´¦åè¯ Response VO") |
| | | @Data |
| | | @ExcelIgnoreUnannotated |
| | | public class FinVoucherRespVO { |
| | | |
| | | @Schema(description = "åè¯ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") |
| | | @ExcelProperty("åè¯ç¼å·") |
| | | private Long id; |
| | | |
| | | @Schema(description = "åè¯åå·", requiredMode = Schema.RequiredMode.REQUIRED, example = "è®°-0001") |
| | | @ExcelProperty("åè¯åå·") |
| | | private String voucherNo; |
| | | |
| | | @Schema(description = "åè¯æ¥æ", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | @ExcelProperty("åè¯æ¥æ") |
| | | private LocalDate voucherDate; |
| | | |
| | | @Schema(description = "æè¦", example = "é宿¶å
¥") |
| | | @ExcelProperty("æè¦") |
| | | private String summary; |
| | | |
| | | @Schema(description = "åæ¹å计", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000.00") |
| | | @ExcelProperty("åæ¹å计") |
| | | private BigDecimal debit; |
| | | |
| | | @Schema(description = "è´·æ¹å计", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000.00") |
| | | @ExcelProperty("è´·æ¹å计") |
| | | private BigDecimal credit; |
| | | |
| | | @Schema(description = "åè¯ç¶æ", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") |
| | | // 注æï¼@DictFormat åªè´è´£ãä»å段ä¸ååå
¸ç±»åãï¼çæ£åç¿»è¯çæ¯ DictConvertï¼ |
| | | // å¿
é¡»å¨è¿éæ¾å¼æä¸ converterï¼å¦å导åºçæ¯ 0/10/20 è¿æ ·çåå§ç |
| | | @ExcelProperty(value = "åè¯ç¶æ", converter = DictConvert.class) |
| | | @DictFormat(DictTypeConstants.VOUCHER_STATUS) |
| | | private Integer status; |
| | | |
| | | @Schema(description = "å¶å人ï¼ç¨æ·ç¼å·ï¼", example = "1") |
| | | private String creator; |
| | | |
| | | /** |
| | | * å¶å人æµç§°ï¼ä¸ä¾åè¡¨ä¸ Excel 导åºã |
| | | * BaseDO.creator åçæ¯ç¨æ· IDï¼ç´æ¥å±ç¤ºå°±æ¯ä¸ä¸²æ°åï¼æä»¥å¦ç¨è¿ä¸ªå段æ¿è½½æµç§°ï¼ |
| | | * creator æ¬èº«ä»ä¿çå¨ JSON éï¼å端æç´¢æ¡ä»¶ãæé夿é å®ï¼ã |
| | | */ |
| | | @Schema(description = "å¶å人æµç§°", example = "管çå") |
| | | @ExcelProperty("å¶å人") |
| | | private String creatorName; |
| | | |
| | | @Schema(description = "éä»¶å¼ æ°", example = "0") |
| | | @ExcelProperty("éä»¶å¼ æ°") |
| | | private Integer attachmentCount; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨") |
| | | @ExcelProperty("夿³¨") |
| | | private String remark; |
| | | |
| | | @Schema(description = "å建æ¶é´", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | // ãyyyy-MM-dd HH:mm:ssãæ£å¥½ 19 个å符ï¼èªéåºå宽就åªç» 19ï¼è´´çè¾¹å¾é¾çï¼è¿éæ¾å®½å° 22 |
| | | @ColumnWidth(22) |
| | | @ExcelProperty("å建æ¶é´") |
| | | private LocalDateTime createTime; |
| | | |
| | | @Schema(description = "åè¯åå½", example = "[]") |
| | | private List<FinVoucherEntryRespVO> entries; |
| | | |
| | | @Schema(description = "éä»¶å表", example = "[]") |
| | | private List<StorageBlobRespDTO> attachmentList; |
| | | |
| | | @Schema(description = "æ¯å¦åå¨éä»¶", example = "true") |
| | | private Boolean hasAttachment; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.controller.admin.voucher.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import jakarta.validation.Valid; |
| | | import jakarta.validation.constraints.NotEmpty; |
| | | import jakarta.validation.constraints.NotNull; |
| | | import jakarta.validation.constraints.Size; |
| | | import lombok.Data; |
| | | import org.springframework.format.annotation.DateTimeFormat; |
| | | |
| | | import java.time.LocalDate; |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; |
| | | |
| | | @Schema(description = "管çåå° - è®°è´¦åè¯æ°å¢/ä¿®æ¹ Request VO") |
| | | @Data |
| | | public class FinVoucherSaveReqVO { |
| | | |
| | | @Schema(description = "åè¯ç¼å·", example = "1024") |
| | | private Long id; |
| | | |
| | | @Schema(description = "åè¯åå·ï¼ä¸ºç©ºæ¶ç±ç³»ç»æãåè¯å+å¹´æ+åºå·ãèªå¨çæ", example = "è®°2026090001") |
| | | @Size(max = 64, message = "åè¯åå·é¿åº¦ä¸è½è¶
è¿ 64 个å符") |
| | | private String voucherNo; |
| | | |
| | | @Schema(description = "åè¯æ¥æ", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | @NotNull(message = "åè¯æ¥æä¸è½ä¸ºç©º") |
| | | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) |
| | | private LocalDate voucherDate; |
| | | |
| | | @Schema(description = "æè¦", example = "é宿¶å
¥") |
| | | @Size(max = 500, message = "æè¦é¿åº¦ä¸è½è¶
è¿ 500 个å符") |
| | | private String summary; |
| | | |
| | | @Schema(description = "éä»¶å¼ æ°", example = "0") |
| | | private Integer attachmentCount; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨") |
| | | @Size(max = 500, message = "夿³¨é¿åº¦ä¸è½è¶
è¿ 500 个å符") |
| | | private String remark; |
| | | |
| | | @Schema(description = "åè¯åå½", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | @NotEmpty(message = "åè¯åå½ä¸è½ä¸ºç©º") |
| | | @Valid |
| | | private List<FinVoucherEntrySaveReqVO> entries; |
| | | |
| | | @Schema(description = "éä»¶ç¼å·æ°ç»", example = "[]") |
| | | private List<Long> blobIds; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.dal.dataobject.asset; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | |
| | | /** |
| | | * åºå®èµäº§ DO |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @TableName("fin_fixed_asset") |
| | | @KeySequence("fin_fixed_asset_seq") // ç¨äº OracleãPostgreSQLãKingbaseãDB2ãH2 æ°æ®åºç主é®èªå¢ãå¦ææ¯ MySQL çæ°æ®åºï¼å¯ä¸åã |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class FinFixedAssetDO extends BaseDO { |
| | | |
| | | /** |
| | | * èµäº§ç¼å· |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | /** |
| | | * èµäº§ç¼å· |
| | | * |
| | | * ä¾å¦è¯´ï¼GD20260512001 |
| | | */ |
| | | private String assetCode; |
| | | /** |
| | | * èµäº§åç§° |
| | | */ |
| | | private String assetName; |
| | | /** |
| | | * èµäº§ç±»å« |
| | | */ |
| | | private String category; |
| | | /** |
| | | * è§æ ¼åå· |
| | | */ |
| | | private String specification; |
| | | /** |
| | | * è´ç½®æ¥æ |
| | | */ |
| | | private LocalDate purchaseDate; |
| | | /** |
| | | * èµäº§åå¼ |
| | | */ |
| | | private BigDecimal originalValue; |
| | | /** |
| | | * 使ç¨å¹´éï¼å¹´ï¼ |
| | | */ |
| | | private Integer usefulLife; |
| | | /** |
| | | * æ®å¼çï¼%ï¼ |
| | | */ |
| | | private BigDecimal residualRate; |
| | | /** |
| | | * ç´¯è®¡ææ§ |
| | | */ |
| | | private BigDecimal accumulatedDepreciation; |
| | | /** |
| | | * åå¼ = åå¼ - ç´¯è®¡ææ§ |
| | | */ |
| | | private BigDecimal netValue; |
| | | /** |
| | | * åæ¾å°ç¹ |
| | | */ |
| | | private String location; |
| | | /** |
| | | * 使ç¨é¨é¨ï¼å·²åºå¼ï¼ |
| | | * |
| | | * åå²éççèªç±ææ¬åï¼å·²ä¸ååå
¥ä¸è¯»åï¼å±ç¤ºç¨çé¨é¨åç§°ç± departmentId 宿¶è§£æï¼ |
| | | * ä¿çåæ¯ä¸ºäºä¸ä¸¢å岿°æ®ï¼æ°é»è¾ä¸å¾ç¨ departmentIdã |
| | | */ |
| | | private String department; |
| | | /** |
| | | * ä¿ç®¡äººï¼å·²åºå¼ï¼ |
| | | * |
| | | * å departmentï¼åå²éççèªç±ææ¬åï¼å·²ä¸ååå
¥ä¸è¯»åï¼å±ç¤ºç¨æµç§°ç± keeperId 宿¶è§£æã |
| | | */ |
| | | private String keeper; |
| | | /** |
| | | * 使ç¨é¨é¨ç¼å· |
| | | * |
| | | * å
³è {@link cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO#getId()} |
| | | */ |
| | | private Long departmentId; |
| | | /** |
| | | * ä¿ç®¡äººç¼å· |
| | | * |
| | | * å
³è {@link cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO#getId()} |
| | | */ |
| | | private Long keeperId; |
| | | /** |
| | | * ç¶æ |
| | | * |
| | | * æä¸¾ {@link cn.iocoder.yudao.module.finance.enums.FinFixedAssetStatusEnum} |
| | | */ |
| | | private Integer status; |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.dal.dataobject.asset; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | |
| | | /** |
| | | * æ å½¢èµäº§ DO |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @TableName("fin_intangible_asset") |
| | | @KeySequence("fin_intangible_asset_seq") // ç¨äº OracleãPostgreSQLãKingbaseãDB2ãH2 æ°æ®åºç主é®èªå¢ãå¦ææ¯ MySQL çæ°æ®åºï¼å¯ä¸åã |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class FinIntangibleAssetDO extends BaseDO { |
| | | |
| | | /** |
| | | * èµäº§ç¼å· |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | /** |
| | | * èµäº§ç¼å· |
| | | * |
| | | * ä¾å¦è¯´ï¼WX20260512001 |
| | | */ |
| | | private String assetCode; |
| | | /** |
| | | * èµäº§åç§° |
| | | */ |
| | | private String assetName; |
| | | /** |
| | | * èµäº§ç±»å« |
| | | */ |
| | | private String category; |
| | | /** |
| | | * è¯ä¹¦ç¼å· |
| | | */ |
| | | private String certificateNo; |
| | | /** |
| | | * å徿¥æ |
| | | */ |
| | | private LocalDate acquisitionDate; |
| | | /** |
| | | * èµäº§åå¼ |
| | | */ |
| | | private BigDecimal originalValue; |
| | | /** |
| | | * æéå¹´éï¼å¹´ï¼ |
| | | */ |
| | | private Integer amortizationPeriod; |
| | | /** |
| | | * æ®å¼çï¼%ï¼ |
| | | */ |
| | | private BigDecimal residualRate; |
| | | /** |
| | | * 累计æé |
| | | */ |
| | | private BigDecimal accumulatedAmortization; |
| | | /** |
| | | * åå¼ = åå¼ - 累计æé |
| | | */ |
| | | private BigDecimal netValue; |
| | | /** |
| | | * æææè³ |
| | | */ |
| | | private LocalDate validityDate; |
| | | /** |
| | | * ç¶æ |
| | | * |
| | | * æä¸¾ {@link cn.iocoder.yudao.module.finance.enums.FinIntangibleAssetStatusEnum} |
| | | */ |
| | | private Integer status; |
| | | /** |
| | | * èµäº§æè¿° |
| | | */ |
| | | private String description; |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.dal.dataobject.ledger; |
| | | |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | |
| | | /** |
| | | * æ»è´¦ / æç»è´¦çå彿影 |
| | | * |
| | | * è¯¥å¯¹è±¡ä¸æ¯æ°æ®åºè¡¨ï¼ä»
ç¨äºæ¿è½½ fin_voucher_entry ä¸ fin_voucher çè表æ¥è¯¢ç»æï¼ |
| | | * 便»è´¦ãæç»è´¦å¨å
åä¸éç®ä½é¢ä½¿ç¨ |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @Data |
| | | public class FinLedgerEntryDO { |
| | | |
| | | /** |
| | | * åè¯ç¼å· |
| | | */ |
| | | private Long voucherId; |
| | | /** |
| | | * åè¯åå· |
| | | */ |
| | | private String voucherNo; |
| | | /** |
| | | * åè¯æ¥æ |
| | | */ |
| | | private LocalDate voucherDate; |
| | | /** |
| | | * è¡å· |
| | | */ |
| | | private Integer rowNo; |
| | | /** |
| | | * ç§ç®ç¼ç |
| | | */ |
| | | private String subjectCode; |
| | | /** |
| | | * ç§ç®åç§° |
| | | */ |
| | | private String subjectName; |
| | | /** |
| | | * æè¦ |
| | | */ |
| | | private String summary; |
| | | /** |
| | | * åæ¹éé¢ |
| | | */ |
| | | private BigDecimal debit; |
| | | /** |
| | | * è´·æ¹éé¢ |
| | | */ |
| | | private BigDecimal credit; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.dal.dataobject.subject; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | /** |
| | | * ä¼è®¡ç§ç® DO |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @TableName("fin_account_subject") |
| | | @KeySequence("fin_account_subject_seq") // ç¨äº OracleãPostgreSQLãKingbaseãDB2ãH2 æ°æ®åºç主é®èªå¢ãå¦ææ¯ MySQL çæ°æ®åºï¼å¯ä¸åã |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class FinAccountSubjectDO extends BaseDO { |
| | | |
| | | /** |
| | | * ç§ç®ç¼å· |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | /** |
| | | * ç¶ç§ç®ç¼å· |
| | | * |
| | | * å
³è {@link #id}ï¼ä¸ºç©ºæ¶è¡¨ç¤ºæ ¹ç§ç® |
| | | */ |
| | | private Long parentId; |
| | | /** |
| | | * ç§ç®ç¼ç |
| | | */ |
| | | private String subjectCode; |
| | | /** |
| | | * ç§ç®åç§° |
| | | */ |
| | | private String subjectName; |
| | | /** |
| | | * ç§ç®ç±»å |
| | | * |
| | | * æä¸¾ {@link cn.iocoder.yudao.module.finance.enums.FinSubjectTypeEnum} |
| | | */ |
| | | private Integer subjectType; |
| | | /** |
| | | * ä½é¢æ¹å |
| | | * |
| | | * æä¸¾ {@link cn.iocoder.yudao.module.finance.enums.FinBalanceDirectionEnum} |
| | | */ |
| | | private Integer balanceDirection; |
| | | /** |
| | | * ç¶æ |
| | | * |
| | | * æä¸¾ {@link cn.iocoder.yudao.framework.common.enums.CommonStatusEnum} |
| | | */ |
| | | private Integer status; |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.dal.dataobject.voucher; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | |
| | | /** |
| | | * è®°è´¦åè¯ DO |
| | | * |
| | | * å¶å人使ç¨åºç±» {@link BaseDO#getCreator()} åæ®µï¼ä¸ååç¬å»ºå |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @TableName("fin_voucher") |
| | | @KeySequence("fin_voucher_seq") // ç¨äº OracleãPostgreSQLãKingbaseãDB2ãH2 æ°æ®åºç主é®èªå¢ãå¦ææ¯ MySQL çæ°æ®åºï¼å¯ä¸åã |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class FinVoucherDO extends BaseDO { |
| | | |
| | | /** |
| | | * åè¯ç¼å· |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | /** |
| | | * åè¯åå· |
| | | * |
| | | * ä¾å¦è¯´ï¼è®°-0001 |
| | | */ |
| | | private String voucherNo; |
| | | /** |
| | | * åè¯æ¥æ |
| | | */ |
| | | private LocalDate voucherDate; |
| | | /** |
| | | * æè¦ |
| | | */ |
| | | private String summary; |
| | | /** |
| | | * åæ¹å计 |
| | | */ |
| | | private BigDecimal debit; |
| | | /** |
| | | * è´·æ¹å计 |
| | | */ |
| | | private BigDecimal credit; |
| | | /** |
| | | * åè¯ç¶æ |
| | | * |
| | | * æä¸¾ {@link cn.iocoder.yudao.module.finance.enums.FinVoucherStatusEnum} |
| | | */ |
| | | private Integer status; |
| | | /** |
| | | * éä»¶å¼ æ° |
| | | */ |
| | | private Integer attachmentCount; |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.dal.dataobject.voucher; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * åè¯åå½ DO |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @TableName("fin_voucher_entry") |
| | | @KeySequence("fin_voucher_entry_seq") // ç¨äº OracleãPostgreSQLãKingbaseãDB2ãH2 æ°æ®åºç主é®èªå¢ãå¦ææ¯ MySQL çæ°æ®åºï¼å¯ä¸åã |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class FinVoucherEntryDO extends BaseDO { |
| | | |
| | | /** |
| | | * åå½ç¼å· |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | /** |
| | | * åè¯ç¼å· |
| | | * |
| | | * å
³è {@link FinVoucherDO#getId()} |
| | | */ |
| | | private Long voucherId; |
| | | /** |
| | | * è¡å·ï¼ä» 1 å¼å§ |
| | | */ |
| | | private Integer rowNo; |
| | | /** |
| | | * ç§ç®ç¼ç |
| | | * |
| | | * å
³è {@link cn.iocoder.yudao.module.finance.dal.dataobject.subject.FinAccountSubjectDO#getSubjectCode()} |
| | | */ |
| | | private String subjectCode; |
| | | /** |
| | | * ç§ç®åç§° |
| | | * |
| | | * åä½å段ï¼ä¿åå彿¶ä»ä¼è®¡ç§ç®å¸¦åº |
| | | */ |
| | | private String subjectName; |
| | | /** |
| | | * æè¦ |
| | | */ |
| | | private String summary; |
| | | /** |
| | | * åæ¹éé¢ |
| | | */ |
| | | private BigDecimal debit; |
| | | /** |
| | | * è´·æ¹éé¢ |
| | | */ |
| | | private BigDecimal credit; |
| | | /** |
| | | * è¾
婿 ¸ç®ç±»å |
| | | * |
| | | * æä¸¾ {@link cn.iocoder.yudao.module.finance.enums.FinAuxiliaryTypeEnum} |
| | | */ |
| | | private Integer auxiliaryType; |
| | | /** |
| | | * è¾
婿 ¸ç®å¯¹è±¡ç¼å· |
| | | * |
| | | * æ ¹æ® {@link #auxiliaryType} æå客æ·ãä¾åºåãé¨é¨ãåå·¥ã项ç®çä¸»é® |
| | | */ |
| | | private String auxiliaryId; |
| | | /** |
| | | * è¾
婿 ¸ç®å¯¹è±¡åç§° |
| | | */ |
| | | private String auxiliaryName; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.dal.mysql.asset; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.asset.vo.FinFixedAssetPageReqVO; |
| | | import cn.iocoder.yudao.module.finance.dal.dataobject.asset.FinFixedAssetDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * åºå®èµäº§ Mapper |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @Mapper |
| | | public interface FinFixedAssetMapper extends BaseMapperX<FinFixedAssetDO> { |
| | | |
| | | default PageResult<FinFixedAssetDO> selectPage(FinFixedAssetPageReqVO reqVO) { |
| | | return selectPage(reqVO, new LambdaQueryWrapperX<FinFixedAssetDO>() |
| | | .likeIfPresent(FinFixedAssetDO::getAssetCode, reqVO.getAssetCode()) |
| | | .likeIfPresent(FinFixedAssetDO::getAssetName, reqVO.getAssetName()) |
| | | .eqIfPresent(FinFixedAssetDO::getCategory, reqVO.getCategory()) |
| | | .eqIfPresent(FinFixedAssetDO::getDepartmentId, reqVO.getDepartmentId()) |
| | | .eqIfPresent(FinFixedAssetDO::getKeeperId, reqVO.getKeeperId()) |
| | | .eqIfPresent(FinFixedAssetDO::getStatus, reqVO.getStatus()) |
| | | .betweenIfPresent(FinFixedAssetDO::getPurchaseDate, reqVO.getPurchaseDate()) |
| | | .orderByDesc(FinFixedAssetDO::getId)); |
| | | } |
| | | |
| | | default FinFixedAssetDO selectByAssetCode(String assetCode) { |
| | | return selectOne(FinFixedAssetDO::getAssetCode, assetCode); |
| | | } |
| | | |
| | | default List<FinFixedAssetDO> selectListByIds(Collection<Long> ids) { |
| | | return selectList(new LambdaQueryWrapperX<FinFixedAssetDO>() |
| | | .in(FinFixedAssetDO::getId, ids)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.dal.mysql.asset; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.asset.vo.FinIntangibleAssetPageReqVO; |
| | | import cn.iocoder.yudao.module.finance.dal.dataobject.asset.FinIntangibleAssetDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * æ å½¢èµäº§ Mapper |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @Mapper |
| | | public interface FinIntangibleAssetMapper extends BaseMapperX<FinIntangibleAssetDO> { |
| | | |
| | | default PageResult<FinIntangibleAssetDO> selectPage(FinIntangibleAssetPageReqVO reqVO) { |
| | | return selectPage(reqVO, new LambdaQueryWrapperX<FinIntangibleAssetDO>() |
| | | .likeIfPresent(FinIntangibleAssetDO::getAssetCode, reqVO.getAssetCode()) |
| | | .likeIfPresent(FinIntangibleAssetDO::getAssetName, reqVO.getAssetName()) |
| | | .eqIfPresent(FinIntangibleAssetDO::getCategory, reqVO.getCategory()) |
| | | .likeIfPresent(FinIntangibleAssetDO::getCertificateNo, reqVO.getCertificateNo()) |
| | | .eqIfPresent(FinIntangibleAssetDO::getStatus, reqVO.getStatus()) |
| | | .betweenIfPresent(FinIntangibleAssetDO::getAcquisitionDate, reqVO.getAcquisitionDate()) |
| | | .orderByDesc(FinIntangibleAssetDO::getId)); |
| | | } |
| | | |
| | | default FinIntangibleAssetDO selectByAssetCode(String assetCode) { |
| | | return selectOne(FinIntangibleAssetDO::getAssetCode, assetCode); |
| | | } |
| | | |
| | | default List<FinIntangibleAssetDO> selectListByIds(Collection<Long> ids) { |
| | | return selectList(new LambdaQueryWrapperX<FinIntangibleAssetDO>() |
| | | .in(FinIntangibleAssetDO::getId, ids)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.dal.mysql.ledger; |
| | | |
| | | import cn.iocoder.yudao.module.finance.dal.dataobject.ledger.FinLedgerEntryDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | import org.apache.ibatis.annotations.Param; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * æ»è´¦ / æç»è´¦ Mapper |
| | | * |
| | | * åªç»è®¡å·²è¿è´¦ï¼status = postedï¼çåè¯åå½ï¼æ»è´¦ãæç»è´¦çä½é¢å¨ Service 屿æé´éç®ï¼ |
| | | * ä¿è¯å£å¾ä¸åè¯ç¶æä¸è´ |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @Mapper |
| | | public interface FinLedgerMapper { |
| | | |
| | | /** |
| | | * æ¥è¯¢æå®ç§ç®ï¼å¯å¤ä¸ªï¼å¨æå®æ¥æåºé´å
çå·²è¿è´¦åå½ |
| | | * |
| | | * @param subjectCodes ç§ç®ç¼ç éå |
| | | * @param startDate å¼å§æ¥æï¼å«ï¼ |
| | | * @param endDate ç»ææ¥æï¼å«ï¼ |
| | | * @param status åè¯ç¶æ |
| | | * @return åå½åè¡¨ï¼æåè¯æ¥æãåè¯ç¼å·ãè¡å·ååºï¼ |
| | | */ |
| | | List<FinLedgerEntryDO> selectEntryList(@Param("subjectCodes") Collection<String> subjectCodes, |
| | | @Param("startDate") LocalDate startDate, |
| | | @Param("endDate") LocalDate endDate, |
| | | @Param("status") Integer status); |
| | | |
| | | /** |
| | | * æ¥è¯¢æå®ç§ç®ï¼å¯å¤ä¸ªï¼å¨æå®æ¥æä¹åçå·²è¿è´¦åå½åé¢ï¼å³æåä½é¢ |
| | | * |
| | | * @param subjectCodes ç§ç®ç¼ç éå |
| | | * @param date æ¥æï¼ä¸å«ï¼ |
| | | * @param status åè¯ç¶æ |
| | | * @return åé¢ï¼åæ¹ä¸ºæ£ãè´·æ¹ä¸ºè´ |
| | | */ |
| | | BigDecimal selectBalanceBeforeDate(@Param("subjectCodes") Collection<String> subjectCodes, |
| | | @Param("date") LocalDate date, |
| | | @Param("status") Integer status); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.dal.mysql.subject; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.subject.vo.FinAccountSubjectPageReqVO; |
| | | import cn.iocoder.yudao.module.finance.dal.dataobject.subject.FinAccountSubjectDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * ä¼è®¡ç§ç® Mapper |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @Mapper |
| | | public interface FinAccountSubjectMapper extends BaseMapperX<FinAccountSubjectDO> { |
| | | |
| | | default PageResult<FinAccountSubjectDO> selectPage(FinAccountSubjectPageReqVO reqVO) { |
| | | return selectPage(reqVO, new LambdaQueryWrapperX<FinAccountSubjectDO>() |
| | | .likeIfPresent(FinAccountSubjectDO::getSubjectCode, reqVO.getSubjectCode()) |
| | | .likeIfPresent(FinAccountSubjectDO::getSubjectName, reqVO.getSubjectName()) |
| | | .eqIfPresent(FinAccountSubjectDO::getSubjectType, reqVO.getSubjectType()) |
| | | .eqIfPresent(FinAccountSubjectDO::getStatus, reqVO.getStatus()) |
| | | .orderByAsc(FinAccountSubjectDO::getSubjectCode)); |
| | | } |
| | | |
| | | default FinAccountSubjectDO selectBySubjectCode(String subjectCode) { |
| | | return selectOne(FinAccountSubjectDO::getSubjectCode, subjectCode); |
| | | } |
| | | |
| | | default List<FinAccountSubjectDO> selectListByParentId(Long parentId) { |
| | | return selectList(FinAccountSubjectDO::getParentId, parentId); |
| | | } |
| | | |
| | | default List<FinAccountSubjectDO> selectListBySubjectCodes(Collection<String> subjectCodes) { |
| | | return selectList(new LambdaQueryWrapperX<FinAccountSubjectDO>() |
| | | .in(FinAccountSubjectDO::getSubjectCode, subjectCodes)); |
| | | } |
| | | |
| | | default List<FinAccountSubjectDO> selectListAll() { |
| | | return selectList(new LambdaQueryWrapperX<FinAccountSubjectDO>() |
| | | .orderByAsc(FinAccountSubjectDO::getSubjectCode)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.dal.mysql.voucher; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.finance.dal.dataobject.voucher.FinVoucherEntryDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * åè¯åå½ Mapper |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @Mapper |
| | | public interface FinVoucherEntryMapper extends BaseMapperX<FinVoucherEntryDO> { |
| | | |
| | | default List<FinVoucherEntryDO> selectListByVoucherId(Long voucherId) { |
| | | return selectList(new LambdaQueryWrapperX<FinVoucherEntryDO>() |
| | | .eq(FinVoucherEntryDO::getVoucherId, voucherId) |
| | | .orderByAsc(FinVoucherEntryDO::getRowNo)); |
| | | } |
| | | |
| | | default List<FinVoucherEntryDO> selectListByVoucherIds(Collection<Long> voucherIds) { |
| | | return selectList(new LambdaQueryWrapperX<FinVoucherEntryDO>() |
| | | .in(FinVoucherEntryDO::getVoucherId, voucherIds) |
| | | .orderByAsc(FinVoucherEntryDO::getVoucherId) |
| | | .orderByAsc(FinVoucherEntryDO::getRowNo)); |
| | | } |
| | | |
| | | default Long selectCountBySubjectCodes(Collection<String> subjectCodes) { |
| | | return selectCount(new LambdaQueryWrapperX<FinVoucherEntryDO>() |
| | | .in(FinVoucherEntryDO::getSubjectCode, subjectCodes)); |
| | | } |
| | | |
| | | default void deleteByVoucherId(Long voucherId) { |
| | | delete(new LambdaQueryWrapperX<FinVoucherEntryDO>() |
| | | .eq(FinVoucherEntryDO::getVoucherId, voucherId)); |
| | | } |
| | | |
| | | default void deleteByVoucherIds(Collection<Long> voucherIds) { |
| | | delete(new LambdaQueryWrapperX<FinVoucherEntryDO>() |
| | | .in(FinVoucherEntryDO::getVoucherId, voucherIds)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.dal.mysql.voucher; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.voucher.vo.FinVoucherPageReqVO; |
| | | import cn.iocoder.yudao.module.finance.dal.dataobject.voucher.FinVoucherDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.time.LocalDate; |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * è®°è´¦åè¯ Mapper |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @Mapper |
| | | public interface FinVoucherMapper extends BaseMapperX<FinVoucherDO> { |
| | | |
| | | /** |
| | | * @param creatorIds å¶å人ç¼å·éåãå表éå±ç¤ºçæ¯æµç§°ï¼æä»¥ reqVO.getCreator() æ¿å°çæ¯æµç§°/ç¼å·è¿ç±» |
| | | * æç´¢è¯ï¼ç± Service å
è§£ææç¼å·éååä¼ è¿æ¥ï¼ä¼ null è¡¨ç¤ºä¸æå¶åäººè¿æ»¤ã |
| | | */ |
| | | default PageResult<FinVoucherDO> selectPage(FinVoucherPageReqVO reqVO, Collection<String> creatorIds) { |
| | | return selectPage(reqVO, new LambdaQueryWrapperX<FinVoucherDO>() |
| | | .likeIfPresent(FinVoucherDO::getVoucherNo, reqVO.getVoucherNo()) |
| | | .likeIfPresent(FinVoucherDO::getSummary, reqVO.getSummary()) |
| | | // 注æï¼creator åçæ¯ç¨æ·ç¼å·ï¼æç´¢è¯ä¸æ¯ç¼å·ï¼æ¯æµç§°ï¼æ¶ä¸è½ç´æ¥ likeï¼ |
| | | // å¦åãèµµç£ãè¿ç§æµç§°æ°¸è¿å¹é
ä¸ä¸ï¼Service å·²ç»ææç´¢è¯è§£ææç¼å·éå |
| | | .inIfPresent(FinVoucherDO::getCreator, creatorIds) |
| | | .eqIfPresent(FinVoucherDO::getStatus, reqVO.getStatus()) |
| | | .betweenIfPresent(FinVoucherDO::getVoucherDate, reqVO.getVoucherDate()) |
| | | .orderByDesc(FinVoucherDO::getVoucherDate) |
| | | .orderByDesc(FinVoucherDO::getId)); |
| | | } |
| | | |
| | | default FinVoucherDO selectByVoucherNo(String voucherNo) { |
| | | return selectOne(FinVoucherDO::getVoucherNo, voucherNo); |
| | | } |
| | | |
| | | default List<FinVoucherDO> selectListByIds(Collection<Long> ids) { |
| | | return selectList(new LambdaQueryWrapperX<FinVoucherDO>() |
| | | .in(FinVoucherDO::getId, ids)); |
| | | } |
| | | |
| | | default Long selectCountByStatus(Integer status) { |
| | | return selectCount(FinVoucherDO::getStatus, status); |
| | | } |
| | | |
| | | default List<FinVoucherDO> selectListByDateBetween(LocalDate startDate, LocalDate endDate) { |
| | | return selectList(new LambdaQueryWrapperX<FinVoucherDO>() |
| | | .geIfPresent(FinVoucherDO::getVoucherDate, startDate) |
| | | .leIfPresent(FinVoucherDO::getVoucherDate, endDate)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.dal.redis; |
| | | |
| | | /** |
| | | * Finance Redis Key æä¸¾ç±» |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | public interface RedisKeyConstants { |
| | | |
| | | /** |
| | | * åºå·çç¼å |
| | | * |
| | | * KEY æ ¼å¼ï¼finance:seq_no:{prefix} |
| | | * VALUE æ°æ®æ ¼å¼ï¼ç¼å·èªå¢ |
| | | */ |
| | | String NO = "finance:seq_no:"; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.dal.redis.no; |
| | | |
| | | import cn.hutool.core.date.DatePattern; |
| | | import cn.hutool.core.date.DateUtil; |
| | | import cn.iocoder.yudao.module.finance.dal.redis.RedisKeyConstants; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.data.redis.core.StringRedisTemplate; |
| | | import org.springframework.stereotype.Repository; |
| | | |
| | | import java.time.Duration; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * Finance åºå·ç Redis DAO |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @Repository |
| | | public class FinNoRedisDAO { |
| | | |
| | | /** |
| | | * åè¯åçé»è®¤åå· |
| | | */ |
| | | public static final String VOUCHER_NO_PREFIX = "è®°"; |
| | | |
| | | @Resource |
| | | private StringRedisTemplate stringRedisTemplate; |
| | | |
| | | /** |
| | | * çæåºå·ï¼ä½¿ç¨å½åæ¥æï¼æ ¼å¼ä¸º {PREFIX} + yyyyMM + 4 ä½èªå¢ |
| | | * ä¾å¦è¯´ï¼è®° 202609 0001 ï¼æ²¡æä¸é´ç©ºæ ¼ï¼ |
| | | * |
| | | * @param prefix åç¼ |
| | | * @return åºå· |
| | | */ |
| | | public String generate(String prefix) { |
| | | // éå¢åºå· |
| | | String noPrefix = prefix + DateUtil.format(LocalDateTime.now(), DatePattern.SIMPLE_MONTH_PATTERN); |
| | | String key = RedisKeyConstants.NO + noPrefix; |
| | | Long no = stringRedisTemplate.opsForValue().increment(key); |
| | | // è®¾ç½®è¿ææ¶é´ |
| | | stringRedisTemplate.expire(key, Duration.ofDays(1L)); |
| | | return noPrefix + String.format("%04d", no); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.enums; |
| | | |
| | | /** |
| | | * Finance åå
¸ç±»åçæä¸¾ç±» |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | public interface DictTypeConstants { |
| | | |
| | | String SUBJECT_TYPE = "finance_subject_type"; // ç§ç®ç±»å |
| | | String BALANCE_DIRECTION = "finance_balance_direction"; // ä½é¢æ¹å |
| | | String AUXILIARY_TYPE = "finance_auxiliary_type"; // è¾
婿 ¸ç®ç±»å |
| | | String VOUCHER_STATUS = "finance_voucher_status"; // åè¯ç¶æ |
| | | String FIXED_ASSET_STATUS = "finance_fixed_asset_status"; // åºå®èµäº§ç¶æ |
| | | String INTANGIBLE_ASSET_STATUS = "finance_intangible_asset_status"; // æ å½¢èµäº§ç¶æ |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.enums; |
| | | |
| | | import cn.iocoder.yudao.framework.common.exception.ErrorCode; |
| | | |
| | | /** |
| | | * Finance 模åé误ç |
| | | * |
| | | * finance 模åï¼ä½¿ç¨ 1-060-xxx-xxx 段 |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | public interface ErrorCodeConstants { |
| | | |
| | | // ========== ä¼è®¡ç§ç® 1_060_100_xxx ========== |
| | | ErrorCode ACCOUNT_SUBJECT_NOT_EXISTS = new ErrorCode(1_060_100_000, "ä¼è®¡ç§ç®ä¸åå¨"); |
| | | ErrorCode ACCOUNT_SUBJECT_CODE_DUPLICATE = new ErrorCode(1_060_100_001, "ç§ç®ç¼ç ã{}ãå·²åå¨ï¼è¯·æ´æ¢åéè¯"); |
| | | ErrorCode ACCOUNT_SUBJECT_PARENT_NOT_EXISTS = new ErrorCode(1_060_100_002, "ç¶ç§ç®ã{}ãä¸åå¨ï¼è¯·éæ°éæ©ä¸çº§ç§ç®"); |
| | | ErrorCode ACCOUNT_SUBJECT_PARENT_SELF = new ErrorCode(1_060_100_003, "ä¸çº§ç§ç®ä¸è½éæ©èªå·±ï¼è¯·éæ°éæ©"); |
| | | ErrorCode ACCOUNT_SUBJECT_PARENT_CYCLE = new ErrorCode(1_060_100_004, "ä¸çº§ç§ç®ã{}ãæ¯å½åç§ç®çä¸çº§ï¼ä¼å½¢æå¾ªç¯ï¼è¯·éæ°éæ©"); |
| | | ErrorCode ACCOUNT_SUBJECT_HAS_CHILDREN = new ErrorCode(1_060_100_005, "ä¼è®¡ç§ç®ã{}ãä¸è¿æ {} 个ä¸çº§ç§ç®ï¼è¯·å
å é¤æè½¬ç§»ä¸çº§ç§ç®"); |
| | | ErrorCode ACCOUNT_SUBJECT_REFERENCED = new ErrorCode(1_060_100_006, "ä¼è®¡ç§ç®ã{}ã已被 {} æ¡åè¯åå½å¼ç¨ï¼æ æ³å é¤ï¼è¯·å
å¤ç对åºåè¯"); |
| | | |
| | | // ========== åè¯ 1_060_101_xxx ========== |
| | | ErrorCode VOUCHER_NOT_EXISTS = new ErrorCode(1_060_101_000, "åè¯ä¸åå¨"); |
| | | ErrorCode VOUCHER_NO_DUPLICATE = new ErrorCode(1_060_101_001, "åè¯åå·ã{}ãå·²åå¨ï¼è¯·æ´æ¢åéè¯"); |
| | | ErrorCode VOUCHER_ENTRY_EMPTY = new ErrorCode(1_060_101_002, "åè¯è³å°éè¦ä¸æ¡ææåå½ï¼ç§ç®ä¸ä¸ºç©ºï¼ä¸åæ¹æè´·æ¹éé¢å¤§äº 0ï¼"); |
| | | ErrorCode VOUCHER_ENTRY_DIRECTION_BOTH = new ErrorCode(1_060_101_003, "第 {} è¡åå½ï¼ç§ç®ã{}ãï¼çåæ¹éé¢ã{}ãä¸è´·æ¹éé¢ã{}ãä¸è½åæ¶å¤§äº 0ï¼è¯·åªå¡«åå
¶ä¸ä¸æ¹"); |
| | | ErrorCode VOUCHER_ENTRY_SUBJECT_NOT_EXISTS = new ErrorCode(1_060_101_004, "第 {} è¡åå½çç§ç®ç¼ç ã{}ãä¸åå¨ï¼è¯·éæ°éæ©ç§ç®"); |
| | | ErrorCode VOUCHER_ENTRY_UNBALANCED = new ErrorCode(1_060_101_005, "åè¯åè´·ä¸å¹³è¡¡ï¼åæ¹å计ã{}ãå
ï¼è´·æ¹å计ã{}ãå
ï¼ä¸¤è
å¿
é¡»ç¸çä¸å¤§äº 0"); |
| | | ErrorCode VOUCHER_STATUS_NOT_UNPOSTED = new ErrorCode(1_060_101_006, "åè¯ã{}ãå½åç¶æä¸ºã{}ãï¼åªææªè¿è´¦çåè¯å
è®¸ä¿®æ¹æè¿è´¦"); |
| | | ErrorCode VOUCHER_DELETE_NOT_ALLOWED = new ErrorCode(1_060_101_007, "åè¯ã{}ãå½åç¶æä¸ºã{}ãï¼ä¸å
许å é¤ï¼å·²è¿è´¦åè¯è¯·ç¼å¶çº¢ååè¯å²éï¼å·²ä½åºåè¯å¯ç´æ¥å é¤"); |
| | | ErrorCode VOUCHER_ENTRY_SUBJECT_REQUIRED = new ErrorCode(1_060_101_008, "第 {} è¡åå½å·²å¡«åéé¢ï¼åæ¹ã{}ãå
ãè´·æ¹ã{}ãå
ï¼ï¼ä½æªéæ©ä¼è®¡ç§ç®ï¼è¯·éæ©ç§ç®æå é¤è¯¥è¡"); |
| | | ErrorCode VOUCHER_ENTRY_AMOUNT_REQUIRED = new ErrorCode(1_060_101_009, "第 {} è¡åå½ï¼ç§ç®ã{}ãï¼æªå¡«ååæ¹æè´·æ¹éé¢ï¼è¯·è¡¥å
¨é颿å é¤è¯¥è¡"); |
| | | ErrorCode VOUCHER_STATUS_NOT_CANCELLABLE = new ErrorCode(1_060_101_010, "åè¯ã{}ãå½åç¶æä¸ºã{}ãï¼å·²ä½åºçåè¯ä¸è½éå¤ä½åº"); |
| | | |
| | | // ========== æ»è´¦ / æç»è´¦ 1_060_102_xxx ========== |
| | | ErrorCode LEDGER_SUBJECT_REQUIRED = new ErrorCode(1_060_102_000, "æ¥è¯¢æ»è´¦/æç»è´¦å¿
é¡»æå®ä¼è®¡ç§ç®"); |
| | | ErrorCode LEDGER_MONTH_RANGE_INVALID = new ErrorCode(1_060_102_001, "æ¥è¯¢æé´ä¸åæ³ï¼å¼å§æä»½ã{}ãä¸è½æäºç»ææä»½ã{}ã"); |
| | | ErrorCode LEDGER_SUBJECT_NOT_EXISTS = new ErrorCode(1_060_102_002, "ä¼è®¡ç§ç®ã{}ãä¸åå¨ï¼è¯·éæ°éæ©ç§ç®"); |
| | | |
| | | // ========== è´¢å¡æ¥è¡¨ / ä¼è®¡æ ¸ç®çæ¿ 1_060_103_xxx ========== |
| | | ErrorCode STATISTICS_PERIOD_INVALID = new ErrorCode(1_060_103_000, "ç»è®¡æé´ä¸åæ³ï¼å¼å§æä»½ã{}ãä¸è½æäºç»ææä»½ã{}ã"); |
| | | |
| | | // ========== åºå®èµäº§ 1_060_200_xxx ========== |
| | | ErrorCode FIXED_ASSET_NOT_EXISTS = new ErrorCode(1_060_200_000, "åºå®èµäº§ä¸åå¨"); |
| | | ErrorCode FIXED_ASSET_CODE_DUPLICATE = new ErrorCode(1_060_200_001, "èµäº§ç¼å·ã{}ãå·²åå¨ï¼è¯·æ´æ¢åéè¯"); |
| | | ErrorCode FIXED_ASSET_DEPRECIATE_EMPTY = new ErrorCode(1_060_200_002, "没æå¯è®¡æææ§çåºå®èµäº§ï¼æéèµäº§çç´¯è®¡ææ§åå·²æè¶³ï¼æ éå计æ"); |
| | | ErrorCode FIXED_ASSET_DEPRECIATE_NEGATIVE = new ErrorCode(1_060_200_003, "åºå®èµäº§ã{}ãçåå¼ä¸ºã{}ãå
ã使ç¨å¹´é {} å¹´ãæ®å¼ç {}%ï¼æææ§é¢è®¡ç®ç»æå°äºçäº 0ï¼è¯·æ£æ¥åå¼ã使ç¨å¹´é䏿®å¼çåéæ°ä¿å该èµäº§"); |
| | | |
| | | // ========== æ å½¢èµäº§ 1_060_201_xxx ========== |
| | | ErrorCode INTANGIBLE_ASSET_NOT_EXISTS = new ErrorCode(1_060_201_000, "æ å½¢èµäº§ä¸åå¨"); |
| | | ErrorCode INTANGIBLE_ASSET_CODE_DUPLICATE = new ErrorCode(1_060_201_001, "èµäº§ç¼å·ã{}ãå·²åå¨ï¼è¯·æ´æ¢åéè¯"); |
| | | ErrorCode INTANGIBLE_ASSET_AMORTIZE_EMPTY = new ErrorCode(1_060_201_002, "没æå¯è®¡ææéçæ å½¢èµäº§ï¼æéèµäº§ç累计æéåå·²æå®ï¼æ éå计æ"); |
| | | ErrorCode INTANGIBLE_ASSET_AMORTIZE_NEGATIVE = new ErrorCode(1_060_201_003, "æ å½¢èµäº§ã{}ãçåå¼ä¸ºã{}ãå
ãæéå¹´é {} å¹´ãæ®å¼ç {}%ï¼ææéé¢è®¡ç®ç»æå°äºçäº 0ï¼è¯·æ£æ¥åå¼ãæéå¹´é䏿®å¼çåéæ°ä¿å该èµäº§"); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.enums; |
| | | |
| | | import cn.iocoder.yudao.framework.common.core.ArrayValuable; |
| | | import lombok.Getter; |
| | | import lombok.RequiredArgsConstructor; |
| | | |
| | | import java.util.Arrays; |
| | | |
| | | /** |
| | | * åè¯åå½åè¾
婿 ¸ç®ç±»åæä¸¾ |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @RequiredArgsConstructor |
| | | @Getter |
| | | public enum FinAuxiliaryTypeEnum implements ArrayValuable<Integer> { |
| | | |
| | | CUSTOMER(1, "客æ·"), |
| | | SUPPLIER(2, "ä¾åºå"), |
| | | DEPARTMENT(3, "é¨é¨"), |
| | | EMPLOYEE(4, "åå·¥"), |
| | | PROJECT(5, "项ç®"); |
| | | |
| | | public static final Integer[] ARRAYS = Arrays.stream(values()).map(FinAuxiliaryTypeEnum::getType).toArray(Integer[]::new); |
| | | |
| | | /** |
| | | * ç±»å |
| | | */ |
| | | private final Integer type; |
| | | /** |
| | | * ç±»åå |
| | | */ |
| | | private final String name; |
| | | |
| | | @Override |
| | | public Integer[] array() { |
| | | return ARRAYS; |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.enums; |
| | | |
| | | import cn.iocoder.yudao.framework.common.core.ArrayValuable; |
| | | import lombok.Getter; |
| | | import lombok.RequiredArgsConstructor; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.Arrays; |
| | | |
| | | /** |
| | | * ä¼è®¡ç§ç®ä½é¢æ¹åæä¸¾ |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @RequiredArgsConstructor |
| | | @Getter |
| | | public enum FinBalanceDirectionEnum implements ArrayValuable<Integer> { |
| | | |
| | | DEBIT(1, "å"), |
| | | CREDIT(2, "è´·"); |
| | | |
| | | public static final Integer[] ARRAYS = Arrays.stream(values()).map(FinBalanceDirectionEnum::getDirection).toArray(Integer[]::new); |
| | | |
| | | /** |
| | | * æ¹å |
| | | */ |
| | | private final Integer direction; |
| | | /** |
| | | * æ¹åå |
| | | */ |
| | | private final String name; |
| | | |
| | | @Override |
| | | public Integer[] array() { |
| | | return ARRAYS; |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®ä½é¢ï¼åæ¹ä¸ºæ£ãè´·æ¹ä¸ºè´ï¼å¤æä½é¢æ¹å |
| | | * |
| | | * @param balance ä½é¢ï¼å
è®¸ä¸ºç©ºï¼æ 0 å¤çï¼ |
| | | * @return ä½é¢æ¹å |
| | | */ |
| | | public static Integer getByBalance(BigDecimal balance) { |
| | | return balance != null && balance.compareTo(BigDecimal.ZERO) < 0 |
| | | ? CREDIT.getDirection() : DEBIT.getDirection(); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.enums; |
| | | |
| | | import cn.iocoder.yudao.framework.common.core.ArrayValuable; |
| | | import lombok.Getter; |
| | | import lombok.RequiredArgsConstructor; |
| | | |
| | | import java.util.Arrays; |
| | | |
| | | /** |
| | | * åºå®èµäº§ç¶ææä¸¾ |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @RequiredArgsConstructor |
| | | @Getter |
| | | public enum FinFixedAssetStatusEnum implements ArrayValuable<Integer> { |
| | | |
| | | IN_USE(1, "å¨ç¨"), |
| | | IDLE(2, "é²ç½®"), |
| | | REPAIR(3, "ç»´ä¿®ä¸"), |
| | | SCRAPPED(4, "å·²æ¥åº"); |
| | | |
| | | public static final Integer[] ARRAYS = Arrays.stream(values()).map(FinFixedAssetStatusEnum::getStatus).toArray(Integer[]::new); |
| | | |
| | | /** |
| | | * ç¶æ |
| | | */ |
| | | private final Integer status; |
| | | /** |
| | | * ç¶æå |
| | | */ |
| | | private final String name; |
| | | |
| | | @Override |
| | | public Integer[] array() { |
| | | return ARRAYS; |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.enums; |
| | | |
| | | import cn.iocoder.yudao.framework.common.core.ArrayValuable; |
| | | import lombok.Getter; |
| | | import lombok.RequiredArgsConstructor; |
| | | |
| | | import java.util.Arrays; |
| | | |
| | | /** |
| | | * æ å½¢èµäº§ç¶ææä¸¾ |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @RequiredArgsConstructor |
| | | @Getter |
| | | public enum FinIntangibleAssetStatusEnum implements ArrayValuable<Integer> { |
| | | |
| | | IN_USE(1, "å¨ç¨"), |
| | | EXPIRED(2, "已失æ"), |
| | | AMORTIZED(3, "å·²æéå®"); |
| | | |
| | | public static final Integer[] ARRAYS = Arrays.stream(values()).map(FinIntangibleAssetStatusEnum::getStatus).toArray(Integer[]::new); |
| | | |
| | | /** |
| | | * ç¶æ |
| | | */ |
| | | private final Integer status; |
| | | /** |
| | | * ç¶æå |
| | | */ |
| | | private final String name; |
| | | |
| | | @Override |
| | | public Integer[] array() { |
| | | return ARRAYS; |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.enums; |
| | | |
| | | import lombok.Getter; |
| | | import lombok.RequiredArgsConstructor; |
| | | |
| | | import java.util.Arrays; |
| | | import java.util.Objects; |
| | | |
| | | /** |
| | | * æ»è´¦ / æç»è´¦è¡ç±»åæä¸¾ |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @RequiredArgsConstructor |
| | | @Getter |
| | | public enum FinLedgerRowTypeEnum { |
| | | |
| | | OPENING("opening", "æåä½é¢"), |
| | | ENTRY("entry", "æç»"), |
| | | MONTHLY_TOTAL("monthly_total", "æ¬æå计"), |
| | | YEARLY_TOTAL("yearly_total", "æ¬å¹´ç´¯è®¡"); |
| | | |
| | | /** |
| | | * è¡ç±»å |
| | | */ |
| | | private final String type; |
| | | /** |
| | | * è¡ç±»åå |
| | | */ |
| | | private final String name; |
| | | |
| | | public static FinLedgerRowTypeEnum valueOfType(String type) { |
| | | return Arrays.stream(values()).filter(item -> Objects.equals(item.getType(), type)) |
| | | .findFirst().orElse(null); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.enums; |
| | | |
| | | import cn.iocoder.yudao.framework.common.core.ArrayValuable; |
| | | import lombok.Getter; |
| | | import lombok.RequiredArgsConstructor; |
| | | |
| | | import java.util.Arrays; |
| | | |
| | | /** |
| | | * ä¼è®¡ç§ç®ç±»åæä¸¾ |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @RequiredArgsConstructor |
| | | @Getter |
| | | public enum FinSubjectTypeEnum implements ArrayValuable<Integer> { |
| | | |
| | | ASSET(1, "èµäº§ç±»"), |
| | | LIABILITY(2, "è´åºç±»"), |
| | | EQUITY(3, "ææè
æçç±»"), |
| | | COST(4, "ææ¬ç±»"), |
| | | PROFIT_LOSS(5, "æçç±»"); |
| | | |
| | | public static final Integer[] ARRAYS = Arrays.stream(values()).map(FinSubjectTypeEnum::getType).toArray(Integer[]::new); |
| | | |
| | | /** |
| | | * ç±»å |
| | | */ |
| | | private final Integer type; |
| | | /** |
| | | * ç±»åå |
| | | */ |
| | | private final String name; |
| | | |
| | | @Override |
| | | public Integer[] array() { |
| | | return ARRAYS; |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.enums; |
| | | |
| | | import cn.iocoder.yudao.framework.common.core.ArrayValuable; |
| | | import lombok.Getter; |
| | | import lombok.RequiredArgsConstructor; |
| | | |
| | | import java.util.Arrays; |
| | | import java.util.Objects; |
| | | |
| | | /** |
| | | * åè¯ç¶ææä¸¾ |
| | | * |
| | | * ç¶ææµè½¬ï¼unpostedï¼æªè¿è´¦ï¼-> postedï¼å·²è¿è´¦ï¼ï¼unpostedï¼æªè¿è´¦ï¼-> cancelledï¼å·²ä½åºï¼ |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @RequiredArgsConstructor |
| | | @Getter |
| | | public enum FinVoucherStatusEnum implements ArrayValuable<Integer> { |
| | | |
| | | UNPOSTED(0, "æªè¿è´¦"), |
| | | POSTED(10, "å·²è¿è´¦"), |
| | | CANCELLED(20, "å·²ä½åº"); |
| | | |
| | | public static final Integer[] ARRAYS = Arrays.stream(values()).map(FinVoucherStatusEnum::getStatus).toArray(Integer[]::new); |
| | | |
| | | /** |
| | | * ç¶æ |
| | | */ |
| | | private final Integer status; |
| | | /** |
| | | * ç¶æå |
| | | */ |
| | | private final String name; |
| | | |
| | | @Override |
| | | public Integer[] array() { |
| | | return ARRAYS; |
| | | } |
| | | |
| | | public static FinVoucherStatusEnum valueOf(Integer status) { |
| | | return Arrays.stream(values()).filter(item -> Objects.equals(item.getStatus(), status)) |
| | | .findFirst().orElse(null); |
| | | } |
| | | |
| | | public static String getName(Integer status) { |
| | | FinVoucherStatusEnum statusEnum = valueOf(status); |
| | | return statusEnum == null ? String.valueOf(status) : statusEnum.getName(); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.framework.web.config; |
| | | |
| | | import cn.iocoder.yudao.framework.swagger.config.YudaoSwaggerAutoConfiguration; |
| | | import org.springdoc.core.models.GroupedOpenApi; |
| | | import org.springframework.context.annotation.Bean; |
| | | import org.springframework.context.annotation.Configuration; |
| | | |
| | | /** |
| | | * finance 模åç web ç»ä»¶ç Configuration |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @Configuration(proxyBeanMethods = false) |
| | | public class FinanceWebConfiguration { |
| | | |
| | | /** |
| | | * finance 模åç API åç» |
| | | */ |
| | | @Bean |
| | | public GroupedOpenApi financeGroupedOpenApi() { |
| | | return YudaoSwaggerAutoConfiguration.buildGroupedOpenApi("finance"); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.service.asset; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | |
| | | /** |
| | | * åºå®èµäº§ææ§ / æ å½¢èµäº§æéç计ç®å·¥å
· |
| | | * |
| | | * ç»ä¸å£å¾ï¼ |
| | | * 1. åºè®¡ææ»é¢ï¼åºæ°ï¼ = åå¼ Ã (1 - æ®å¼ç / 100) |
| | | * 2. æææ§é¢ / ææéé¢ = åºè®¡ææ»é¢ / (å¹´é à 12)ï¼åèäºå
¥ä¿ç 2 ä½å°æ° |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | public class FinAssetAmountUtils { |
| | | |
| | | private FinAssetAmountUtils() { |
| | | } |
| | | |
| | | /** |
| | | * 计ç®åºè®¡ææ»é¢ï¼åºæ°ï¼ |
| | | * |
| | | * @param originalValue åå¼ |
| | | * @param residualRate æ®å¼çï¼%ï¼ |
| | | * @return åºè®¡ææ»é¢ï¼ä¿ç 2 ä½å°æ° |
| | | */ |
| | | public static BigDecimal calcDepreciableBase(BigDecimal originalValue, BigDecimal residualRate) { |
| | | return originalValue.multiply(BigDecimal.ONE.subtract(toResidualRatio(residualRate))) |
| | | .setScale(2, RoundingMode.HALF_UP); |
| | | } |
| | | |
| | | /** |
| | | * è®¡ç®æææ§é¢ / ææéé¢ |
| | | * |
| | | * @param originalValue åå¼ |
| | | * @param residualRate æ®å¼çï¼%ï¼ |
| | | * @param years å¹´éï¼å¹´ï¼ï¼å¿
é¡»å¤§äº 0 |
| | | * @return æææ§é¢ / ææéé¢ï¼ä¿ç 2 ä½å°æ° |
| | | */ |
| | | public static BigDecimal calcMonthlyAmount(BigDecimal originalValue, BigDecimal residualRate, int years) { |
| | | BigDecimal base = originalValue.multiply(BigDecimal.ONE.subtract(toResidualRatio(residualRate))); |
| | | return base.divide(BigDecimal.valueOf(years * 12L), 2, RoundingMode.HALF_UP); |
| | | } |
| | | |
| | | /** |
| | | * æ®å¼çï¼%ï¼è½¬æè®¡ç®ç¨çæ¯ä¾ï¼ä¾å¦ 5 -> 0.05 |
| | | */ |
| | | private static BigDecimal toResidualRatio(BigDecimal residualRate) { |
| | | BigDecimal rate = residualRate == null ? BigDecimal.ZERO : residualRate; |
| | | return rate.divide(BigDecimal.valueOf(100), 10, RoundingMode.HALF_UP); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.service.asset; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.asset.vo.FinFixedAssetDepreciateRespVO; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.asset.vo.FinFixedAssetPageReqVO; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.asset.vo.FinFixedAssetSaveReqVO; |
| | | import cn.iocoder.yudao.module.finance.dal.dataobject.asset.FinFixedAssetDO; |
| | | import jakarta.validation.Valid; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * åºå®èµäº§ Service æ¥å£ |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | public interface FinFixedAssetService { |
| | | |
| | | /** |
| | | * å建åºå®èµäº§ |
| | | * |
| | | * @param createReqVO åå»ºä¿¡æ¯ |
| | | * @return èµäº§ç¼å· |
| | | */ |
| | | Long createFixedAsset(@Valid FinFixedAssetSaveReqVO createReqVO); |
| | | |
| | | /** |
| | | * æ´æ°åºå®èµäº§ |
| | | * |
| | | * ä¿®æ¹åå¼ã使ç¨å¹´éãæ®å¼çæ¶ä¼ææ°åæ°éç®ç´¯è®¡ææ§ä¸åå¼ |
| | | * |
| | | * @param updateReqVO æ´æ°ä¿¡æ¯ |
| | | */ |
| | | void updateFixedAsset(@Valid FinFixedAssetSaveReqVO updateReqVO); |
| | | |
| | | /** |
| | | * å é¤åºå®èµäº§ |
| | | * |
| | | * @param id èµäº§ç¼å· |
| | | */ |
| | | void deleteFixedAsset(Long id); |
| | | |
| | | /** |
| | | * æ¹éå é¤åºå®èµäº§ |
| | | * |
| | | * @param ids èµäº§ç¼å·æ°ç» |
| | | */ |
| | | void deleteFixedAssetList(List<Long> ids); |
| | | |
| | | /** |
| | | * è®¡æææ§ |
| | | * |
| | | * æ¯ä¸ªèµäº§è®¡æä¸ä¸ªæçææ§ï¼æææ§é¢ = åå¼ Ã (1 - æ®å¼ç / 100) / (使ç¨å¹´é à 12)ã |
| | | * ç´¯è®¡ææ§ä»¥åºè®¡ææ»é¢å°é¡¶ï¼æå䏿æå©ä½å¯ææ§é¢è®¡æï¼åå¼ä¸ä¼è¢«ææè´æ° |
| | | * |
| | | * @param ids èµäº§ç¼å·æ°ç»ï¼ä¸ºç©ºæ¶å¯¹æææªæ¥åºçåºå®èµäº§è®¡æ |
| | | * @return 计æç»æ |
| | | */ |
| | | FinFixedAssetDepreciateRespVO depreciateFixedAssetList(List<Long> ids); |
| | | |
| | | /** |
| | | * è·å¾åºå®èµäº§ |
| | | * |
| | | * @param id èµäº§ç¼å· |
| | | * @return åºå®èµäº§ |
| | | */ |
| | | FinFixedAssetDO getFixedAsset(Long id); |
| | | |
| | | /** |
| | | * è·å¾åºå®èµäº§å页 |
| | | * |
| | | * @param pageReqVO å页æ¥è¯¢ |
| | | * @return åºå®èµäº§å页 |
| | | */ |
| | | PageResult<FinFixedAssetDO> getFixedAssetPage(FinFixedAssetPageReqVO pageReqVO); |
| | | |
| | | /** |
| | | * è·å¾æå®ç¼å·çåºå®èµäº§å表 |
| | | * |
| | | * @param ids èµäº§ç¼å·æ°ç» |
| | | * @return åºå®èµäº§å表 |
| | | */ |
| | | List<FinFixedAssetDO> getFixedAssetList(Collection<Long> ids); |
| | | |
| | | /** |
| | | * è·å¾å
¨é¨åºå®èµäº§å表 |
| | | * |
| | | * @return åºå®èµäº§å表 |
| | | */ |
| | | List<FinFixedAssetDO> getFixedAssetList(); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.service.asset; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.util.ObjectUtil; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.asset.vo.FinFixedAssetDepreciateRespVO; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.asset.vo.FinFixedAssetPageReqVO; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.asset.vo.FinFixedAssetSaveReqVO; |
| | | import cn.iocoder.yudao.module.finance.dal.dataobject.asset.FinFixedAssetDO; |
| | | import cn.iocoder.yudao.module.finance.dal.mysql.asset.FinFixedAssetMapper; |
| | | import cn.iocoder.yudao.module.finance.enums.FinFixedAssetStatusEnum; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | import java.util.ArrayList; |
| | | import java.util.Collection; |
| | | import java.util.Collections; |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.module.finance.enums.ErrorCodeConstants.*; |
| | | import static cn.iocoder.yudao.module.finance.service.asset.FinAssetAmountUtils.calcDepreciableBase; |
| | | import static cn.iocoder.yudao.module.finance.service.asset.FinAssetAmountUtils.calcMonthlyAmount; |
| | | |
| | | /** |
| | | * åºå®èµäº§ Service å®ç°ç±» |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @Service |
| | | @Validated |
| | | public class FinFixedAssetServiceImpl implements FinFixedAssetService { |
| | | |
| | | @Resource |
| | | private FinFixedAssetMapper fixedAssetMapper; |
| | | |
| | | @Override |
| | | public Long createFixedAsset(FinFixedAssetSaveReqVO createReqVO) { |
| | | // 1. æ ¡éªèµäº§ç¼å·å¯ä¸ |
| | | validateAssetCodeUnique(null, createReqVO.getAssetCode()); |
| | | // 2. æå
¥ï¼æ°èµäº§å°æªè®¡æææ§ |
| | | FinFixedAssetDO asset = BeanUtils.toBean(createReqVO, FinFixedAssetDO.class); |
| | | asset.setAssetCode(StrUtil.trim(asset.getAssetCode())); |
| | | asset.setResidualRate(ObjectUtil.defaultIfNull(asset.getResidualRate(), BigDecimal.ZERO)); |
| | | asset.setStatus(ObjectUtil.defaultIfNull(asset.getStatus(), FinFixedAssetStatusEnum.IN_USE.getStatus())); |
| | | asset.setAccumulatedDepreciation(BigDecimal.ZERO); |
| | | fillNetValue(asset); |
| | | fixedAssetMapper.insert(asset); |
| | | return asset.getId(); |
| | | } |
| | | |
| | | @Override |
| | | public void updateFixedAsset(FinFixedAssetSaveReqVO updateReqVO) { |
| | | // 1.1 æ ¡éªåå¨ |
| | | FinFixedAssetDO oldAsset = validateFixedAssetExists(updateReqVO.getId()); |
| | | // 1.2 æ ¡éªèµäº§ç¼å·å¯ä¸ |
| | | validateAssetCodeUnique(updateReqVO.getId(), updateReqVO.getAssetCode()); |
| | | |
| | | // 2.1 æ´æ°ï¼ç´¯è®¡ææ§ä¸ä»åç«¯æ¥æ¶ï¼æ²¿ç¨åºä¸å¼ï¼ |
| | | FinFixedAssetDO updateObj = BeanUtils.toBean(updateReqVO, FinFixedAssetDO.class); |
| | | updateObj.setAssetCode(StrUtil.trim(updateObj.getAssetCode())); |
| | | updateObj.setResidualRate(ObjectUtil.defaultIfNull(updateObj.getResidualRate(), BigDecimal.ZERO)); |
| | | updateObj.setStatus(ObjectUtil.defaultIfNull(updateObj.getStatus(), oldAsset.getStatus())); |
| | | updateObj.setAccumulatedDepreciation(ObjectUtil.defaultIfNull(oldAsset.getAccumulatedDepreciation(), BigDecimal.ZERO)); |
| | | // 2.2 åå¼ãæ®å¼çåååï¼ææ°çåºè®¡ææ»é¢å°é¡¶ç´¯è®¡ææ§ï¼å¹¶éç®åå¼ |
| | | BigDecimal depreciableBase = calcDepreciableBase(defaultIfNull(updateObj.getOriginalValue()), |
| | | updateObj.getResidualRate()); |
| | | if (updateObj.getAccumulatedDepreciation().compareTo(depreciableBase) > 0) { |
| | | updateObj.setAccumulatedDepreciation(depreciableBase); |
| | | } |
| | | fillNetValue(updateObj); |
| | | fixedAssetMapper.updateById(updateObj); |
| | | } |
| | | |
| | | @Override |
| | | public void deleteFixedAsset(Long id) { |
| | | validateFixedAssetExists(id); |
| | | fixedAssetMapper.deleteById(id); |
| | | } |
| | | |
| | | @Override |
| | | public void deleteFixedAssetList(List<Long> ids) { |
| | | if (CollUtil.isEmpty(ids)) { |
| | | return; |
| | | } |
| | | fixedAssetMapper.deleteByIds(ids); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public FinFixedAssetDepreciateRespVO depreciateFixedAssetList(List<Long> ids) { |
| | | // 1. æ¥è¯¢å¾
计æçèµäº§ï¼å·²æ¥åºçä¸å计æ |
| | | List<FinFixedAssetDO> assets = CollUtil.isEmpty(ids) |
| | | ? fixedAssetMapper.selectList() : fixedAssetMapper.selectListByIds(ids); |
| | | List<FinFixedAssetDO> updateList = new ArrayList<>(); |
| | | BigDecimal totalMonthlyDepreciation = BigDecimal.ZERO; |
| | | for (FinFixedAssetDO asset : assets) { |
| | | if (FinFixedAssetStatusEnum.SCRAPPED.getStatus().equals(asset.getStatus())) { |
| | | continue; |
| | | } |
| | | BigDecimal originalValue = defaultIfNull(asset.getOriginalValue()); |
| | | BigDecimal residualRate = defaultIfNull(asset.getResidualRate()); |
| | | int usefulLife = ObjectUtil.defaultIfNull(asset.getUsefulLife(), 0); |
| | | BigDecimal accumulated = defaultIfNull(asset.getAccumulatedDepreciation()); |
| | | // 1.1 å·²æè¶³çä¸å计æ |
| | | BigDecimal depreciableBase = calcDepreciableBase(originalValue, residualRate); |
| | | BigDecimal remaining = depreciableBase.subtract(accumulated); |
| | | if (remaining.compareTo(BigDecimal.ZERO) <= 0) { |
| | | continue; |
| | | } |
| | | // 1.2 åæ°å¼å¸¸å¯¼è´æææ§é¢éæ£ |
| | | BigDecimal monthlyDepreciation = usefulLife <= 0 ? BigDecimal.ZERO |
| | | : calcMonthlyAmount(originalValue, residualRate, usefulLife); |
| | | if (monthlyDepreciation.compareTo(BigDecimal.ZERO) <= 0) { |
| | | throw exception(FIXED_ASSET_DEPRECIATE_NEGATIVE, asset.getAssetName(), |
| | | formatAmount(originalValue), usefulLife, formatAmount(residualRate)); |
| | | } |
| | | // 1.3 æå䏿æå©ä½å¯ææ§é¢å°é¡¶ï¼åå¼ä¸ä¼è¢«ææè´æ° |
| | | BigDecimal periodDepreciation = monthlyDepreciation.min(remaining); |
| | | BigDecimal newAccumulated = accumulated.add(periodDepreciation); |
| | | updateList.add(new FinFixedAssetDO().setId(asset.getId()) |
| | | .setAccumulatedDepreciation(newAccumulated) |
| | | .setNetValue(originalValue.subtract(newAccumulated).max(BigDecimal.ZERO))); |
| | | totalMonthlyDepreciation = totalMonthlyDepreciation.add(periodDepreciation); |
| | | } |
| | | // 2. 没æå¯è®¡æçèµäº§ï¼æç¡®åç¥ |
| | | if (updateList.isEmpty()) { |
| | | throw exception(FIXED_ASSET_DEPRECIATE_EMPTY); |
| | | } |
| | | // 3. æ¹éæ´æ° |
| | | fixedAssetMapper.updateBatch(updateList); |
| | | return new FinFixedAssetDepreciateRespVO().setProcessedCount(updateList.size()) |
| | | .setTotalMonthlyDepreciation(totalMonthlyDepreciation); |
| | | } |
| | | |
| | | @Override |
| | | public FinFixedAssetDO getFixedAsset(Long id) { |
| | | return fixedAssetMapper.selectById(id); |
| | | } |
| | | |
| | | @Override |
| | | public PageResult<FinFixedAssetDO> getFixedAssetPage(FinFixedAssetPageReqVO pageReqVO) { |
| | | return fixedAssetMapper.selectPage(pageReqVO); |
| | | } |
| | | |
| | | @Override |
| | | public List<FinFixedAssetDO> getFixedAssetList(Collection<Long> ids) { |
| | | if (CollUtil.isEmpty(ids)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | return fixedAssetMapper.selectListByIds(ids); |
| | | } |
| | | |
| | | @Override |
| | | public List<FinFixedAssetDO> getFixedAssetList() { |
| | | return fixedAssetMapper.selectList(); |
| | | } |
| | | |
| | | private FinFixedAssetDO validateFixedAssetExists(Long id) { |
| | | if (id == null) { |
| | | throw exception(FIXED_ASSET_NOT_EXISTS); |
| | | } |
| | | FinFixedAssetDO asset = fixedAssetMapper.selectById(id); |
| | | if (asset == null) { |
| | | throw exception(FIXED_ASSET_NOT_EXISTS); |
| | | } |
| | | return asset; |
| | | } |
| | | |
| | | private void validateAssetCodeUnique(Long id, String assetCode) { |
| | | FinFixedAssetDO asset = fixedAssetMapper.selectByAssetCode(StrUtil.trim(assetCode)); |
| | | if (asset == null) { |
| | | return; |
| | | } |
| | | if (id == null || !asset.getId().equals(id)) { |
| | | throw exception(FIXED_ASSET_CODE_DUPLICATE, assetCode); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * åå¼ = åå¼ - ç´¯è®¡ææ§ï¼ä¸ä¸å°äº 0 |
| | | */ |
| | | private void fillNetValue(FinFixedAssetDO asset) { |
| | | BigDecimal netValue = defaultIfNull(asset.getOriginalValue()) |
| | | .subtract(defaultIfNull(asset.getAccumulatedDepreciation())); |
| | | asset.setNetValue(netValue.max(BigDecimal.ZERO)); |
| | | } |
| | | |
| | | private static BigDecimal defaultIfNull(BigDecimal amount) { |
| | | return amount == null ? BigDecimal.ZERO : amount; |
| | | } |
| | | |
| | | private static String formatAmount(BigDecimal amount) { |
| | | return amount.setScale(2, RoundingMode.HALF_UP).toPlainString(); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.service.asset; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.asset.vo.FinIntangibleAssetAmortizeRespVO; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.asset.vo.FinIntangibleAssetPageReqVO; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.asset.vo.FinIntangibleAssetSaveReqVO; |
| | | import cn.iocoder.yudao.module.finance.dal.dataobject.asset.FinIntangibleAssetDO; |
| | | import jakarta.validation.Valid; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * æ å½¢èµäº§ Service æ¥å£ |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | public interface FinIntangibleAssetService { |
| | | |
| | | /** |
| | | * å建æ å½¢èµäº§ |
| | | * |
| | | * @param createReqVO åå»ºä¿¡æ¯ |
| | | * @return èµäº§ç¼å· |
| | | */ |
| | | Long createIntangibleAsset(@Valid FinIntangibleAssetSaveReqVO createReqVO); |
| | | |
| | | /** |
| | | * æ´æ°æ å½¢èµäº§ |
| | | * |
| | | * ä¿®æ¹åå¼ãæéå¹´éãæ®å¼çæ¶ä¼ææ°åæ°éç®ç´¯è®¡æéä¸åå¼ |
| | | * |
| | | * @param updateReqVO æ´æ°ä¿¡æ¯ |
| | | */ |
| | | void updateIntangibleAsset(@Valid FinIntangibleAssetSaveReqVO updateReqVO); |
| | | |
| | | /** |
| | | * å 餿 å½¢èµäº§ |
| | | * |
| | | * @param id èµäº§ç¼å· |
| | | */ |
| | | void deleteIntangibleAsset(Long id); |
| | | |
| | | /** |
| | | * æ¹éå 餿 å½¢èµäº§ |
| | | * |
| | | * @param ids èµäº§ç¼å·æ°ç» |
| | | */ |
| | | void deleteIntangibleAssetList(List<Long> ids); |
| | | |
| | | /** |
| | | * 计ææé |
| | | * |
| | | * æ¯ä¸ªèµäº§è®¡æä¸ä¸ªæçæéï¼ææéé¢ = åå¼ Ã (1 - æ®å¼ç / 100) / (æéå¹´é à 12)ã |
| | | * 累计æéä»¥åºæéæ»é¢å°é¡¶ï¼æå䏿æå©ä½å¯æéé¢è®¡æï¼ |
| | | * å弿å®ï¼ä¸º 0ï¼æ¶ç¶æèªå¨ç½®ä¸ºãå·²æéå®ã |
| | | * |
| | | * @param ids èµäº§ç¼å·æ°ç»ï¼ä¸ºç©ºæ¶å¯¹æææªå¤±æçæ å½¢èµäº§è®¡æ |
| | | * @return 计æç»æ |
| | | */ |
| | | FinIntangibleAssetAmortizeRespVO amortizeIntangibleAssetList(List<Long> ids); |
| | | |
| | | /** |
| | | * è·å¾æ å½¢èµäº§ |
| | | * |
| | | * @param id èµäº§ç¼å· |
| | | * @return æ å½¢èµäº§ |
| | | */ |
| | | FinIntangibleAssetDO getIntangibleAsset(Long id); |
| | | |
| | | /** |
| | | * è·å¾æ å½¢èµäº§å页 |
| | | * |
| | | * @param pageReqVO å页æ¥è¯¢ |
| | | * @return æ å½¢èµäº§å页 |
| | | */ |
| | | PageResult<FinIntangibleAssetDO> getIntangibleAssetPage(FinIntangibleAssetPageReqVO pageReqVO); |
| | | |
| | | /** |
| | | * è·å¾æå®ç¼å·çæ å½¢èµäº§å表 |
| | | * |
| | | * @param ids èµäº§ç¼å·æ°ç» |
| | | * @return æ å½¢èµäº§å表 |
| | | */ |
| | | List<FinIntangibleAssetDO> getIntangibleAssetList(Collection<Long> ids); |
| | | |
| | | /** |
| | | * è·å¾å
¨é¨æ å½¢èµäº§å表 |
| | | * |
| | | * @return æ å½¢èµäº§å表 |
| | | */ |
| | | List<FinIntangibleAssetDO> getIntangibleAssetList(); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.service.asset; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.util.ObjectUtil; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.asset.vo.FinIntangibleAssetAmortizeRespVO; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.asset.vo.FinIntangibleAssetPageReqVO; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.asset.vo.FinIntangibleAssetSaveReqVO; |
| | | import cn.iocoder.yudao.module.finance.dal.dataobject.asset.FinIntangibleAssetDO; |
| | | import cn.iocoder.yudao.module.finance.dal.mysql.asset.FinIntangibleAssetMapper; |
| | | import cn.iocoder.yudao.module.finance.enums.FinIntangibleAssetStatusEnum; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | import java.util.ArrayList; |
| | | import java.util.Collection; |
| | | import java.util.Collections; |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.module.finance.enums.ErrorCodeConstants.*; |
| | | import static cn.iocoder.yudao.module.finance.service.asset.FinAssetAmountUtils.calcDepreciableBase; |
| | | import static cn.iocoder.yudao.module.finance.service.asset.FinAssetAmountUtils.calcMonthlyAmount; |
| | | |
| | | /** |
| | | * æ å½¢èµäº§ Service å®ç°ç±» |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @Service |
| | | @Validated |
| | | public class FinIntangibleAssetServiceImpl implements FinIntangibleAssetService { |
| | | |
| | | @Resource |
| | | private FinIntangibleAssetMapper intangibleAssetMapper; |
| | | |
| | | @Override |
| | | public Long createIntangibleAsset(FinIntangibleAssetSaveReqVO createReqVO) { |
| | | // 1. æ ¡éªèµäº§ç¼å·å¯ä¸ |
| | | validateAssetCodeUnique(null, createReqVO.getAssetCode()); |
| | | // 2. æå
¥ï¼æ°èµäº§å°æªè®¡ææé |
| | | FinIntangibleAssetDO asset = BeanUtils.toBean(createReqVO, FinIntangibleAssetDO.class); |
| | | asset.setAssetCode(StrUtil.trim(asset.getAssetCode())); |
| | | asset.setResidualRate(ObjectUtil.defaultIfNull(asset.getResidualRate(), BigDecimal.ZERO)); |
| | | asset.setStatus(ObjectUtil.defaultIfNull(asset.getStatus(), FinIntangibleAssetStatusEnum.IN_USE.getStatus())); |
| | | asset.setAccumulatedAmortization(BigDecimal.ZERO); |
| | | fillNetValue(asset); |
| | | intangibleAssetMapper.insert(asset); |
| | | return asset.getId(); |
| | | } |
| | | |
| | | @Override |
| | | public void updateIntangibleAsset(FinIntangibleAssetSaveReqVO updateReqVO) { |
| | | // 1.1 æ ¡éªåå¨ |
| | | FinIntangibleAssetDO oldAsset = validateIntangibleAssetExists(updateReqVO.getId()); |
| | | // 1.2 æ ¡éªèµäº§ç¼å·å¯ä¸ |
| | | validateAssetCodeUnique(updateReqVO.getId(), updateReqVO.getAssetCode()); |
| | | |
| | | // 2.1 æ´æ°ï¼ç´¯è®¡æéä¸ä»åç«¯æ¥æ¶ï¼æ²¿ç¨åºä¸å¼ï¼ |
| | | FinIntangibleAssetDO updateObj = BeanUtils.toBean(updateReqVO, FinIntangibleAssetDO.class); |
| | | updateObj.setAssetCode(StrUtil.trim(updateObj.getAssetCode())); |
| | | updateObj.setResidualRate(ObjectUtil.defaultIfNull(updateObj.getResidualRate(), BigDecimal.ZERO)); |
| | | updateObj.setStatus(ObjectUtil.defaultIfNull(updateObj.getStatus(), oldAsset.getStatus())); |
| | | updateObj.setAccumulatedAmortization( |
| | | ObjectUtil.defaultIfNull(oldAsset.getAccumulatedAmortization(), BigDecimal.ZERO)); |
| | | // 2.2 åå¼ãæ®å¼çåååï¼ææ°çåºæéæ»é¢å°é¡¶ç´¯è®¡æéï¼å¹¶éç®åå¼ |
| | | BigDecimal amortizableBase = calcDepreciableBase(defaultIfNull(updateObj.getOriginalValue()), |
| | | updateObj.getResidualRate()); |
| | | if (updateObj.getAccumulatedAmortization().compareTo(amortizableBase) > 0) { |
| | | updateObj.setAccumulatedAmortization(amortizableBase); |
| | | } |
| | | fillNetValue(updateObj); |
| | | // 2.3 å·²æå®ä½ç¶æè¿å¨ç¨çï¼åæ¥ä¸ºãå·²æéå®ã |
| | | if (updateObj.getNetValue().compareTo(BigDecimal.ZERO) <= 0 |
| | | && FinIntangibleAssetStatusEnum.IN_USE.getStatus().equals(updateObj.getStatus())) { |
| | | updateObj.setStatus(FinIntangibleAssetStatusEnum.AMORTIZED.getStatus()); |
| | | } |
| | | intangibleAssetMapper.updateById(updateObj); |
| | | } |
| | | |
| | | @Override |
| | | public void deleteIntangibleAsset(Long id) { |
| | | validateIntangibleAssetExists(id); |
| | | intangibleAssetMapper.deleteById(id); |
| | | } |
| | | |
| | | @Override |
| | | public void deleteIntangibleAssetList(List<Long> ids) { |
| | | if (CollUtil.isEmpty(ids)) { |
| | | return; |
| | | } |
| | | intangibleAssetMapper.deleteByIds(ids); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public FinIntangibleAssetAmortizeRespVO amortizeIntangibleAssetList(List<Long> ids) { |
| | | // 1. æ¥è¯¢å¾
计æçèµäº§ï¼å·²å¤±æçä¸å计æ |
| | | List<FinIntangibleAssetDO> assets = CollUtil.isEmpty(ids) |
| | | ? intangibleAssetMapper.selectList() : intangibleAssetMapper.selectListByIds(ids); |
| | | List<FinIntangibleAssetDO> updateList = new ArrayList<>(); |
| | | BigDecimal totalMonthlyAmortization = BigDecimal.ZERO; |
| | | for (FinIntangibleAssetDO asset : assets) { |
| | | if (FinIntangibleAssetStatusEnum.EXPIRED.getStatus().equals(asset.getStatus())) { |
| | | continue; |
| | | } |
| | | BigDecimal originalValue = defaultIfNull(asset.getOriginalValue()); |
| | | BigDecimal residualRate = defaultIfNull(asset.getResidualRate()); |
| | | int years = ObjectUtil.defaultIfNull(asset.getAmortizationPeriod(), 0); |
| | | BigDecimal accumulated = defaultIfNull(asset.getAccumulatedAmortization()); |
| | | // 1.1 å·²æå®çä¸å计æ |
| | | BigDecimal amortizableBase = calcDepreciableBase(originalValue, residualRate); |
| | | BigDecimal remaining = amortizableBase.subtract(accumulated); |
| | | if (remaining.compareTo(BigDecimal.ZERO) <= 0) { |
| | | continue; |
| | | } |
| | | // 1.2 åæ°å¼å¸¸å¯¼è´ææéé¢éæ£ |
| | | BigDecimal monthlyAmortization = years <= 0 ? BigDecimal.ZERO |
| | | : calcMonthlyAmount(originalValue, residualRate, years); |
| | | if (monthlyAmortization.compareTo(BigDecimal.ZERO) <= 0) { |
| | | throw exception(INTANGIBLE_ASSET_AMORTIZE_NEGATIVE, asset.getAssetName(), |
| | | formatAmount(originalValue), years, formatAmount(residualRate)); |
| | | } |
| | | // 1.3 æå䏿æå©ä½å¯æéé¢å°é¡¶ï¼åå¼ä¸ä¼è¢«ææè´æ° |
| | | BigDecimal periodAmortization = monthlyAmortization.min(remaining); |
| | | BigDecimal newAccumulated = accumulated.add(periodAmortization); |
| | | BigDecimal newNetValue = originalValue.subtract(newAccumulated).max(BigDecimal.ZERO); |
| | | FinIntangibleAssetDO updateObj = new FinIntangibleAssetDO().setId(asset.getId()) |
| | | .setAccumulatedAmortization(newAccumulated) |
| | | .setNetValue(newNetValue); |
| | | // 1.4 æå®æ¶èªå¨ç½®ä¸ºãå·²æéå®ã |
| | | if (newNetValue.compareTo(BigDecimal.ZERO) <= 0) { |
| | | updateObj.setStatus(FinIntangibleAssetStatusEnum.AMORTIZED.getStatus()); |
| | | } |
| | | updateList.add(updateObj); |
| | | totalMonthlyAmortization = totalMonthlyAmortization.add(periodAmortization); |
| | | } |
| | | // 2. 没æå¯è®¡æçèµäº§ï¼æç¡®åç¥ |
| | | if (updateList.isEmpty()) { |
| | | throw exception(INTANGIBLE_ASSET_AMORTIZE_EMPTY); |
| | | } |
| | | // 3. æ¹éæ´æ° |
| | | intangibleAssetMapper.updateBatch(updateList); |
| | | return new FinIntangibleAssetAmortizeRespVO().setProcessedCount(updateList.size()) |
| | | .setTotalMonthlyAmortization(totalMonthlyAmortization); |
| | | } |
| | | |
| | | @Override |
| | | public FinIntangibleAssetDO getIntangibleAsset(Long id) { |
| | | return intangibleAssetMapper.selectById(id); |
| | | } |
| | | |
| | | @Override |
| | | public PageResult<FinIntangibleAssetDO> getIntangibleAssetPage(FinIntangibleAssetPageReqVO pageReqVO) { |
| | | return intangibleAssetMapper.selectPage(pageReqVO); |
| | | } |
| | | |
| | | @Override |
| | | public List<FinIntangibleAssetDO> getIntangibleAssetList(Collection<Long> ids) { |
| | | if (CollUtil.isEmpty(ids)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | return intangibleAssetMapper.selectListByIds(ids); |
| | | } |
| | | |
| | | @Override |
| | | public List<FinIntangibleAssetDO> getIntangibleAssetList() { |
| | | return intangibleAssetMapper.selectList(); |
| | | } |
| | | |
| | | private FinIntangibleAssetDO validateIntangibleAssetExists(Long id) { |
| | | if (id == null) { |
| | | throw exception(INTANGIBLE_ASSET_NOT_EXISTS); |
| | | } |
| | | FinIntangibleAssetDO asset = intangibleAssetMapper.selectById(id); |
| | | if (asset == null) { |
| | | throw exception(INTANGIBLE_ASSET_NOT_EXISTS); |
| | | } |
| | | return asset; |
| | | } |
| | | |
| | | private void validateAssetCodeUnique(Long id, String assetCode) { |
| | | FinIntangibleAssetDO asset = intangibleAssetMapper.selectByAssetCode(StrUtil.trim(assetCode)); |
| | | if (asset == null) { |
| | | return; |
| | | } |
| | | if (id == null || !asset.getId().equals(id)) { |
| | | throw exception(INTANGIBLE_ASSET_CODE_DUPLICATE, assetCode); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * åå¼ = åå¼ - 累计æéï¼ä¸ä¸å°äº 0 |
| | | */ |
| | | private void fillNetValue(FinIntangibleAssetDO asset) { |
| | | BigDecimal netValue = defaultIfNull(asset.getOriginalValue()) |
| | | .subtract(defaultIfNull(asset.getAccumulatedAmortization())); |
| | | asset.setNetValue(netValue.max(BigDecimal.ZERO)); |
| | | } |
| | | |
| | | private static BigDecimal defaultIfNull(BigDecimal amount) { |
| | | return amount == null ? BigDecimal.ZERO : amount; |
| | | } |
| | | |
| | | private static String formatAmount(BigDecimal amount) { |
| | | return amount.setScale(2, RoundingMode.HALF_UP).toPlainString(); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.service.ledger; |
| | | |
| | | import cn.iocoder.yudao.module.finance.controller.admin.ledger.vo.FinLedgerReqVO; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.ledger.vo.FinLedgerRespVO; |
| | | import jakarta.validation.Valid; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * æ»è´¦ / æç»è´¦ Service æ¥å£ |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | public interface FinLedgerService { |
| | | |
| | | /** |
| | | * è·å¾æ»è´¦å表 |
| | | * |
| | | * ææé´éææ±æ»ï¼æåä½é¢ -> åæãæ¬æå计ã -> æ¬æç´¯è®¡ |
| | | * |
| | | * @param reqVO æ¥è¯¢æ¡ä»¶ |
| | | * @return æ»è´¦è¡å表 |
| | | */ |
| | | List<FinLedgerRespVO> getGeneralLedgerList(@Valid FinLedgerReqVO reqVO); |
| | | |
| | | /** |
| | | * è·å¾æç»è´¦å表 |
| | | * |
| | | * éæ¡åå½å±ç¤ºå¹¶ç»è½¬ä½é¢ï¼æåä½é¢ -> éæ¡æç»ï¼æ¯é¢ææ«æãæ¬æå计ãï¼ -> æ¬æç´¯è®¡ |
| | | * |
| | | * @param reqVO æ¥è¯¢æ¡ä»¶ |
| | | * @return æç»è´¦è¡å表 |
| | | */ |
| | | List<FinLedgerRespVO> getDetailLedgerList(@Valid FinLedgerReqVO reqVO); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.service.ledger; |
| | | |
| | | import cn.iocoder.yudao.module.finance.controller.admin.ledger.vo.FinLedgerReqVO; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.ledger.vo.FinLedgerRespVO; |
| | | import cn.iocoder.yudao.module.finance.dal.dataobject.ledger.FinLedgerEntryDO; |
| | | import cn.iocoder.yudao.module.finance.dal.dataobject.subject.FinAccountSubjectDO; |
| | | import cn.iocoder.yudao.module.finance.dal.mysql.ledger.FinLedgerMapper; |
| | | import cn.iocoder.yudao.module.finance.enums.FinBalanceDirectionEnum; |
| | | import cn.iocoder.yudao.module.finance.enums.FinLedgerRowTypeEnum; |
| | | import cn.iocoder.yudao.module.finance.enums.FinVoucherStatusEnum; |
| | | import cn.iocoder.yudao.module.finance.service.subject.FinAccountSubjectService; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | import java.time.YearMonth; |
| | | import java.util.ArrayDeque; |
| | | import java.util.ArrayList; |
| | | import java.util.Deque; |
| | | import java.util.HashSet; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.Set; |
| | | import java.util.stream.Collectors; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.module.finance.enums.ErrorCodeConstants.LEDGER_MONTH_RANGE_INVALID; |
| | | import static cn.iocoder.yudao.module.finance.enums.ErrorCodeConstants.LEDGER_SUBJECT_NOT_EXISTS; |
| | | |
| | | /** |
| | | * æ»è´¦ / æç»è´¦ Service å®ç°ç±» |
| | | * |
| | | * å£å¾è¯´æï¼ |
| | | * 1. åªç»è®¡å·²è¿è´¦ï¼postedï¼çåè¯ï¼æªè¿è´¦ãå·²ä½åºçåè¯ä¸è®¡å
¥è´¦ç°¿ï¼ |
| | | * 2. ä½é¢ä¸å¾ãåæ¹æ£ãè´·æ¹è´ãï¼æåä½é¢ = èµ·å§æä»½ä¹åææå·²è¿è´¦åå½çåè´·åé¢ï¼ |
| | | * 3. ç§ç®çä¸çº§ç§ç®ç± parentId é彿¶éï¼ä¸ä½¿ç¨ç§ç®ç¼ç åç¼å¹é
ï¼é¿å
æå½¢è¿ç¼ç 误ç®è¿æ¥ï¼ã |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @Service |
| | | @Validated |
| | | public class FinLedgerServiceImpl implements FinLedgerService { |
| | | |
| | | @Resource |
| | | private FinLedgerMapper ledgerMapper; |
| | | @Resource |
| | | private FinAccountSubjectService accountSubjectService; |
| | | |
| | | @Override |
| | | public List<FinLedgerRespVO> getGeneralLedgerList(FinLedgerReqVO reqVO) { |
| | | // 1. æ ¡éªç§ç®ä¸æé´ |
| | | FinAccountSubjectDO subject = validateSubject(reqVO); |
| | | LocalDate startDate = reqVO.getStartMonth().atDay(1); |
| | | LocalDate endDate = reqVO.getEndMonth().atEndOfMonth(); |
| | | validateMonthRange(startDate, endDate); |
| | | Set<String> subjectCodes = buildSubjectCodeSet(subject, reqVO.getIncludeChildren()); |
| | | |
| | | // 2. æåä½é¢ |
| | | List<FinLedgerRespVO> rows = new ArrayList<>(); |
| | | BigDecimal balance = defaultIfNull(ledgerMapper.selectBalanceBeforeDate(subjectCodes, startDate, |
| | | FinVoucherStatusEnum.POSTED.getStatus())); |
| | | rows.add(buildOpeningRow(subject, startDate, balance)); |
| | | |
| | | // 3. æææ±æ» |
| | | List<FinLedgerEntryDO> entries = ledgerMapper.selectEntryList(subjectCodes, startDate, endDate, |
| | | FinVoucherStatusEnum.POSTED.getStatus()); |
| | | Map<String, List<FinLedgerEntryDO>> monthMap = entries.stream() |
| | | .collect(Collectors.groupingBy(entry -> YearMonth.from(entry.getVoucherDate()).toString())); |
| | | BigDecimal totalDebit = BigDecimal.ZERO; |
| | | BigDecimal totalCredit = BigDecimal.ZERO; |
| | | YearMonth endMonth = YearMonth.from(endDate); |
| | | for (YearMonth month = YearMonth.from(startDate); !month.isAfter(endMonth); month = month.plusMonths(1)) { |
| | | List<FinLedgerEntryDO> monthEntries = monthMap.getOrDefault(month.toString(), List.of()); |
| | | BigDecimal debit = sum(monthEntries, true); |
| | | BigDecimal credit = sum(monthEntries, false); |
| | | balance = balance.add(debit).subtract(credit); |
| | | totalDebit = totalDebit.add(debit); |
| | | totalCredit = totalCredit.add(credit); |
| | | LocalDate monthEndDate = minDate(month.atEndOfMonth(), endDate); |
| | | rows.add(buildRow(FinLedgerRowTypeEnum.MONTHLY_TOTAL, month.toString(), monthEndDate, subject, null, |
| | | FinLedgerRowTypeEnum.MONTHLY_TOTAL.getName(), debit, credit, balance)); |
| | | } |
| | | |
| | | // 4. æ¬æç´¯è®¡ |
| | | rows.add(buildRow(FinLedgerRowTypeEnum.YEARLY_TOTAL, null, endDate, subject, null, |
| | | FinLedgerRowTypeEnum.YEARLY_TOTAL.getName(), totalDebit, totalCredit, balance)); |
| | | return rows; |
| | | } |
| | | |
| | | @Override |
| | | public List<FinLedgerRespVO> getDetailLedgerList(FinLedgerReqVO reqVO) { |
| | | // 1. æ ¡éªç§ç®ä¸æé´ |
| | | FinAccountSubjectDO subject = validateSubject(reqVO); |
| | | LocalDate startDate = reqVO.getStartMonth().atDay(1); |
| | | LocalDate endDate = reqVO.getEndMonth().atEndOfMonth(); |
| | | validateMonthRange(startDate, endDate); |
| | | Set<String> subjectCodes = buildSubjectCodeSet(subject, reqVO.getIncludeChildren()); |
| | | |
| | | // 2. æåä½é¢ |
| | | List<FinLedgerRespVO> rows = new ArrayList<>(); |
| | | BigDecimal balance = defaultIfNull(ledgerMapper.selectBalanceBeforeDate(subjectCodes, startDate, |
| | | FinVoucherStatusEnum.POSTED.getStatus())); |
| | | rows.add(buildOpeningRow(subject, startDate, balance)); |
| | | |
| | | // 3. éæ¡æç»ï¼å¹¶å¯¹æ¯æ¡åå½ç»è½¬ä½é¢ï¼æ¯é¢ææ«è¡¥ä¸è¡ãæ¬æå计ã |
| | | List<FinLedgerEntryDO> entries = ledgerMapper.selectEntryList(subjectCodes, startDate, endDate, |
| | | FinVoucherStatusEnum.POSTED.getStatus()); |
| | | BigDecimal totalDebit = BigDecimal.ZERO; |
| | | BigDecimal totalCredit = BigDecimal.ZERO; |
| | | BigDecimal monthDebit = BigDecimal.ZERO; |
| | | BigDecimal monthCredit = BigDecimal.ZERO; |
| | | YearMonth currentMonth = null; |
| | | for (FinLedgerEntryDO entry : entries) { |
| | | YearMonth month = YearMonth.from(entry.getVoucherDate()); |
| | | // 3.1 è·¨æï¼å
è¡¥ä¸ä¸ªæçæ¬æå计 |
| | | if (currentMonth != null && !currentMonth.equals(month)) { |
| | | rows.add(buildRow(FinLedgerRowTypeEnum.MONTHLY_TOTAL, currentMonth.toString(), |
| | | currentMonth.atEndOfMonth(), subject, null, FinLedgerRowTypeEnum.MONTHLY_TOTAL.getName(), |
| | | monthDebit, monthCredit, balance)); |
| | | monthDebit = BigDecimal.ZERO; |
| | | monthCredit = BigDecimal.ZERO; |
| | | } |
| | | currentMonth = month; |
| | | // 3.2 æç»è¡ |
| | | BigDecimal debit = defaultIfNull(entry.getDebit()); |
| | | BigDecimal credit = defaultIfNull(entry.getCredit()); |
| | | balance = balance.add(debit).subtract(credit); |
| | | monthDebit = monthDebit.add(debit); |
| | | monthCredit = monthCredit.add(credit); |
| | | totalDebit = totalDebit.add(debit); |
| | | totalCredit = totalCredit.add(credit); |
| | | rows.add(buildRow(FinLedgerRowTypeEnum.ENTRY, month.toString(), entry.getVoucherDate(), subject, |
| | | entry.getVoucherNo(), entry.getSummary(), debit, credit, balance) |
| | | .setSubjectCode(entry.getSubjectCode()).setSubjectName(entry.getSubjectName())); |
| | | } |
| | | |
| | | // 4. æåä¸ä¸ªæçæ¬æå计 |
| | | if (currentMonth != null) { |
| | | rows.add(buildRow(FinLedgerRowTypeEnum.MONTHLY_TOTAL, currentMonth.toString(), |
| | | minDate(currentMonth.atEndOfMonth(), endDate), subject, null, |
| | | FinLedgerRowTypeEnum.MONTHLY_TOTAL.getName(), monthDebit, monthCredit, balance)); |
| | | } |
| | | // 5. æ¬æç´¯è®¡ |
| | | rows.add(buildRow(FinLedgerRowTypeEnum.YEARLY_TOTAL, null, endDate, subject, null, |
| | | FinLedgerRowTypeEnum.YEARLY_TOTAL.getName(), totalDebit, totalCredit, balance)); |
| | | return rows; |
| | | } |
| | | |
| | | private FinAccountSubjectDO validateSubject(FinLedgerReqVO reqVO) { |
| | | FinAccountSubjectDO subject = accountSubjectService.getAccountSubjectByCode(reqVO.getSubjectCode()); |
| | | if (subject == null) { |
| | | throw exception(LEDGER_SUBJECT_NOT_EXISTS, reqVO.getSubjectCode()); |
| | | } |
| | | return subject; |
| | | } |
| | | |
| | | private void validateMonthRange(LocalDate startDate, LocalDate endDate) { |
| | | if (startDate.isAfter(endDate)) { |
| | | throw exception(LEDGER_MONTH_RANGE_INVALID, YearMonth.from(startDate), YearMonth.from(endDate)); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æ¶éæ¥è¯¢ç¨çç§ç®ç¼ç éåï¼é»è®¤å
嫿æä¸çº§ç§ç® |
| | | */ |
| | | private Set<String> buildSubjectCodeSet(FinAccountSubjectDO subject, Boolean includeChildren) { |
| | | Set<String> subjectCodes = new HashSet<>(); |
| | | subjectCodes.add(subject.getSubjectCode()); |
| | | if (!Boolean.TRUE.equals(includeChildren)) { |
| | | return subjectCodes; |
| | | } |
| | | // ç¨ parentId é彿¶éä¸çº§ï¼visited ç± subjectCodes ç add ç»æå
¼ä½é²æ¤ï¼é¿å
èæ°æ®æç¯æ¶æ»å¾ªç¯ |
| | | Map<Long, List<FinAccountSubjectDO>> childrenMap = accountSubjectService.getAccountSubjectList().stream() |
| | | .filter(item -> item.getParentId() != null) |
| | | .collect(Collectors.groupingBy(FinAccountSubjectDO::getParentId)); |
| | | Deque<Long> queue = new ArrayDeque<>(); |
| | | queue.add(subject.getId()); |
| | | while (!queue.isEmpty()) { |
| | | for (FinAccountSubjectDO child : childrenMap.getOrDefault(queue.poll(), List.of())) { |
| | | if (subjectCodes.add(child.getSubjectCode())) { |
| | | queue.add(child.getId()); |
| | | } |
| | | } |
| | | } |
| | | return subjectCodes; |
| | | } |
| | | |
| | | private FinLedgerRespVO buildOpeningRow(FinAccountSubjectDO subject, LocalDate date, BigDecimal balance) { |
| | | return buildRow(FinLedgerRowTypeEnum.OPENING, YearMonth.from(date).toString(), date, subject, null, |
| | | FinLedgerRowTypeEnum.OPENING.getName(), null, null, balance); |
| | | } |
| | | |
| | | private FinLedgerRespVO buildRow(FinLedgerRowTypeEnum rowType, String period, LocalDate date, |
| | | FinAccountSubjectDO subject, String voucherNo, String summary, |
| | | BigDecimal debit, BigDecimal credit, BigDecimal balance) { |
| | | return new FinLedgerRespVO() |
| | | .setRowType(rowType.getType()) |
| | | .setRowTypeName(rowType.getName()) |
| | | .setPeriod(period) |
| | | .setDate(date) |
| | | .setVoucherNo(voucherNo) |
| | | .setSubjectCode(subject.getSubjectCode()) |
| | | .setSubjectName(subject.getSubjectName()) |
| | | .setSummary(summary) |
| | | .setDebit(debit) |
| | | .setCredit(credit) |
| | | .setDirection(FinBalanceDirectionEnum.getByBalance(balance)) |
| | | .setBalance(balance); |
| | | } |
| | | |
| | | private static BigDecimal sum(List<FinLedgerEntryDO> entries, boolean debit) { |
| | | return entries.stream() |
| | | .map(entry -> debit ? defaultIfNull(entry.getDebit()) : defaultIfNull(entry.getCredit())) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | } |
| | | |
| | | private static BigDecimal defaultIfNull(BigDecimal amount) { |
| | | return amount == null ? BigDecimal.ZERO : amount; |
| | | } |
| | | |
| | | private static LocalDate minDate(LocalDate date, LocalDate maxDate) { |
| | | return date.isAfter(maxDate) ? maxDate : date; |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.service.statistics; |
| | | |
| | | import cn.iocoder.yudao.module.finance.controller.admin.statistics.vo.FinStatisticsOverviewRespVO; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.statistics.vo.FinStatisticsReqVO; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.statistics.vo.FinStatisticsTrendRespVO; |
| | | import jakarta.validation.Valid; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * è´¢å¡æ¥è¡¨ / ä¼è®¡æ ¸ç®çæ¿ Service æ¥å£ |
| | | * |
| | | * æ°æ®æ¥æºï¼ |
| | | * 1. æ¶æ¯ãè´ééé¢åèª ERP 模åï¼æ¶æ¬¾åã仿¬¾åãéå®è®¢åãéè´è®¢åï¼ï¼ |
| | | * éè¿ {@link cn.iocoder.yudao.module.erp.api.finance.ErpFinanceStatisticsApi} åæ°ï¼ä¸è·¨æ¨¡åæ¥è¡¨ï¼ |
| | | * 2. èµäº§æ°æ®åèªæ¬æ¨¡åçåºå®èµäº§ãæ å½¢èµäº§ï¼ |
| | | * 3. åè¯æ°æ®åèªæ¬æ¨¡åçè®°è´¦åè¯ã |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | public interface FinStatisticsService { |
| | | |
| | | /** |
| | | * è·å¾ä¼è®¡æ ¸ç®çæ¿æ»è§ |
| | | * |
| | | * @param reqVO æ¥è¯¢æ¡ä»¶ï¼æé´ç空æ¶é»è®¤æ¬å¹´ 1 æè³å½åæ |
| | | * @return çæ¿æ»è§ |
| | | */ |
| | | FinStatisticsOverviewRespVO getStatisticsOverview(@Valid FinStatisticsReqVO reqVO); |
| | | |
| | | /** |
| | | * è·å¾æåº¦æ¶æ¯è¶å¿ |
| | | * |
| | | * @param reqVO æ¥è¯¢æ¡ä»¶ï¼æé´ç空æ¶é»è®¤æ¬å¹´ 1 æè³å½åæ |
| | | * @return æåº¦è¶å¿åè¡¨ï¼æé´å
æ²¡ææ°æ®çæä»½è¡¥ 0 |
| | | */ |
| | | List<FinStatisticsTrendRespVO> getStatisticsTrend(@Valid FinStatisticsReqVO reqVO); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.service.statistics; |
| | | |
| | | import cn.iocoder.yudao.module.erp.api.finance.ErpFinanceStatisticsApi; |
| | | import cn.iocoder.yudao.module.erp.api.finance.dto.ErpFinanceMonthlyStatisticsRespDTO; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.statistics.vo.FinStatisticsOverviewRespVO; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.statistics.vo.FinStatisticsReqVO; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.statistics.vo.FinStatisticsTrendRespVO; |
| | | import cn.iocoder.yudao.module.finance.dal.dataobject.asset.FinFixedAssetDO; |
| | | import cn.iocoder.yudao.module.finance.dal.dataobject.asset.FinIntangibleAssetDO; |
| | | import cn.iocoder.yudao.module.finance.dal.mysql.subject.FinAccountSubjectMapper; |
| | | import cn.iocoder.yudao.module.finance.dal.mysql.voucher.FinVoucherMapper; |
| | | import cn.iocoder.yudao.module.finance.enums.FinVoucherStatusEnum; |
| | | import cn.iocoder.yudao.module.finance.service.asset.FinFixedAssetService; |
| | | import cn.iocoder.yudao.module.finance.service.asset.FinIntangibleAssetService; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.time.YearMonth; |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.function.Function; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; |
| | | import static cn.iocoder.yudao.module.finance.enums.ErrorCodeConstants.STATISTICS_PERIOD_INVALID; |
| | | |
| | | /** |
| | | * è´¢å¡æ¥è¡¨ / ä¼è®¡æ ¸ç®çæ¿ Service å®ç°ç±» |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @Service |
| | | @Validated |
| | | public class FinStatisticsServiceImpl implements FinStatisticsService { |
| | | |
| | | @Resource |
| | | private ErpFinanceStatisticsApi erpFinanceStatisticsApi; |
| | | @Resource |
| | | private FinVoucherMapper voucherMapper; |
| | | @Resource |
| | | private FinAccountSubjectMapper accountSubjectMapper; |
| | | @Resource |
| | | private FinFixedAssetService fixedAssetService; |
| | | @Resource |
| | | private FinIntangibleAssetService intangibleAssetService; |
| | | |
| | | @Override |
| | | public FinStatisticsOverviewRespVO getStatisticsOverview(FinStatisticsReqVO reqVO) { |
| | | // 1. æé´ |
| | | LocalDate startDate = resolveStartDate(reqVO); |
| | | LocalDate endDate = resolveEndDate(reqVO); |
| | | validatePeriod(startDate, endDate); |
| | | |
| | | // 2. ERP æ¶æ¯ãè´ééé¢ |
| | | List<ErpFinanceMonthlyStatisticsRespDTO> monthlyList = getErpMonthlyStatistics(startDate, endDate); |
| | | BigDecimal receiptPrice = sumOf(monthlyList, ErpFinanceMonthlyStatisticsRespDTO::getReceiptPrice); |
| | | BigDecimal paymentPrice = sumOf(monthlyList, ErpFinanceMonthlyStatisticsRespDTO::getPaymentPrice); |
| | | BigDecimal saleOrderPrice = sumOf(monthlyList, ErpFinanceMonthlyStatisticsRespDTO::getSaleOrderPrice); |
| | | BigDecimal purchaseOrderPrice = sumOf(monthlyList, ErpFinanceMonthlyStatisticsRespDTO::getPurchaseOrderPrice); |
| | | |
| | | // 3. åºå®èµäº§ãæ å½¢èµäº§ï¼æ¶ç¹æ°ï¼åå
¨é¨èµäº§ï¼ |
| | | BigDecimal fixedAssetOriginalValue = BigDecimal.ZERO; |
| | | BigDecimal fixedAssetAccumulatedDepreciation = BigDecimal.ZERO; |
| | | BigDecimal fixedAssetNetValue = BigDecimal.ZERO; |
| | | for (FinFixedAssetDO asset : fixedAssetService.getFixedAssetList()) { |
| | | fixedAssetOriginalValue = fixedAssetOriginalValue.add(defaultIfNull(asset.getOriginalValue())); |
| | | fixedAssetAccumulatedDepreciation = fixedAssetAccumulatedDepreciation |
| | | .add(defaultIfNull(asset.getAccumulatedDepreciation())); |
| | | fixedAssetNetValue = fixedAssetNetValue.add(defaultIfNull(asset.getNetValue())); |
| | | } |
| | | BigDecimal intangibleAssetOriginalValue = BigDecimal.ZERO; |
| | | BigDecimal intangibleAssetAccumulatedAmortization = BigDecimal.ZERO; |
| | | BigDecimal intangibleAssetNetValue = BigDecimal.ZERO; |
| | | for (FinIntangibleAssetDO asset : intangibleAssetService.getIntangibleAssetList()) { |
| | | intangibleAssetOriginalValue = intangibleAssetOriginalValue.add(defaultIfNull(asset.getOriginalValue())); |
| | | intangibleAssetAccumulatedAmortization = intangibleAssetAccumulatedAmortization |
| | | .add(defaultIfNull(asset.getAccumulatedAmortization())); |
| | | intangibleAssetNetValue = intangibleAssetNetValue.add(defaultIfNull(asset.getNetValue())); |
| | | } |
| | | |
| | | // 4. åè¯ç»è®¡ |
| | | Long voucherUnpostedCount = defaultIfNull(voucherMapper.selectCountByStatus(FinVoucherStatusEnum.UNPOSTED.getStatus())); |
| | | Long voucherPostedCount = defaultIfNull(voucherMapper.selectCountByStatus(FinVoucherStatusEnum.POSTED.getStatus())); |
| | | Long voucherCancelledCount = defaultIfNull(voucherMapper.selectCountByStatus(FinVoucherStatusEnum.CANCELLED.getStatus())); |
| | | |
| | | // 5. ç»è£
|
| | | return new FinStatisticsOverviewRespVO() |
| | | .setStartDate(startDate).setEndDate(endDate) |
| | | .setReceiptPrice(receiptPrice) |
| | | .setPaymentPrice(paymentPrice) |
| | | .setNetProfit(receiptPrice.subtract(paymentPrice)) |
| | | .setSaleOrderPrice(saleOrderPrice) |
| | | .setPurchaseOrderPrice(purchaseOrderPrice) |
| | | .setFixedAssetOriginalValue(fixedAssetOriginalValue) |
| | | .setFixedAssetAccumulatedDepreciation(fixedAssetAccumulatedDepreciation) |
| | | .setFixedAssetNetValue(fixedAssetNetValue) |
| | | .setIntangibleAssetOriginalValue(intangibleAssetOriginalValue) |
| | | .setIntangibleAssetAccumulatedAmortization(intangibleAssetAccumulatedAmortization) |
| | | .setIntangibleAssetNetValue(intangibleAssetNetValue) |
| | | .setTotalAssetNetValue(fixedAssetNetValue.add(intangibleAssetNetValue)) |
| | | .setSubjectCount(defaultIfNull(accountSubjectMapper.selectCount())) |
| | | .setVoucherCount(voucherUnpostedCount + voucherPostedCount + voucherCancelledCount) |
| | | .setVoucherUnpostedCount(voucherUnpostedCount) |
| | | .setVoucherPostedCount(voucherPostedCount) |
| | | .setVoucherCancelledCount(voucherCancelledCount); |
| | | } |
| | | |
| | | @Override |
| | | public List<FinStatisticsTrendRespVO> getStatisticsTrend(FinStatisticsReqVO reqVO) { |
| | | // 1. æé´ |
| | | LocalDate startDate = resolveStartDate(reqVO); |
| | | LocalDate endDate = resolveEndDate(reqVO); |
| | | validatePeriod(startDate, endDate); |
| | | |
| | | // 2. ERP æåº¦æ°æ®è½¬ Mapï¼ä¾¿äºææä»½è¡¥ 0 |
| | | Map<String, ErpFinanceMonthlyStatisticsRespDTO> monthMap = convertMap( |
| | | getErpMonthlyStatistics(startDate, endDate), ErpFinanceMonthlyStatisticsRespDTO::getMonth); |
| | | |
| | | // 3. æé´å
éæè¾åºï¼æ²¡ææ°æ®çæä»½è¡¥ 0 |
| | | List<FinStatisticsTrendRespVO> list = new ArrayList<>(); |
| | | YearMonth endMonth = YearMonth.from(endDate); |
| | | for (YearMonth month = YearMonth.from(startDate); !month.isAfter(endMonth); month = month.plusMonths(1)) { |
| | | ErpFinanceMonthlyStatisticsRespDTO dto = monthMap.get(month.toString()); |
| | | BigDecimal receiptPrice = dto == null ? BigDecimal.ZERO : defaultIfNull(dto.getReceiptPrice()); |
| | | BigDecimal paymentPrice = dto == null ? BigDecimal.ZERO : defaultIfNull(dto.getPaymentPrice()); |
| | | list.add(new FinStatisticsTrendRespVO() |
| | | .setMonth(month.toString()) |
| | | .setReceiptPrice(receiptPrice) |
| | | .setPaymentPrice(paymentPrice) |
| | | .setNetProfit(receiptPrice.subtract(paymentPrice)) |
| | | .setSaleOrderPrice(dto == null ? BigDecimal.ZERO : defaultIfNull(dto.getSaleOrderPrice())) |
| | | .setPurchaseOrderPrice(dto == null ? BigDecimal.ZERO : defaultIfNull(dto.getPurchaseOrderPrice()))); |
| | | } |
| | | return list; |
| | | } |
| | | |
| | | /** |
| | | * è°ç¨ ERP 模å API è·åæåº¦ç»è®¡ï¼å¹¶åå
åºè§£å
|
| | | */ |
| | | private List<ErpFinanceMonthlyStatisticsRespDTO> getErpMonthlyStatistics(LocalDate startDate, LocalDate endDate) { |
| | | List<ErpFinanceMonthlyStatisticsRespDTO> list = erpFinanceStatisticsApi |
| | | .getMonthlyStatistics(startDate.atStartOfDay(), endDate.plusDays(1).atStartOfDay()) |
| | | .getCheckedData(); |
| | | return list == null ? List.of() : list; |
| | | } |
| | | |
| | | private LocalDate resolveStartDate(FinStatisticsReqVO reqVO) { |
| | | return reqVO.getStartMonth() != null ? reqVO.getStartMonth().atDay(1) |
| | | : LocalDate.now().withDayOfYear(1); |
| | | } |
| | | |
| | | private LocalDate resolveEndDate(FinStatisticsReqVO reqVO) { |
| | | return reqVO.getEndMonth() != null ? reqVO.getEndMonth().atEndOfMonth() |
| | | : LocalDate.now(); |
| | | } |
| | | |
| | | private void validatePeriod(LocalDate startDate, LocalDate endDate) { |
| | | if (startDate.isAfter(endDate)) { |
| | | throw exception(STATISTICS_PERIOD_INVALID, YearMonth.from(startDate), YearMonth.from(endDate)); |
| | | } |
| | | } |
| | | |
| | | private static BigDecimal sumOf(List<ErpFinanceMonthlyStatisticsRespDTO> list, |
| | | Function<ErpFinanceMonthlyStatisticsRespDTO, BigDecimal> getter) { |
| | | return list.stream().map(getter).map(FinStatisticsServiceImpl::defaultIfNull) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | } |
| | | |
| | | private static BigDecimal defaultIfNull(BigDecimal amount) { |
| | | return amount == null ? BigDecimal.ZERO : amount; |
| | | } |
| | | |
| | | private static Long defaultIfNull(Long value) { |
| | | return value == null ? 0L : value; |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.service.subject; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.subject.vo.FinAccountSubjectPageReqVO; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.subject.vo.FinAccountSubjectSaveReqVO; |
| | | import cn.iocoder.yudao.module.finance.dal.dataobject.subject.FinAccountSubjectDO; |
| | | import jakarta.validation.Valid; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; |
| | | |
| | | /** |
| | | * ä¼è®¡ç§ç® Service æ¥å£ |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | public interface FinAccountSubjectService { |
| | | |
| | | /** |
| | | * å建ä¼è®¡ç§ç® |
| | | * |
| | | * @param createReqVO åå»ºä¿¡æ¯ |
| | | * @return ç§ç®ç¼å· |
| | | */ |
| | | Long createAccountSubject(@Valid FinAccountSubjectSaveReqVO createReqVO); |
| | | |
| | | /** |
| | | * æ´æ°ä¼è®¡ç§ç® |
| | | * |
| | | * @param updateReqVO æ´æ°ä¿¡æ¯ |
| | | */ |
| | | void updateAccountSubject(@Valid FinAccountSubjectSaveReqVO updateReqVO); |
| | | |
| | | /** |
| | | * å é¤ä¼è®¡ç§ç® |
| | | * |
| | | * @param id ç§ç®ç¼å· |
| | | */ |
| | | void deleteAccountSubject(Long id); |
| | | |
| | | /** |
| | | * æ¹éå é¤ä¼è®¡ç§ç® |
| | | * |
| | | * @param ids ç§ç®ç¼å·æ°ç» |
| | | */ |
| | | void deleteAccountSubjectList(List<Long> ids); |
| | | |
| | | /** |
| | | * è·å¾ä¼è®¡ç§ç® |
| | | * |
| | | * @param id ç§ç®ç¼å· |
| | | * @return ä¼è®¡ç§ç® |
| | | */ |
| | | FinAccountSubjectDO getAccountSubject(Long id); |
| | | |
| | | /** |
| | | * è·å¾ä¼è®¡ç§ç®å页 |
| | | * |
| | | * @param pageReqVO å页æ¥è¯¢ |
| | | * @return ä¼è®¡ç§ç®å页 |
| | | */ |
| | | PageResult<FinAccountSubjectDO> getAccountSubjectPage(FinAccountSubjectPageReqVO pageReqVO); |
| | | |
| | | /** |
| | | * è·å¾ä¼è®¡ç§ç®å表ï¼å
¨éï¼æç§ç®ç¼ç ååºï¼åç«¯æ®æ¤æå»ºç§ç®æ ï¼ |
| | | * |
| | | * @return ä¼è®¡ç§ç®å表 |
| | | */ |
| | | List<FinAccountSubjectDO> getAccountSubjectList(); |
| | | |
| | | /** |
| | | * è·å¾æå®ç§ç®ç¼ç çä¼è®¡ç§ç®ï¼ä¸å卿¶è¿å null |
| | | * |
| | | * @param subjectCode ç§ç®ç¼ç |
| | | * @return ä¼è®¡ç§ç® |
| | | */ |
| | | FinAccountSubjectDO getAccountSubjectByCode(String subjectCode); |
| | | |
| | | /** |
| | | * è·å¾æå®ç§ç®ç¼ç çä¼è®¡ç§ç® Map |
| | | * |
| | | * @param subjectCodes ç§ç®ç¼ç æ°ç» |
| | | * @return ä¼è®¡ç§ç® Map |
| | | */ |
| | | default Map<String, FinAccountSubjectDO> getAccountSubjectMap(Collection<String> subjectCodes) { |
| | | List<FinAccountSubjectDO> list = getAccountSubjectListByCodes(subjectCodes); |
| | | return convertMap(list, FinAccountSubjectDO::getSubjectCode); |
| | | } |
| | | |
| | | /** |
| | | * è·å¾æå®ç§ç®ç¼ç çä¼è®¡ç§ç®å表 |
| | | * |
| | | * @param subjectCodes ç§ç®ç¼ç æ°ç» |
| | | * @return ä¼è®¡ç§ç®å表 |
| | | */ |
| | | List<FinAccountSubjectDO> getAccountSubjectListByCodes(Collection<String> subjectCodes); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.service.subject; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.subject.vo.FinAccountSubjectPageReqVO; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.subject.vo.FinAccountSubjectSaveReqVO; |
| | | import cn.iocoder.yudao.module.finance.dal.dataobject.subject.FinAccountSubjectDO; |
| | | import cn.iocoder.yudao.module.finance.dal.mysql.subject.FinAccountSubjectMapper; |
| | | import cn.iocoder.yudao.module.finance.dal.mysql.voucher.FinVoucherEntryMapper; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.HashSet; |
| | | import java.util.List; |
| | | import java.util.Objects; |
| | | import java.util.Set; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.module.finance.enums.ErrorCodeConstants.*; |
| | | |
| | | /** |
| | | * ä¼è®¡ç§ç® Service å®ç°ç±» |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @Service |
| | | @Validated |
| | | public class FinAccountSubjectServiceImpl implements FinAccountSubjectService { |
| | | |
| | | @Resource |
| | | private FinAccountSubjectMapper accountSubjectMapper; |
| | | @Resource |
| | | private FinVoucherEntryMapper voucherEntryMapper; |
| | | |
| | | @Override |
| | | public Long createAccountSubject(FinAccountSubjectSaveReqVO createReqVO) { |
| | | // 1. æ ¡éªç§ç®ç¼ç å¯ä¸ |
| | | validateSubjectCodeUnique(null, createReqVO.getSubjectCode()); |
| | | // 2. æ ¡éªä¸çº§ç§ç® |
| | | validateParent(createReqVO.getParentId(), null); |
| | | // 3. æå
¥ |
| | | FinAccountSubjectDO subject = BeanUtils.toBean(createReqVO, FinAccountSubjectDO.class); |
| | | accountSubjectMapper.insert(subject); |
| | | return subject.getId(); |
| | | } |
| | | |
| | | @Override |
| | | public void updateAccountSubject(FinAccountSubjectSaveReqVO updateReqVO) { |
| | | // 1. æ ¡éªåå¨ |
| | | validateAccountSubjectExists(updateReqVO.getId()); |
| | | // 2. æ ¡éªç§ç®ç¼ç å¯ä¸ |
| | | validateSubjectCodeUnique(updateReqVO.getId(), updateReqVO.getSubjectCode()); |
| | | // 3. æ ¡éªä¸çº§ç§ç®ï¼ä¸è½éèªå·±ï¼ä¹ä¸è½éèªå·±çä¸çº§ï¼ |
| | | validateParent(updateReqVO.getParentId(), updateReqVO.getId()); |
| | | // 4. æ´æ° |
| | | accountSubjectMapper.updateById(BeanUtils.toBean(updateReqVO, FinAccountSubjectDO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public void deleteAccountSubject(Long id) { |
| | | FinAccountSubjectDO subject = validateAccountSubjectExists(id); |
| | | // 1. æ ¡éªæ¯å¦åå¨ä¸çº§ç§ç® |
| | | List<FinAccountSubjectDO> children = accountSubjectMapper.selectListByParentId(id); |
| | | if (!children.isEmpty()) { |
| | | throw exception(ACCOUNT_SUBJECT_HAS_CHILDREN, subject.getSubjectName(), children.size()); |
| | | } |
| | | // 2. æ ¡éªæ¯å¦è¢«åè¯åå½å¼ç¨ |
| | | Long referencedCount = voucherEntryMapper.selectCountBySubjectCodes(List.of(subject.getSubjectCode())); |
| | | if (referencedCount != null && referencedCount > 0) { |
| | | throw exception(ACCOUNT_SUBJECT_REFERENCED, subject.getSubjectName(), referencedCount); |
| | | } |
| | | // 3. å é¤ |
| | | accountSubjectMapper.deleteById(id); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void deleteAccountSubjectList(List<Long> ids) { |
| | | ids.forEach(this::deleteAccountSubject); |
| | | } |
| | | |
| | | private FinAccountSubjectDO validateAccountSubjectExists(Long id) { |
| | | FinAccountSubjectDO subject = accountSubjectMapper.selectById(id); |
| | | if (subject == null) { |
| | | throw exception(ACCOUNT_SUBJECT_NOT_EXISTS); |
| | | } |
| | | return subject; |
| | | } |
| | | |
| | | private void validateSubjectCodeUnique(Long id, String subjectCode) { |
| | | FinAccountSubjectDO subject = accountSubjectMapper.selectBySubjectCode(subjectCode); |
| | | if (subject == null) { |
| | | return; |
| | | } |
| | | if (id == null || !Objects.equals(subject.getId(), id)) { |
| | | throw exception(ACCOUNT_SUBJECT_CODE_DUPLICATE, subjectCode); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æ ¡éªä¸çº§ç§ç®ï¼é空æ¶å¿
é¡»åå¨ï¼ä¸ä¸è½æ¯èªå·±æèªå·±çä¸çº§ï¼é¿å
å½¢æç¯ï¼ |
| | | * |
| | | * @param parentId ä¸çº§ç§ç®ç¼å· |
| | | * @param selfId å½åç§ç®ç¼å·ï¼æ°å¢æ¶ä¼ null |
| | | */ |
| | | private void validateParent(Long parentId, Long selfId) { |
| | | if (parentId == null) { |
| | | return; |
| | | } |
| | | if (Objects.equals(parentId, selfId)) { |
| | | throw exception(ACCOUNT_SUBJECT_PARENT_SELF); |
| | | } |
| | | FinAccountSubjectDO parent = accountSubjectMapper.selectById(parentId); |
| | | if (parent == null) { |
| | | throw exception(ACCOUNT_SUBJECT_PARENT_NOT_EXISTS, parentId); |
| | | } |
| | | // èªä¸èä¸å溯ï¼è¥éå°èªå·±ï¼è¯´æéæ©çä¸çº§æ¯èªå·±çä¸çº§ |
| | | Set<Long> visited = new HashSet<>(); |
| | | Long cursor = parentId; |
| | | while (cursor != null && visited.add(cursor)) { |
| | | if (Objects.equals(cursor, selfId)) { |
| | | throw exception(ACCOUNT_SUBJECT_PARENT_CYCLE, parent.getSubjectName()); |
| | | } |
| | | FinAccountSubjectDO node = accountSubjectMapper.selectById(cursor); |
| | | cursor = node == null ? null : node.getParentId(); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public FinAccountSubjectDO getAccountSubject(Long id) { |
| | | return accountSubjectMapper.selectById(id); |
| | | } |
| | | |
| | | @Override |
| | | public PageResult<FinAccountSubjectDO> getAccountSubjectPage(FinAccountSubjectPageReqVO pageReqVO) { |
| | | return accountSubjectMapper.selectPage(pageReqVO); |
| | | } |
| | | |
| | | @Override |
| | | public List<FinAccountSubjectDO> getAccountSubjectList() { |
| | | return accountSubjectMapper.selectListAll(); |
| | | } |
| | | |
| | | @Override |
| | | public FinAccountSubjectDO getAccountSubjectByCode(String subjectCode) { |
| | | return accountSubjectMapper.selectBySubjectCode(subjectCode); |
| | | } |
| | | |
| | | @Override |
| | | public List<FinAccountSubjectDO> getAccountSubjectListByCodes(Collection<String> subjectCodes) { |
| | | return accountSubjectMapper.selectListBySubjectCodes(subjectCodes); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.service.voucher; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.voucher.vo.FinVoucherPageReqVO; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.voucher.vo.FinVoucherSaveReqVO; |
| | | import cn.iocoder.yudao.module.finance.dal.dataobject.voucher.FinVoucherDO; |
| | | import cn.iocoder.yudao.module.finance.dal.dataobject.voucher.FinVoucherEntryDO; |
| | | import jakarta.validation.Valid; |
| | | |
| | | import java.time.LocalDate; |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMultiMap; |
| | | |
| | | /** |
| | | * è®°è´¦åè¯ Service æ¥å£ |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | public interface FinVoucherService { |
| | | |
| | | /** |
| | | * å建记账åè¯ |
| | | * |
| | | * @param createReqVO åå»ºä¿¡æ¯ |
| | | * @return åè¯ç¼å· |
| | | */ |
| | | Long createVoucher(@Valid FinVoucherSaveReqVO createReqVO); |
| | | |
| | | /** |
| | | * æ´æ°è®°è´¦åè¯ |
| | | * |
| | | * ä»
æªè¿è´¦çåè¯å
许修æ¹ï¼ä¿®æ¹æ¶ä¼æ´è¡¨é建åè¯åå½ |
| | | * |
| | | * @param updateReqVO æ´æ°ä¿¡æ¯ |
| | | */ |
| | | void updateVoucher(@Valid FinVoucherSaveReqVO updateReqVO); |
| | | |
| | | /** |
| | | * å é¤è®°è´¦åè¯ |
| | | * |
| | | * @param id åè¯ç¼å· |
| | | */ |
| | | void deleteVoucher(Long id); |
| | | |
| | | /** |
| | | * æ¹éå é¤è®°è´¦åè¯ |
| | | * |
| | | * @param ids åè¯ç¼å·æ°ç» |
| | | */ |
| | | void deleteVoucherList(List<Long> ids); |
| | | |
| | | /** |
| | | * åè¯è¿è´¦ï¼æªè¿è´¦ -> å·²è¿è´¦ |
| | | * |
| | | * @param id åè¯ç¼å· |
| | | */ |
| | | void postVoucher(Long id); |
| | | |
| | | /** |
| | | * åè¯ä½åºï¼æªè¿è´¦ -> å·²ä½åº |
| | | * |
| | | * @param id åè¯ç¼å· |
| | | */ |
| | | void cancelVoucher(Long id); |
| | | |
| | | /** |
| | | * è·å¾è®°è´¦åè¯ |
| | | * |
| | | * @param id åè¯ç¼å· |
| | | * @return è®°è´¦åè¯ |
| | | */ |
| | | FinVoucherDO getVoucher(Long id); |
| | | |
| | | /** |
| | | * è·å¾è®°è´¦åè¯å页 |
| | | * |
| | | * @param pageReqVO å页æ¥è¯¢ |
| | | * @return è®°è´¦åè¯å页 |
| | | */ |
| | | PageResult<FinVoucherDO> getVoucherPage(FinVoucherPageReqVO pageReqVO); |
| | | |
| | | /** |
| | | * è·å¾æå®ç¼å·çè®°è´¦åè¯å表 |
| | | * |
| | | * @param ids åè¯ç¼å·æ°ç» |
| | | * @return è®°è´¦åè¯å表 |
| | | */ |
| | | List<FinVoucherDO> getVoucherList(Collection<Long> ids); |
| | | |
| | | /** |
| | | * è·å¾æå®æ¥æåºé´çè®°è´¦åè¯å表 |
| | | * |
| | | * @param startDate å¼å§æ¥æï¼å«ï¼ |
| | | * @param endDate ç»ææ¥æï¼å«ï¼ |
| | | * @return è®°è´¦åè¯å表 |
| | | */ |
| | | List<FinVoucherDO> getVoucherListByDateBetween(LocalDate startDate, LocalDate endDate); |
| | | |
| | | /** |
| | | * è·å¾æå®åè¯çåå½åè¡¨ï¼æè¡å·ååºï¼ |
| | | * |
| | | * @param voucherId åè¯ç¼å· |
| | | * @return åå½å表 |
| | | */ |
| | | List<FinVoucherEntryDO> getVoucherEntryListByVoucherId(Long voucherId); |
| | | |
| | | /** |
| | | * è·å¾æå®åè¯çåå½ Mapï¼key 为åè¯ç¼å·ï¼ |
| | | * |
| | | * @param voucherIds åè¯ç¼å·æ°ç» |
| | | * @return åå½ Map |
| | | */ |
| | | default Map<Long, List<FinVoucherEntryDO>> getVoucherEntryMap(Collection<Long> voucherIds) { |
| | | List<FinVoucherEntryDO> list = getVoucherEntryListByVoucherIds(voucherIds); |
| | | return convertMultiMap(list, FinVoucherEntryDO::getVoucherId); |
| | | } |
| | | |
| | | /** |
| | | * è·å¾æå®åè¯çåå½å表 |
| | | * |
| | | * @param voucherIds åè¯ç¼å·æ°ç» |
| | | * @return åå½å表 |
| | | */ |
| | | List<FinVoucherEntryDO> getVoucherEntryListByVoucherIds(Collection<Long> voucherIds); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.finance.service.voucher; |
| | | |
| | | import cn.hutool.core.util.ObjectUtil; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.voucher.vo.FinVoucherEntrySaveReqVO; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.voucher.vo.FinVoucherPageReqVO; |
| | | import cn.iocoder.yudao.module.finance.controller.admin.voucher.vo.FinVoucherSaveReqVO; |
| | | import cn.iocoder.yudao.module.finance.dal.dataobject.subject.FinAccountSubjectDO; |
| | | import cn.iocoder.yudao.module.finance.dal.dataobject.voucher.FinVoucherDO; |
| | | import cn.iocoder.yudao.module.finance.dal.dataobject.voucher.FinVoucherEntryDO; |
| | | import cn.iocoder.yudao.module.finance.dal.mysql.voucher.FinVoucherEntryMapper; |
| | | import cn.iocoder.yudao.module.finance.dal.mysql.voucher.FinVoucherMapper; |
| | | import cn.iocoder.yudao.module.finance.dal.redis.no.FinNoRedisDAO; |
| | | import cn.iocoder.yudao.module.finance.enums.FinVoucherStatusEnum; |
| | | import cn.iocoder.yudao.module.finance.service.subject.FinAccountSubjectService; |
| | | import cn.iocoder.yudao.module.system.api.storage.StorageAttachmentApi; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | | import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | import java.time.LocalDate; |
| | | import java.util.ArrayList; |
| | | import java.util.Collection; |
| | | import java.util.Collections; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.Set; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| | | import static cn.iocoder.yudao.module.finance.enums.ErrorCodeConstants.*; |
| | | |
| | | /** |
| | | * è®°è´¦åè¯ Service å®ç°ç±» |
| | | * |
| | | * åè´·è®°è´¦è§åï¼æåå¿
æè´·ãåè´·å¿
ç¸ç |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @Service |
| | | @Validated |
| | | public class FinVoucherServiceImpl implements FinVoucherService { |
| | | |
| | | /** |
| | | * éä»¶ï¼åºç¨ç¨é |
| | | */ |
| | | private static final String ATTACHMENT_APPLICATION = "file"; |
| | | /** |
| | | * éä»¶ï¼ä¸å¡è®°å½ç±»å |
| | | */ |
| | | private static final String ATTACHMENT_RECORD_TYPE = "fin_voucher"; |
| | | |
| | | @Resource |
| | | private FinVoucherMapper voucherMapper; |
| | | @Resource |
| | | private FinVoucherEntryMapper voucherEntryMapper; |
| | | @Resource |
| | | private FinAccountSubjectService accountSubjectService; |
| | | @Resource |
| | | private FinNoRedisDAO noRedisDAO; |
| | | @Resource |
| | | private StorageAttachmentApi storageAttachmentApi; |
| | | @Resource |
| | | private AdminUserApi adminUserApi; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long createVoucher(FinVoucherSaveReqVO createReqVO) { |
| | | // 1.1 æ ¡éªåå½ï¼å¹¶å¾å°è§èååçåå½æç» |
| | | List<FinVoucherEntryDO> entries = buildVoucherEntries(createReqVO.getEntries(), createReqVO.getSummary()); |
| | | // 1.2 åè¯åå·ï¼ç空æ¶èªå¨çæï¼å¹¶æ ¡éªå¯ä¸ |
| | | String voucherNo = StrUtil.isBlank(createReqVO.getVoucherNo()) |
| | | ? noRedisDAO.generate(FinNoRedisDAO.VOUCHER_NO_PREFIX) : StrUtil.trim(createReqVO.getVoucherNo()); |
| | | validateVoucherNoUnique(null, voucherNo); |
| | | |
| | | // 2.1 æå
¥åè¯ |
| | | FinVoucherDO voucher = BeanUtils.toBean(createReqVO, FinVoucherDO.class); |
| | | voucher.setVoucherNo(voucherNo); |
| | | voucher.setStatus(FinVoucherStatusEnum.UNPOSTED.getStatus()); |
| | | voucher.setDebit(sumAmount(entries, true)); |
| | | voucher.setCredit(sumAmount(entries, false)); |
| | | voucher.setAttachmentCount(ObjectUtil.defaultIfNull(createReqVO.getAttachmentCount(), 0)); |
| | | voucherMapper.insert(voucher); |
| | | // 2.2 æå
¥åå½ |
| | | insertVoucherEntryList(voucher.getId(), entries); |
| | | // 2.3 ç»å®éä»¶ |
| | | storageAttachmentApi.bindAttachments(ATTACHMENT_APPLICATION, ATTACHMENT_RECORD_TYPE, |
| | | voucher.getId(), createReqVO.getBlobIds()); |
| | | return voucher.getId(); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void updateVoucher(FinVoucherSaveReqVO updateReqVO) { |
| | | // 1.1 æ ¡éªåå¨ |
| | | FinVoucherDO voucher = validateVoucherExists(updateReqVO.getId()); |
| | | // 1.2 æ ¡éªç¶æï¼åªææªè¿è´¦çåè¯å
è®¸ä¿®æ¹ |
| | | validateVoucherUnposted(voucher); |
| | | // 1.3 æ ¡éªåå½ï¼å¹¶å¾å°è§èååçåå½æç» |
| | | List<FinVoucherEntryDO> entries = buildVoucherEntries(updateReqVO.getEntries(), updateReqVO.getSummary()); |
| | | // 1.4 åè¯åå·ï¼çç©ºæ¶æ²¿ç¨ååå·ï¼å¡«åäºåæ ¡éªå¯ä¸ |
| | | String voucherNo = StrUtil.isBlank(updateReqVO.getVoucherNo()) |
| | | ? voucher.getVoucherNo() : StrUtil.trim(updateReqVO.getVoucherNo()); |
| | | validateVoucherNoUnique(voucher.getId(), voucherNo); |
| | | |
| | | // 2.1 æ´æ°åè¯ï¼ç¶æãå¶å人ä¸ç±å端æ¹å¨ï¼ |
| | | FinVoucherDO updateObj = BeanUtils.toBean(updateReqVO, FinVoucherDO.class); |
| | | updateObj.setId(voucher.getId()); |
| | | updateObj.setVoucherNo(voucherNo); |
| | | updateObj.setDebit(sumAmount(entries, true)); |
| | | updateObj.setCredit(sumAmount(entries, false)); |
| | | updateObj.setAttachmentCount(ObjectUtil.defaultIfNull(updateReqVO.getAttachmentCount(), 0)); |
| | | voucherMapper.updateById(updateObj); |
| | | // 2.2 æ´è¡¨é建åå½ |
| | | voucherEntryMapper.deleteByVoucherId(voucher.getId()); |
| | | insertVoucherEntryList(voucher.getId(), entries); |
| | | // 2.3 æ´æ°éä»¶ |
| | | storageAttachmentApi.updateAttachments(ATTACHMENT_APPLICATION, ATTACHMENT_RECORD_TYPE, |
| | | voucher.getId(), updateReqVO.getBlobIds()); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void deleteVoucher(Long id) { |
| | | FinVoucherDO voucher = validateVoucherExists(id); |
| | | // åªææªè¿è´¦ãå·²ä½åºçåè¯å
许å é¤ |
| | | validateVoucherDeletable(voucher); |
| | | deleteVoucherList0(Collections.singletonList(id)); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void deleteVoucherList(List<Long> ids) { |
| | | if (ids == null || ids.isEmpty()) { |
| | | return; |
| | | } |
| | | // æ ¡éªç¶æï¼åªè¦åå¨å·²è¿è´¦çåè¯ï¼æ´æ¹æç»ï¼é¿å
é¨åæå |
| | | voucherMapper.selectListByIds(ids).forEach(this::validateVoucherDeletable); |
| | | deleteVoucherList0(ids); |
| | | } |
| | | |
| | | private void deleteVoucherList0(List<Long> ids) { |
| | | voucherMapper.deleteByIds(ids); |
| | | voucherEntryMapper.deleteByVoucherIds(ids); |
| | | // å é¤éä»¶å
³è |
| | | ids.forEach(id -> storageAttachmentApi.deleteAttachmentsByRecord(ATTACHMENT_RECORD_TYPE, id)); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void postVoucher(Long id) { |
| | | FinVoucherDO voucher = validateVoucherExists(id); |
| | | validateVoucherUnposted(voucher); |
| | | voucherMapper.updateById(new FinVoucherDO().setId(id) |
| | | .setStatus(FinVoucherStatusEnum.POSTED.getStatus())); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void cancelVoucher(Long id) { |
| | | FinVoucherDO voucher = validateVoucherExists(id); |
| | | validateVoucherCancellable(voucher); |
| | | voucherMapper.updateById(new FinVoucherDO().setId(id) |
| | | .setStatus(FinVoucherStatusEnum.CANCELLED.getStatus())); |
| | | } |
| | | |
| | | @Override |
| | | public FinVoucherDO getVoucher(Long id) { |
| | | return voucherMapper.selectById(id); |
| | | } |
| | | |
| | | @Override |
| | | public PageResult<FinVoucherDO> getVoucherPage(FinVoucherPageReqVO pageReqVO) { |
| | | // ãå¶å人ãæç´¢æ¡éå¡«çæ¯æµç§°ï¼å表å±ç¤ºçå°±æ¯æµç§°ï¼ï¼å
è§£ææç¨æ·ç¼å·åè¿æ»¤ |
| | | Set<String> creatorIds = resolveCreatorIds(pageReqVO.getCreator()); |
| | | if (creatorIds != null && creatorIds.isEmpty()) { |
| | | // æç´¢è¯æ²¡å¹é
å°ä»»ä½ç¨æ·ï¼ç´æ¥è¿å空页ã |
| | | // ä¸è½æç©ºéå彿ãä¸è¿æ»¤ãä¼ ä¸å»ï¼å¦åç¨æ·æä¸ä¸ªä¸åå¨çæµç§°ä¼çå°å
¨é¨åè¯ï¼åæ¯çé失æ |
| | | return new PageResult<>(Collections.emptyList(), 0L); |
| | | } |
| | | return voucherMapper.selectPage(pageReqVO, creatorIds); |
| | | } |
| | | |
| | | /** |
| | | * æãå¶å人ãæç´¢è¯è§£ææç¨æ·ç¼å·éåã |
| | | * |
| | | * æ¯æä¸ç§è¾å
¥ï¼æµç§°ãè´¦å·ï¼é½æ¯æ¨¡ç³å¹é
ï¼ã纯æ°åçç¨æ·ç¼å·ï¼å
¼å®¹è¿ä¸ªæç´¢æ¡ä»¥åæç¼å·æ¨¡ç³å¹é
çèä¹ æ¯ï¼ã |
| | | * æµç§°æ¯å表å±ç¤ºçåæ®µï¼è´¦å·æ¯æç´¢æ¡ä¸åçæç¤ºè¯ï¼æä»¥ä¸¤è
é½è¦è®¤ã |
| | | * |
| | | * @param creatorKeyword æç´¢è¯ |
| | | * @return null 表示æç´¢è¯ä¸ºç©ºã䏿å¶åäººè¿æ»¤ï¼ç©ºéå表示æç´¢è¯æ²¡å¹é
å°ä»»ä½ç¨æ· |
| | | */ |
| | | private Set<String> resolveCreatorIds(String creatorKeyword) { |
| | | if (StrUtil.isBlank(creatorKeyword)) { |
| | | return null; |
| | | } |
| | | String keyword = creatorKeyword.trim(); |
| | | Set<Long> userIds = convertSet(adminUserApi.getUserListByNickname(keyword), AdminUserRespDTO::getId); |
| | | userIds.addAll(convertSet(adminUserApi.getUserListByUsername(keyword), AdminUserRespDTO::getId)); |
| | | try { |
| | | userIds.add(Long.parseLong(keyword)); |
| | | } catch (NumberFormatException ignored) { |
| | | // 䏿¯çº¯æ°åï¼åªææµç§°ãè´¦å·å¹é
|
| | | } |
| | | return convertSet(userIds, String::valueOf); |
| | | } |
| | | |
| | | @Override |
| | | public List<FinVoucherDO> getVoucherList(Collection<Long> ids) { |
| | | if (ids == null || ids.isEmpty()) { |
| | | return Collections.emptyList(); |
| | | } |
| | | return voucherMapper.selectListByIds(ids); |
| | | } |
| | | |
| | | @Override |
| | | public List<FinVoucherDO> getVoucherListByDateBetween(LocalDate startDate, LocalDate endDate) { |
| | | return voucherMapper.selectListByDateBetween(startDate, endDate); |
| | | } |
| | | |
| | | @Override |
| | | public List<FinVoucherEntryDO> getVoucherEntryListByVoucherId(Long voucherId) { |
| | | return voucherEntryMapper.selectListByVoucherId(voucherId); |
| | | } |
| | | |
| | | @Override |
| | | public List<FinVoucherEntryDO> getVoucherEntryListByVoucherIds(Collection<Long> voucherIds) { |
| | | if (voucherIds == null || voucherIds.isEmpty()) { |
| | | return Collections.emptyList(); |
| | | } |
| | | return voucherEntryMapper.selectListByVoucherIds(voucherIds); |
| | | } |
| | | |
| | | private FinVoucherDO validateVoucherExists(Long id) { |
| | | if (id == null) { |
| | | throw exception(VOUCHER_NOT_EXISTS); |
| | | } |
| | | FinVoucherDO voucher = voucherMapper.selectById(id); |
| | | if (voucher == null) { |
| | | throw exception(VOUCHER_NOT_EXISTS); |
| | | } |
| | | return voucher; |
| | | } |
| | | |
| | | private void validateVoucherNoUnique(Long id, String voucherNo) { |
| | | FinVoucherDO voucher = voucherMapper.selectByVoucherNo(voucherNo); |
| | | if (voucher == null) { |
| | | return; |
| | | } |
| | | if (id == null || !voucher.getId().equals(id)) { |
| | | throw exception(VOUCHER_NO_DUPLICATE, voucherNo); |
| | | } |
| | | } |
| | | |
| | | private void validateVoucherUnposted(FinVoucherDO voucher) { |
| | | if (!FinVoucherStatusEnum.UNPOSTED.getStatus().equals(voucher.getStatus())) { |
| | | throw exception(VOUCHER_STATUS_NOT_UNPOSTED, voucher.getVoucherNo(), |
| | | FinVoucherStatusEnum.getName(voucher.getStatus())); |
| | | } |
| | | } |
| | | |
| | | private void validateVoucherCancellable(FinVoucherDO voucher) { |
| | | if (FinVoucherStatusEnum.UNPOSTED.getStatus().equals(voucher.getStatus()) |
| | | || FinVoucherStatusEnum.POSTED.getStatus().equals(voucher.getStatus())) { |
| | | return; |
| | | } |
| | | throw exception(VOUCHER_STATUS_NOT_CANCELLABLE, voucher.getVoucherNo(), |
| | | FinVoucherStatusEnum.getName(voucher.getStatus())); |
| | | } |
| | | |
| | | private void validateVoucherDeletable(FinVoucherDO voucher) { |
| | | if (FinVoucherStatusEnum.UNPOSTED.getStatus().equals(voucher.getStatus()) |
| | | || FinVoucherStatusEnum.CANCELLED.getStatus().equals(voucher.getStatus())) { |
| | | return; |
| | | } |
| | | throw exception(VOUCHER_DELETE_NOT_ALLOWED, voucher.getVoucherNo(), |
| | | FinVoucherStatusEnum.getName(voucher.getStatus())); |
| | | } |
| | | |
| | | /** |
| | | * æ ¡éªåè¯åå½ï¼å¹¶è½¬æ¢ä¸ºå¾
è½åºçåå½å表 |
| | | * |
| | | * æ ¡éªé¡¹ï¼â æ´è¡ç©ºç½å¿½ç¥ â¡ æéé¢å¿
é¡»æç§ç® ⢠æç§ç®å¿
é¡»æéé¢ |
| | | * ⣠åè¡åè´·ä¸å¾åæ¶å¤§äº 0 ⤠ç§ç®å¿
é¡»åå¨ â¥ åè´·å计ç¸çä¸å¤§äº 0 |
| | | * |
| | | * @param entryReqVOs å端æäº¤çåå½ |
| | | * @param voucherSummary åè¯æè¦ï¼ç¨äºåå¡«åå½æè¦ |
| | | * @return å¾
è½åºçåå½å表ï¼è¡å·ä» 1 è¿ç»ç¼å·ï¼ |
| | | */ |
| | | private List<FinVoucherEntryDO> buildVoucherEntries(List<FinVoucherEntrySaveReqVO> entryReqVOs, |
| | | String voucherSummary) { |
| | | // 1. 䏿¬¡æ§æ¥è¯¢æææ¶åçä¼è®¡ç§ç®ï¼é¿å
éè¡æ¥åº |
| | | Set<String> subjectCodes = convertSet(entryReqVOs, |
| | | entry -> StrUtil.trim(entry.getSubjectCode()), |
| | | entry -> StrUtil.isNotBlank(entry.getSubjectCode())); |
| | | Map<String, FinAccountSubjectDO> subjectMap = accountSubjectService.getAccountSubjectMap(subjectCodes); |
| | | |
| | | // 2. éè¡æ ¡éª |
| | | List<FinVoucherEntryDO> entries = new ArrayList<>(entryReqVOs.size()); |
| | | for (int i = 0; i < entryReqVOs.size(); i++) { |
| | | int rowNo = i + 1; // æç¤ºä¸çè¡å·ä¸åç«¯è¡¨æ ¼è¡å·ä¿æä¸è´ |
| | | FinVoucherEntrySaveReqVO entry = entryReqVOs.get(i); |
| | | BigDecimal debit = normalizeAmount(entry.getDebit()); |
| | | BigDecimal credit = normalizeAmount(entry.getCredit()); |
| | | boolean hasAmount = isPositive(debit) || isPositive(credit); |
| | | // 2.1 æ´è¡ç©ºç½ï¼æ ç§ç®ãæ éé¢ï¼ï¼ç´æ¥å¿½ç¥ |
| | | if (StrUtil.isBlank(entry.getSubjectCode())) { |
| | | if (!hasAmount) { |
| | | continue; |
| | | } |
| | | throw exception(VOUCHER_ENTRY_SUBJECT_REQUIRED, rowNo, formatAmount(debit), formatAmount(credit)); |
| | | } |
| | | String subjectCode = StrUtil.trim(entry.getSubjectCode()); |
| | | // 2.2 æç§ç®ä½æ²¡å¡«éé¢ |
| | | if (!hasAmount) { |
| | | throw exception(VOUCHER_ENTRY_AMOUNT_REQUIRED, rowNo, subjectCode); |
| | | } |
| | | // 2.3 åè¡åè´·ä¸å¾åæ¶å¤§äº 0 |
| | | if (isPositive(debit) && isPositive(credit)) { |
| | | throw exception(VOUCHER_ENTRY_DIRECTION_BOTH, rowNo, subjectCode, |
| | | formatAmount(debit), formatAmount(credit)); |
| | | } |
| | | // 2.4 ç§ç®å¿
é¡»åå¨ |
| | | FinAccountSubjectDO subject = subjectMap.get(subjectCode); |
| | | if (subject == null) { |
| | | throw exception(VOUCHER_ENTRY_SUBJECT_NOT_EXISTS, rowNo, subjectCode); |
| | | } |
| | | // 3. ç»è£
|
| | | entries.add(FinVoucherEntryDO.builder() |
| | | .rowNo(entries.size() + 1) |
| | | .subjectCode(subjectCode) |
| | | .subjectName(subject.getSubjectName()) |
| | | .summary(StrUtil.isBlank(entry.getSummary()) |
| | | ? StrUtil.blankToDefault(voucherSummary, subject.getSubjectName()) : entry.getSummary()) |
| | | .debit(debit) |
| | | .credit(credit) |
| | | .auxiliaryType(entry.getAuxiliaryType()) |
| | | .auxiliaryId(entry.getAuxiliaryId()) |
| | | .auxiliaryName(entry.getAuxiliaryName()) |
| | | .build()); |
| | | } |
| | | |
| | | // 4. è³å°ä¸æ¡ææåå½ |
| | | if (entries.isEmpty()) { |
| | | throw exception(VOUCHER_ENTRY_EMPTY); |
| | | } |
| | | // 5. å贷平衡ï¼ä¸åè®¡å¤§äº 0 |
| | | BigDecimal debitTotal = sumAmount(entries, true); |
| | | BigDecimal creditTotal = sumAmount(entries, false); |
| | | if (!isPositive(debitTotal) || debitTotal.compareTo(creditTotal) != 0) { |
| | | throw exception(VOUCHER_ENTRY_UNBALANCED, formatAmount(debitTotal), formatAmount(creditTotal)); |
| | | } |
| | | return entries; |
| | | } |
| | | |
| | | private void insertVoucherEntryList(Long voucherId, List<FinVoucherEntryDO> entries) { |
| | | entries.forEach(entry -> entry.setVoucherId(voucherId)); |
| | | voucherEntryMapper.insertBatch(entries); |
| | | } |
| | | |
| | | private static BigDecimal sumAmount(List<FinVoucherEntryDO> entries, boolean debit) { |
| | | return entries.stream() |
| | | .map(entry -> debit ? entry.getDebit() : entry.getCredit()) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | } |
| | | |
| | | /** |
| | | * éé¢è§èåï¼ç©ºå¼æ 0 å¤çï¼ç»ä¸ä¿ç 2 ä½å°æ° |
| | | */ |
| | | private static BigDecimal normalizeAmount(BigDecimal amount) { |
| | | return amount == null ? BigDecimal.ZERO : amount.setScale(2, RoundingMode.HALF_UP); |
| | | } |
| | | |
| | | private static boolean isPositive(BigDecimal amount) { |
| | | return amount != null && amount.compareTo(BigDecimal.ZERO) > 0; |
| | | } |
| | | |
| | | private static String formatAmount(BigDecimal amount) { |
| | | return amount == null ? "0.00" : amount.setScale(2, RoundingMode.HALF_UP).toPlainString(); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <?xml version="1.0" encoding="UTF-8"?> |
| | | <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
| | | <mapper namespace="cn.iocoder.yudao.module.finance.dal.mysql.ledger.FinLedgerMapper"> |
| | | |
| | | <select id="selectEntryList" |
| | | resultType="cn.iocoder.yudao.module.finance.dal.dataobject.ledger.FinLedgerEntryDO"> |
| | | SELECT e.voucher_id AS voucherId, |
| | | v.voucher_no AS voucherNo, |
| | | v.voucher_date AS voucherDate, |
| | | e.row_no AS rowNo, |
| | | e.subject_code AS subjectCode, |
| | | e.subject_name AS subjectName, |
| | | e.summary AS summary, |
| | | e.debit AS debit, |
| | | e.credit AS credit |
| | | FROM fin_voucher_entry e |
| | | INNER JOIN fin_voucher v ON v.id = e.voucher_id AND v.deleted = 0 |
| | | WHERE e.deleted = 0 |
| | | AND v.status = #{status} |
| | | AND v.voucher_date >= #{startDate} |
| | | AND v.voucher_date <= #{endDate} |
| | | AND e.subject_code IN |
| | | <foreach collection="subjectCodes" item="subjectCode" open="(" separator="," close=")"> |
| | | #{subjectCode} |
| | | </foreach> |
| | | ORDER BY v.voucher_date ASC, v.id ASC, e.row_no ASC |
| | | </select> |
| | | |
| | | <select id="selectBalanceBeforeDate" resultType="java.math.BigDecimal"> |
| | | SELECT COALESCE(SUM(e.debit - e.credit), 0) |
| | | FROM fin_voucher_entry e |
| | | INNER JOIN fin_voucher v ON v.id = e.voucher_id AND v.deleted = 0 |
| | | WHERE e.deleted = 0 |
| | | AND v.status = #{status} |
| | | AND v.voucher_date < #{date} |
| | | AND e.subject_code IN |
| | | <foreach collection="subjectCodes" item="subjectCode" open="(" separator="," close=")"> |
| | | #{subjectCode} |
| | | </foreach> |
| | | </select> |
| | | |
| | | </mapper> |
| | |
| | | List<AdminUserRespDTO> getUserListByNickname(String nickname); |
| | | |
| | | /** |
| | | * æ ¹æ®è´¦å·æ¨¡ç³æç´¢ç¨æ· |
| | | * |
| | | * @param username è´¦å·å
³é®è¯ |
| | | * @return ç¨æ·å表 |
| | | */ |
| | | List<AdminUserRespDTO> getUserListByUsername(String username); |
| | | |
| | | /** |
| | | * è·å¾ç¨æ· Map |
| | | * |
| | | * @param ids ç¨æ·ç¼å·æ°ç» |
| | |
| | | } |
| | | |
| | | @Override |
| | | public List<AdminUserRespDTO> getUserListByUsername(String username) { |
| | | List<AdminUserDO> users = userService.getUserListByUsername(username); |
| | | return BeanUtils.toBean(users, AdminUserRespDTO.class); |
| | | } |
| | | |
| | | @Override |
| | | public void validateUserList(Collection<Long> ids) { |
| | | userService.validateUserList(ids); |
| | | } |
| | |
| | | return selectList(new LambdaQueryWrapperX<AdminUserDO>().like(AdminUserDO::getNickname, nickname)); |
| | | } |
| | | |
| | | default List<AdminUserDO> selectListByUsername(String username) { |
| | | return selectList(new LambdaQueryWrapperX<AdminUserDO>().like(AdminUserDO::getUsername, username)); |
| | | } |
| | | |
| | | default List<AdminUserDO> selectListByStatus(Integer status) { |
| | | return selectList(AdminUserDO::getStatus, status); |
| | | } |
| | |
| | | List<AdminUserDO> getUserListByNickname(String nickname); |
| | | |
| | | /** |
| | | * è·å¾ç¨æ·å表ï¼åºäºè´¦å·æ¨¡ç³å¹é
|
| | | * |
| | | * @param username è´¦å· |
| | | * @return ç¨æ·å表 |
| | | */ |
| | | List<AdminUserDO> getUserListByUsername(String username); |
| | | |
| | | /** |
| | | * æ¹é导å
¥ç¨æ· |
| | | * |
| | | * @param importUsers 导å
¥ç¨æ·å表 |
| | |
| | | return userMapper.selectListByNickname(nickname); |
| | | } |
| | | |
| | | @Override |
| | | public List<AdminUserDO> getUserListByUsername(String username) { |
| | | return userMapper.selectListByUsername(username); |
| | | } |
| | | |
| | | /** |
| | | * è·å¾é¨é¨æ¡ä»¶ï¼æ¥è¯¢æå®é¨é¨çåé¨é¨ç¼å·ä»¬ï¼å
æ¬èªèº« |
| | | * |
| | |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <!-- è´¢å¡ç®¡çç¸å
³æ¨¡å --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-module-finance</artifactId> |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <!-- AI 大模åç¸å
³æ¨¡åãé»è®¤æ³¨éï¼ä¿è¯ç¼è¯é度 --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | |
| | | primary: master |
| | | datasource: |
| | | master: |
| | | url: jdbc:mysql://172.17.0.1:10000/mom-hm?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X è¿æ¥çç¤ºä¾ |
| | | url: jdbc:mysql://172.17.0.1:10000/mom-trt?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X è¿æ¥çç¤ºä¾ |
| | | username: root |
| | | password: xd@123456.. |
| | | |