From 70ea74cfb981f812bfa4e3ef91843c5ad93f7b27 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期三, 04 十一月 2026 17:32:49 +0800
Subject: [PATCH] feat(erp): 采购台账改造与采购退货增强
---
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorServiceImpl.java | 308 +++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 296 insertions(+), 12 deletions(-)
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorServiceImpl.java
index 18296c8..63cd140 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorServiceImpl.java
@@ -2,11 +2,14 @@
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjUtil;
+import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
+import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
+import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.MesWmReturnVendorPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.MesWmReturnVendorSaveReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.line.MesWmReturnVendorLineSaveReqVO;
@@ -15,22 +18,32 @@
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorLineDO;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnvendor.MesWmReturnVendorMapper;
import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants;
+import cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnVendorHandleTypeEnum;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnVendorStatusEnum;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum;
+import cn.iocoder.yudao.module.erp.api.finance.ErpFinancePaymentApi;
+import cn.iocoder.yudao.module.erp.api.finance.dto.ErpFinancePaymentRedFlushCreateReqDTO;
import cn.iocoder.yudao.module.erp.api.purchase.ErpPurchaseOrderApi;
import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderItemRespDTO;
import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderRespDTO;
import cn.iocoder.yudao.module.srm.api.supplier.SrmSupplierApi;
+import cn.iocoder.yudao.module.mes.service.wm.arrivalnotice.MesWmArrivalNoticeService;
import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService;
import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO;
+import cn.iocoder.yudao.module.system.api.storage.StorageAttachmentApi;
import jakarta.annotation.Resource;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
+import java.util.Map;
import java.util.Set;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -43,6 +56,11 @@
@Service
@Validated
public class MesWmReturnVendorServiceImpl implements MesWmReturnVendorService {
+
+ /**
+ * 闄勪欢涓氬姟绫诲瀷锛歁ES 渚涘簲鍟嗛��璐у崟
+ */
+ public static final String RETURN_VENDOR_RECORD_TYPE = "mes_wm_return_vendor";
@Resource
private MesWmReturnVendorMapper returnVendorMapper;
@@ -57,14 +75,22 @@
private MesWmTransactionService wmTransactionService;
@Resource
private ErpPurchaseOrderApi purchaseOrderApi;
+ @Resource
+ private ErpFinancePaymentApi financePaymentApi;
+ @Resource
+ private MesWmArrivalNoticeService arrivalNoticeService;
+ @Resource
+ private StorageAttachmentApi storageAttachmentApi;
+ @Resource
+ private BpmProcessInstanceApi processInstanceApi;
@Override
@Transactional(rollbackFor = Exception.class)
public Long createReturnVendor(MesWmReturnVendorSaveReqVO createReqVO) {
// 1. 鏍¢獙鏁版嵁
validateReturnVendorSaveData(createReqVO);
- // 1.1. 鑻ラ噰璐鍗曞彿涓虹┖浣嗗叧鑱斾簡閲囪喘璁㈠崟锛屽垯浠� ERP 閲囪喘璁㈠崟琛ラ綈璁㈠崟鍙�
- fillPurchaseOrderCode(createReqVO);
+ // 1.1. 鑻ラ噰璐鍗曞彿涓虹┖浣嗗叧鑱斾簡閲囪喘璁㈠崟锛屽垯浠� ERP 閲囪喘璁㈠崟琛ラ綈璁㈠崟鍙枫�佸悎鍚屽彿
+ fillFromPurchaseOrder(createReqVO);
// 2. 鎻掑叆涓昏〃
MesWmReturnVendorDO returnVendor = BeanUtils.toBean(createReqVO, MesWmReturnVendorDO.class);
@@ -75,6 +101,9 @@
if (returnVendor.getPurchaseOrderId() != null) {
autoImportLinesFromLinkedOrder(returnVendor.getId(), false);
}
+ // 2.2. 缁戝畾闄勪欢锛堣川閲忛儴鍙戣捣閫�璐ф椂涓婁紶鐨勬楠屾姤鍛娿�佺収鐗囩瓑锛�
+ storageAttachmentApi.bindAttachments("file", RETURN_VENDOR_RECORD_TYPE,
+ returnVendor.getId(), createReqVO.getBlobIds());
return returnVendor.getId();
}
@@ -83,8 +112,8 @@
public void updateReturnVendor(MesWmReturnVendorSaveReqVO updateReqVO) {
// 1. 鏍¢獙鏁版嵁锛堝惈瀛樺湪 + 鑽夌鐘舵�侊級
MesWmReturnVendorDO oldReturnVendor = validateReturnVendorSaveData(updateReqVO);
- // 1.1. 鑻ラ噰璐鍗曞彿涓虹┖浣嗗叧鑱斾簡閲囪喘璁㈠崟锛屽垯浠� ERP 閲囪喘璁㈠崟琛ラ綈璁㈠崟鍙�
- fillPurchaseOrderCode(updateReqVO);
+ // 1.1. 鑻ラ噰璐鍗曞彿涓虹┖浣嗗叧鑱斾簡閲囪喘璁㈠崟锛屽垯浠� ERP 閲囪喘璁㈠崟琛ラ綈璁㈠崟鍙枫�佸悎鍚屽彿
+ fillFromPurchaseOrder(updateReqVO);
Long oldPurchaseOrderId = oldReturnVendor != null ? oldReturnVendor.getPurchaseOrderId() : null;
Long newPurchaseOrderId = updateReqVO.getPurchaseOrderId();
@@ -100,22 +129,29 @@
if (newPurchaseOrderId != null) {
autoImportLinesFromLinkedOrder(updateReqVO.getId(), purchaseOrderChanged);
}
+
+ // 4. 澧為噺鏇存柊闄勪欢锛堝彧澶勭悊鏂板/鍒犻櫎锛屾湭浼� blobIds 鏃朵笉鍔ㄧ幇鏈夐檮浠讹級
+ storageAttachmentApi.updateAttachments("file", RETURN_VENDOR_RECORD_TYPE,
+ updateReqVO.getId(), updateReqVO.getBlobIds());
}
/**
- * 褰撻噰璐鍗曞彿涓虹┖銆佷絾鍏宠仈浜嗛噰璐鍗曟椂锛屼粠 ERP 閲囪喘璁㈠崟琛ラ綈閲囪喘璁㈠崟鍙�
+ * 鍏宠仈浜嗛噰璐鍗曟椂锛屼粠 ERP 閲囪喘璁㈠崟琛ラ綈閲囪喘璁㈠崟鍙枫�佸悎鍚屽彿锛堝悎鍚屽彿鍙仛蹇収锛屼笉鍏佽鎵嬪伐鐢熸垚锛�
*/
- private void fillPurchaseOrderCode(MesWmReturnVendorSaveReqVO reqVO) {
+ private void fillFromPurchaseOrder(MesWmReturnVendorSaveReqVO reqVO) {
if (reqVO == null || reqVO.getPurchaseOrderId() == null) {
- return;
- }
- if (cn.hutool.core.util.StrUtil.isNotBlank(reqVO.getPurchaseOrderCode())) {
return;
}
ErpPurchaseOrderRespDTO purchaseOrder =
purchaseOrderApi.getPurchaseOrder(reqVO.getPurchaseOrderId()).getCheckedData();
- if (purchaseOrder != null) {
+ if (purchaseOrder == null) {
+ return;
+ }
+ if (StrUtil.isBlank(reqVO.getPurchaseOrderCode())) {
reqVO.setPurchaseOrderCode(purchaseOrder.getNo());
+ }
+ if (StrUtil.isBlank(reqVO.getContractNo())) {
+ reqVO.setContractNo(purchaseOrder.getContractNo());
}
}
@@ -129,7 +165,9 @@
returnVendorDetailService.deleteReturnVendorDetailByReturnId(id);
// 2.2 绾ц仈鍒犻櫎琛�
returnVendorLineService.deleteReturnVendorLineByReturnId(id);
- // 2.3 鍒犻櫎涓昏〃
+ // 2.3 鍒犻櫎闄勪欢
+ storageAttachmentApi.deleteAttachmentsByRecord(RETURN_VENDOR_RECORD_TYPE, id);
+ // 2.4 鍒犻櫎涓昏〃
returnVendorMapper.deleteById(id);
}
@@ -161,6 +199,80 @@
@Override
@Transactional(rollbackFor = Exception.class)
+ public void submitReturnVendorApproval(Long id, String processDefinitionKey) {
+ // 1. 鏍¢獙瀛樺湪 + 鑽夌鐘舵�� + 鑷冲皯涓�鏉¤
+ validateReturnVendorExistsAndPrepare(id);
+ if (CollUtil.isEmpty(returnVendorLineService.getReturnVendorLineListByReturnId(id))) {
+ throw exception(WM_RETURN_VENDOR_NO_LINE);
+ }
+
+ // 2. 鍏ㄥ眬鍏嶅鎵癸細鐩存帴缃负銆屽緟鎷h揣銆嶏紝鏃犻渶娴佺▼妯″瀷
+ if (processInstanceApi.isGlobalAutoApprove()) {
+ returnVendorMapper.updateById(new MesWmReturnVendorDO()
+ .setId(id)
+ .setStatus(MesWmReturnVendorStatusEnum.APPROVING.getStatus())
+ .setProcessDefinitionKey(processDefinitionKey)
+ .setProcessInstanceId(""));
+ return;
+ }
+
+ // 3. 鍒涘缓 BPM 娴佺▼瀹炰緥锛涙祦绋嬫湭鍙戝竷鏃剁粰鍑烘槑纭彁绀�
+ String processInstanceId;
+ try {
+ processInstanceId = processInstanceApi.createProcessInstance(getCurrentUserId(),
+ new BpmProcessInstanceCreateReqDTO()
+ .setProcessDefinitionKey(processDefinitionKey)
+ .setBusinessKey(String.valueOf(id)));
+ } catch (ServiceException ex) {
+ if (cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_DEFINITION_NOT_EXISTS
+ .getCode().equals(ex.getCode())) {
+ throw exception(WM_RETURN_VENDOR_APPROVE_PROCESS_NOT_PUBLISHED, processDefinitionKey);
+ }
+ throw ex;
+ }
+
+ // 4. 鏇存柊閫�璐у崟鐘舵�佷负瀹℃壒涓�
+ returnVendorMapper.updateById(new MesWmReturnVendorDO()
+ .setId(id)
+ .setStatus(MesWmReturnVendorStatusEnum.BPM_APPROVING.getStatus())
+ .setProcessDefinitionKey(processDefinitionKey)
+ .setProcessInstanceId(processInstanceId));
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void updateReturnVendorAuditStatus(Long id, Integer bpmResult) {
+ // 1. 鏍¢獙瀛樺湪 + 瀹℃壒涓�
+ MesWmReturnVendorDO returnVendor = validateReturnVendorExists(id);
+ if (!MesWmReturnVendorStatusEnum.BPM_APPROVING.getStatus().equals(returnVendor.getStatus())) {
+ return;
+ }
+
+ // 2. 鏍规嵁瀹℃壒缁撴灉鏇存柊鐘舵�侊細閫氳繃 -> 寰呮嫞璐э紱椹冲洖 -> 鑽夌锛涘彇娑� -> 宸插彇娑�
+ Integer newStatus = convertBpmResultToReturnVendorStatus(bpmResult);
+ if (newStatus != null) {
+ returnVendorMapper.updateById(new MesWmReturnVendorDO().setId(id).setStatus(newStatus));
+ }
+ }
+
+ /**
+ * 杞崲 BPM 瀹℃壒缁撴灉涓轰緵搴斿晢閫�璐у崟鐘舵��
+ */
+ private Integer convertBpmResultToReturnVendorStatus(Integer bpmResult) {
+ if (cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceStatusEnum.APPROVE.getStatus().equals(bpmResult)) {
+ return MesWmReturnVendorStatusEnum.APPROVING.getStatus();
+ }
+ if (cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceStatusEnum.REJECT.getStatus().equals(bpmResult)) {
+ return MesWmReturnVendorStatusEnum.PREPARE.getStatus();
+ }
+ if (cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceStatusEnum.CANCEL.getStatus().equals(bpmResult)) {
+ return MesWmReturnVendorStatusEnum.CANCELED.getStatus();
+ }
+ return null;
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
public void stockReturnVendor(Long id) {
// 鏍¢獙瀛樺湪
MesWmReturnVendorDO returnVendor = validateReturnVendorExists(id);
@@ -186,12 +298,184 @@
throw exception(WM_RETURN_VENDOR_NO_DETAIL);
}
+ // 1.3 鏍¢獙澶勭悊鏂瑰紡锛堥��娆� / 鎹㈣揣锛�
+ if (!MesWmReturnVendorHandleTypeEnum.isValid(returnVendor.getHandleType())) {
+ throw exception(WM_RETURN_VENDOR_HANDLE_TYPE_INVALID, returnVendor.getHandleType());
+ }
+
// 2. 閬嶅巻鎵�鏈夋槑缁嗭紝鍒涘缓搴撳瓨浜嬪姟锛堟墸鍑忓簱瀛� + 璁板綍娴佹按锛�
createTransactionList(returnVendor, details);
- // 3. 鏇存柊閫�璐у崟鐘舵��
+ // 3. 鍥炲啓閲囪喘璁㈠崟琛岀殑宸查��璐ф暟閲忥紙鎸夌墿鏂欏尮閰嶉噰璐鍗曟槑缁嗭級
+ writeBackPurchaseOrderReturnCount(returnVendor);
+
+ // 4. 鍏堢疆涓哄凡瀹屾垚锛屼繚璇侀噸澶嶈皟鐢ㄤ細琚姸鎬佹牎楠屾嫤鎴紙骞傜瓑锛�
returnVendorMapper.updateById(new MesWmReturnVendorDO()
.setId(id).setStatus(MesWmReturnVendorStatusEnum.FINISHED.getStatus()));
+
+ // 5. 璐圭敤澶勭悊锛氶��娆� -> 璐熸暟鍐茬孩浠樻鍗曪紱鎹㈣揣 -> 鎹㈣揣鍒拌揣閫氱煡鍗曪紙閲嶆柊鍏ュ簱 + 閲嶆柊璐ㄦ锛�
+ if (MesWmReturnVendorHandleTypeEnum.REFUND.getType().equals(returnVendor.getHandleType())) {
+ createRedFlushPayment(id);
+ } else if (MesWmReturnVendorHandleTypeEnum.REPLACEMENT.getType().equals(returnVendor.getHandleType())) {
+ createReplacementNotice(id);
+ }
+ }
+
+ /**
+ * 鎶婇��璐ф暟閲忓閲忓洖鍐欏埌鍏宠仈閲囪喘璁㈠崟鐨勬槑缁嗚锛屽苟鍚屾璁㈠崟绾ч��璐ф暟閲�
+ */
+ private void writeBackPurchaseOrderReturnCount(MesWmReturnVendorDO returnVendor) {
+ if (returnVendor.getPurchaseOrderId() == null) {
+ return;
+ }
+ List<MesWmReturnVendorLineDO> lines = returnVendorLineService.getReturnVendorLineListByReturnId(returnVendor.getId());
+ if (CollUtil.isEmpty(lines)) {
+ return;
+ }
+ List<ErpPurchaseOrderItemRespDTO> orderItems = purchaseOrderApi
+ .getPurchaseOrderItemList(returnVendor.getPurchaseOrderId()).getCheckedData();
+ if (CollUtil.isEmpty(orderItems)) {
+ return;
+ }
+ Map<Long, Long> purchaseOrderItemIdMap = new HashMap<>();
+ orderItems.stream()
+ .filter(item -> item.getProductId() != null)
+ .forEach(item -> purchaseOrderItemIdMap.putIfAbsent(item.getProductId(), item.getId()));
+ for (MesWmReturnVendorLineDO line : lines) {
+ Long purchaseOrderItemId = purchaseOrderItemIdMap.get(line.getItemId());
+ if (purchaseOrderItemId == null || line.getQuantity() == null) {
+ continue;
+ }
+ purchaseOrderApi.updateOrderItemReturnCount(purchaseOrderItemId, line.getQuantity());
+ }
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public Long createRedFlushPayment(Long id) {
+ // 1. 鏍¢獙瀛樺湪 + 宸插畬鎴� + 澶勭悊鏂瑰紡涓洪��娆�
+ MesWmReturnVendorDO returnVendor = validateReturnVendorFinished(id);
+ if (!MesWmReturnVendorHandleTypeEnum.REFUND.getType().equals(returnVendor.getHandleType())) {
+ throw exception(WM_RETURN_VENDOR_HANDLE_TYPE_INVALID, returnVendor.getHandleType());
+ }
+ // 2. 骞傜瓑锛氬凡鐢熸垚杩囧啿绾㈠崟鐩存帴杩斿洖
+ if (returnVendor.getRedFlushPaymentId() != null) {
+ return returnVendor.getRedFlushPaymentId();
+ }
+ // 3. 璁$畻閫�娆鹃噾棰濓紙鏈~鍐欐椂鎸夐噰璐崟浠� 脳 閫�璐ф暟閲忥級
+ BigDecimal refundAmount = resolveRefundAmount(returnVendor);
+
+ // 4. 鐢熸垚璐熸暟鍐茬孩浠樻鍗�
+ Long paymentId = financePaymentApi.createRedFlushPayment(new ErpFinancePaymentRedFlushCreateReqDTO()
+ .setSupplierId(returnVendor.getVendorId())
+ .setRefundAmount(refundAmount)
+ .setSourceId(returnVendor.getId())
+ .setSourceNo(returnVendor.getCode())
+ .setFinanceUserId(getCurrentUserId())
+ .setRemark("渚涘簲鍟嗛��璐у崟[" + returnVendor.getCode() + "]閫�娆惧啿绾紝鍚堝悓鍙穂" + returnVendor.getContractNo() + "]"))
+ .getCheckedData();
+
+ // 5. 鍥炲啓鍐茬孩鍗曞彿涓庢渶缁堥��娆鹃噾棰�
+ returnVendorMapper.updateById(new MesWmReturnVendorDO()
+ .setId(id).setRefundAmount(refundAmount).setRedFlushPaymentId(paymentId));
+ return paymentId;
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public Long createReplacementNotice(Long id) {
+ // 1. 鏍¢獙瀛樺湪 + 宸插畬鎴� + 澶勭悊鏂瑰紡涓烘崲璐�
+ MesWmReturnVendorDO returnVendor = validateReturnVendorFinished(id);
+ if (!MesWmReturnVendorHandleTypeEnum.REPLACEMENT.getType().equals(returnVendor.getHandleType())) {
+ throw exception(WM_RETURN_VENDOR_HANDLE_TYPE_INVALID, returnVendor.getHandleType());
+ }
+ // 2. 骞傜瓑锛氬凡鐢熸垚杩囨崲璐у埌璐у崟鐩存帴杩斿洖
+ if (returnVendor.getReplacementNoticeId() != null) {
+ return returnVendor.getReplacementNoticeId();
+ }
+
+ // 3. 鐢熸垚鎹㈣揣鍒拌揣閫氱煡鍗曪紙寰呰川妫�锛岃鑷姩鍒涘缓 IQC锛�
+ Long noticeId = arrivalNoticeService.createReplacementArrivalNotice(id);
+
+ // 4. 鍥炲啓鍒拌揣閫氱煡鍗曠紪鍙�
+ returnVendorMapper.updateById(new MesWmReturnVendorDO()
+ .setId(id).setReplacementNoticeId(noticeId));
+ return noticeId;
+ }
+
+ /**
+ * 瑙f瀽閫�娆鹃噾棰濓細浼樺厛鍙栧崟鎹~鍐欏�硷紱鏈~鍐欐椂鎸夈�岄噰璐崟浠� 脳 閫�璐ф暟閲忋�嶉�愯绱姞
+ */
+ private BigDecimal resolveRefundAmount(MesWmReturnVendorDO returnVendor) {
+ if (returnVendor.getRefundAmount() != null
+ && returnVendor.getRefundAmount().compareTo(BigDecimal.ZERO) > 0) {
+ return returnVendor.getRefundAmount();
+ }
+ if (returnVendor.getPurchaseOrderId() == null) {
+ throw exception(WM_RETURN_VENDOR_REFUND_AMOUNT_REQUIRED,
+ returnVendor.getCode(), "鏈叧鑱旈噰璐鍗�");
+ }
+ List<ErpPurchaseOrderItemRespDTO> orderItems = purchaseOrderApi
+ .getPurchaseOrderItemList(returnVendor.getPurchaseOrderId()).getCheckedData();
+ Map<Long, BigDecimal> priceMap = new HashMap<>();
+ if (CollUtil.isNotEmpty(orderItems)) {
+ orderItems.stream().filter(item -> item.getProductId() != null)
+ .forEach(item -> priceMap.putIfAbsent(item.getProductId(), item.getProductPrice()));
+ }
+ List<MesWmReturnVendorLineDO> lines = returnVendorLineService.getReturnVendorLineListByReturnId(returnVendor.getId());
+ if (CollUtil.isEmpty(lines)) {
+ throw exception(WM_RETURN_VENDOR_NO_LINE);
+ }
+ BigDecimal total = BigDecimal.ZERO;
+ for (MesWmReturnVendorLineDO line : lines) {
+ BigDecimal price = priceMap.get(line.getItemId());
+ if (price == null) {
+ throw exception(WM_RETURN_VENDOR_REFUND_AMOUNT_REQUIRED,
+ returnVendor.getCode(), "鐗╂枡ID=" + line.getItemId() + " 鏈尮閰嶅埌閲囪喘鍗曚环");
+ }
+ BigDecimal quantity = line.getQuantity() != null ? line.getQuantity() : BigDecimal.ZERO;
+ total = total.add(price.multiply(quantity));
+ }
+ if (total.compareTo(BigDecimal.ZERO) <= 0) {
+ throw exception(WM_RETURN_VENDOR_REFUND_AMOUNT_REQUIRED,
+ returnVendor.getCode(), "閲囪喘鍗曚环 脳 閫�璐ф暟閲忓悎璁′负 0");
+ }
+ return total;
+ }
+
+ /**
+ * 鏍¢獙閫�璐у崟瀛樺湪涓斿凡瀹屾垚锛堣垂鐢ㄧ被鎿嶄綔浠呭湪瀹屾垚鍚庨��璐у崟涓婃墽琛岋級
+ */
+ private MesWmReturnVendorDO validateReturnVendorFinished(Long id) {
+ MesWmReturnVendorDO returnVendor = validateReturnVendorExists(id);
+ if (!MesWmReturnVendorStatusEnum.FINISHED.getStatus().equals(returnVendor.getStatus())) {
+ throw exception(WM_RETURN_VENDOR_FINISHED_REQUIRED, returnVendor.getCode(),
+ resolveStatusName(returnVendor.getStatus()));
+ }
+ return returnVendor;
+ }
+
+ /**
+ * 鐘舵�佸�艰浆鍚嶇О锛岃В鏋愬け璐ュ洖閫�涓� ID 瀛楃涓�
+ */
+ private String resolveStatusName(Integer status) {
+ for (MesWmReturnVendorStatusEnum value : MesWmReturnVendorStatusEnum.values()) {
+ if (value.getStatus().equals(status)) {
+ return value.getName();
+ }
+ }
+ return "ID=" + status;
+ }
+
+ /**
+ * 鑾峰彇褰撳墠鐢ㄦ埛缂栧彿锛圔PM 娴佺▼鍙戣捣浜恒�佽储鍔′汉鍛橈級
+ */
+ private Long getCurrentUserId() {
+ Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+ if (authentication != null && authentication.getPrincipal() instanceof Long) {
+ return (Long) authentication.getPrincipal();
+ }
+ return null;
}
private void createTransactionList(MesWmReturnVendorDO returnVendor, List<MesWmReturnVendorDetailDO> details) {
--
Gitblit v1.9.3