From 5d34bdd3c426bb2ca5f6627424ae67984f745603 Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期三, 21 十月 2026 18:28:59 +0800
Subject: [PATCH] feat: 新增资产/用车/采购模块,完善课题、会员、财务与企微功能
---
yudao-module-finance/src/main/java/cn/iocoder/yudao/module/finance/service/reimbursement/FinanceReimbursementServiceImpl.java | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 52 insertions(+), 5 deletions(-)
diff --git a/yudao-module-finance/src/main/java/cn/iocoder/yudao/module/finance/service/reimbursement/FinanceReimbursementServiceImpl.java b/yudao-module-finance/src/main/java/cn/iocoder/yudao/module/finance/service/reimbursement/FinanceReimbursementServiceImpl.java
index 60e4b10..445f470 100644
--- a/yudao-module-finance/src/main/java/cn/iocoder/yudao/module/finance/service/reimbursement/FinanceReimbursementServiceImpl.java
+++ b/yudao-module-finance/src/main/java/cn/iocoder/yudao/module/finance/service/reimbursement/FinanceReimbursementServiceImpl.java
@@ -2,6 +2,7 @@
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.archive.api.document.ArchiveDocumentApi;
@@ -24,6 +25,8 @@
import cn.iocoder.yudao.module.finance.enums.FinanceReimbursementStatusEnum;
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 jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.flowable.engine.repository.ProcessDefinition;
@@ -82,6 +85,9 @@
private StorageAttachmentApi storageAttachmentApi;
@Resource
+ private AdminUserApi adminUserApi;
+
+ @Resource
private ArchiveDocumentApi archiveDocumentApi;
@Resource
@@ -97,21 +103,26 @@
// 1. 鎶ラ攢鍗曞彿锛氬厑璁哥敤鎴疯嚜瀹氫箟锛屾湭濉椂鐢辩郴缁熺敓鎴�
String no = resolveCreateNo(createReqVO.getNo());
- // 2.1 鎻掑叆鎶ラ攢鍗�
+ // 2.1 鐢宠浜猴細鏀寔浠d粬浜哄彂璧凤紱鏈寚瀹氭椂榛樿褰撳墠鐧诲綍鐢ㄦ埛锛堜唬褰曚汉鐢� creator 瀹¤瀛楁璁板綍锛�
+ Long applicantId = createReqVO.getApplicantId() != null
+ ? createReqVO.getApplicantId() : getLoginUserId();
+ validateApplicant(applicantId);
+
+ // 2.2 鎻掑叆鎶ラ攢鍗�
FinanceReimbursementDO reimbursement = BeanUtils.toBean(createReqVO, FinanceReimbursementDO.class, in -> in
.setNo(no)
.setStatus(FinanceReimbursementStatusEnum.DRAFT.getStatus())
- .setApplicantId(getLoginUserId())
+ .setApplicantId(applicantId)
.setApplyDate(createReqVO.getApplyDate() != null ? createReqVO.getApplyDate() : LocalDate.now()));
reimbursementMapper.insert(reimbursement);
- // 2.2 鎻掑叆鎶ラ攢鏄庣粏
+ // 2.3 鎻掑叆鎶ラ攢鏄庣粏
List<FinanceReimbursementItemDO> items = buildItems(reimbursement.getId(), createReqVO.getItems());
if (CollUtil.isNotEmpty(items)) {
reimbursementItemMapper.insertBatch(items);
}
- // 2.3 缁戝畾鍙戠エ闄勪欢
+ // 2.4 缁戝畾鍙戠エ闄勪欢
storageAttachmentApi.bindAttachments("file", REIMBURSEMENT_RECORD_TYPE,
reimbursement.getId(), createReqVO.getBlobIds());
@@ -132,6 +143,11 @@
// 2.1 鏇存柊鎶ラ攢鍗�
FinanceReimbursementDO updateObj = BeanUtils.toBean(updateReqVO, FinanceReimbursementDO.class);
+ // 鐢宠浜猴細浠d粬浜哄彂璧锋椂鍏佽淇敼瀹為檯鐢宠浜猴紱涓嶄紶鍒欎繚鎸佸師鍊�
+ if (updateReqVO.getApplicantId() != null) {
+ validateApplicant(updateReqVO.getApplicantId());
+ updateObj.setApplicantId(updateReqVO.getApplicantId());
+ }
// 鎶ラ攢鍗曞彿锛氭湭濉〃绀轰笉鍙樻洿锛屽~浜嗗垯鏍¢獙鍚庤鐩�
String customNo = StrUtil.trimToNull(updateReqVO.getNo());
if (customNo == null || customNo.equals(reimbursement.getNo())) {
@@ -205,10 +221,12 @@
throw exception(REIMBURSEMENT_SUBMIT_FAIL_ITEM_EMPTY);
}
- // 2. 鍒涘缓 BPM 娴佺▼瀹炰緥
+ // 2. 鍒涘缓 BPM 娴佺▼瀹炰緥锛屾妸瀹為檯鐢宠浜轰笌浠e綍浜哄啓鍏ユ祦绋嬪彉閲忥紝渚涘鎵规祦灞曠ず涓庤矾鐢变娇鐢�
+ Map<String, Object> variables = buildProcessVariables(reimbursement, userId);
String processInstanceId = processInstanceApi.createProcessInstance(userId,
new BpmProcessInstanceCreateReqDTO()
.setProcessDefinitionKey(processDefinitionKey)
+ .setVariables(variables)
.setBusinessKey(String.valueOf(id)));
// 3. 鏇存柊鐘舵�佷负瀹℃壒涓�
@@ -361,6 +379,35 @@
}
}
+ /**
+ * 鏍¢獙瀹為檯鐢宠浜哄瓨鍦ㄤ笖涓哄惎鐢ㄧ姸鎬�
+ */
+ private void validateApplicant(Long applicantId) {
+ AdminUserRespDTO applicant = applicantId != null ? adminUserApi.getUser(applicantId) : null;
+ if (applicant == null || !CommonStatusEnum.ENABLE.getStatus().equals(applicant.getStatus())) {
+ throw exception(REIMBURSEMENT_APPLICANT_NOT_EXISTS, applicantId);
+ }
+ }
+
+ /**
+ * 鏋勫缓鎶ラ攢瀹℃壒娴佺▼鍙橀噺锛氬疄闄呯敵璇蜂汉 + 浠e綍锛堝彂璧凤級浜�
+ *
+ * <p>瀹℃壒娴佷腑鍙�氳繃 applicantName 灞曠ず瀹為檯鐢宠浜猴紝閫氳繃 initiatorName 灞曠ず浠e綍浜猴紝
+ * 骞堕�氳繃 isProxy 鍒ゆ柇鏄惁涓轰唬浠栦汉鍙戣捣
+ */
+ private Map<String, Object> buildProcessVariables(FinanceReimbursementDO reimbursement, Long submitUserId) {
+ Long applicantId = reimbursement.getApplicantId();
+ AdminUserRespDTO applicant = applicantId != null ? adminUserApi.getUser(applicantId) : null;
+ AdminUserRespDTO submitter = submitUserId != null ? adminUserApi.getUser(submitUserId) : null;
+ Map<String, Object> variables = new HashMap<>(8);
+ variables.put("applicantId", applicantId);
+ variables.put("applicantName", applicant != null ? applicant.getNickname() : "");
+ variables.put("initiatorId", submitUserId);
+ variables.put("initiatorName", submitter != null ? submitter.getNickname() : "");
+ variables.put("isProxy", applicantId != null && !applicantId.equals(submitUserId));
+ return variables;
+ }
+
private List<FinanceReimbursementItemDO> buildItems(Long reimbursementId,
List<FinanceReimbursementItemSaveReqVO> itemVOs) {
if (CollUtil.isEmpty(itemVOs)) {
--
Gitblit v1.9.3