云
4 天以前 ccdebc5369c108e6616550bfbe1cd47ec1e05813
yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/service/inquiry/SrmInquiryServiceImpl.java
@@ -7,6 +7,9 @@
import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceStatusEnum;
import cn.iocoder.yudao.module.erp.api.purchase.ErpPurchaseOrderApi;
import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderCreateReqDTO;
import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderRespDTO;
@@ -48,6 +51,8 @@
    @Resource
    private SrmInquiryMapper inquiryMapper;
    @Resource
    private BpmProcessInstanceApi processInstanceApi;
    @Resource
    private SrmInquiryItemMapper inquiryItemMapper;
    @Resource
@@ -91,8 +96,9 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateInquiry(SrmInquirySaveReqVO updateReqVO) {
        SrmInquiryDO inquiry = validateInquiryExists(updateReqVO.getId());
        if (!InquiryStatusEnum.DRAFT.getStatus().equals(inquiry.getStatus())) {
        SrmInquiryDO inquiry = validateInquiryForUpdate(updateReqVO.getId());
        if (!InquiryStatusEnum.DRAFT.getStatus().equals(inquiry.getStatus())
                && !InquiryStatusEnum.REJECTED.getStatus().equals(inquiry.getStatus())) {
            throw new ServiceException(ErrorCodeConstants.INQUIRY_STATUS_NOT_EDITABLE.getCode(),
                    "询价单【" + inquiry.getNo() + "】当前状态为【" + statusName(inquiry.getStatus())
                            + "】,仅草稿状态可编辑。如需调整产品行或供应商,请取消后重新创建询价单。");
@@ -123,7 +129,7 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void deleteInquiry(Long id) {
        SrmInquiryDO inquiry = validateInquiryExists(id);
        SrmInquiryDO inquiry = validateInquiryForUpdate(id);
        if (!InquiryStatusEnum.DRAFT.getStatus().equals(inquiry.getStatus())) {
            throw new ServiceException(ErrorCodeConstants.INQUIRY_STATUS_NOT_EDITABLE.getCode(),
                    "询价单【" + inquiry.getNo() + "】当前状态为【" + statusName(inquiry.getStatus())
@@ -161,8 +167,52 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void submitApproval(Long id, Long userId) {
        SrmInquiryDO inquiry = validateInquiryForUpdate(id);
        if (!InquiryStatusEnum.DRAFT.getStatus().equals(inquiry.getStatus())
                && !InquiryStatusEnum.QUOTING.getStatus().equals(inquiry.getStatus())
                && !InquiryStatusEnum.REJECTED.getStatus().equals(inquiry.getStatus())) {
            throw new ServiceException(ErrorCodeConstants.INQUIRY_STATUS_NOT_CONFIRMABLE.getCode(), "当前状态不可提交审核");
        }
        List<SrmInquiryItemDO> items = inquiryItemMapper.selectListByInquiryId(id);
        if (CollUtil.isEmpty(items)) throw ServiceExceptionUtil.exception(ErrorCodeConstants.INQUIRY_ITEM_EMPTY);
        Map<Long, SrmInquiryQuoteDO> quotes = inquiryQuoteMapper.selectListByInquiryId(id).stream()
                .collect(Collectors.toMap(SrmInquiryQuoteDO::getId, Function.identity()));
        Set<Long> suppliers = inquirySupplierMapper.selectListByInquiryId(id).stream()
                .map(SrmInquirySupplierDO::getSupplierId).collect(Collectors.toSet());
        for (SrmInquiryItemDO item : items) {
            SrmInquiryQuoteDO quote = quotes.get(item.getSelectedQuoteId());
            if (quote == null || !item.getId().equals(quote.getInquiryItemId())
                    || !suppliers.contains(quote.getSupplierId()) || quote.getPrice() == null
                    || quote.getPrice().compareTo(BigDecimal.ZERO) <= 0) {
                throw new ServiceException(ErrorCodeConstants.INQUIRY_WINNER_REQUIRED.getCode(), "请先为每个产品选择有效的中标报价");
            }
            inquiryItemMapper.updateById(new SrmInquiryItemDO().setId(item.getId())
                    .setSelectedSupplierId(quote.getSupplierId()).setSelectedPrice(quote.getPrice()));
        }
        inquiryMapper.updateById(new SrmInquiryDO().setId(id).setStatus(InquiryStatusEnum.APPROVING.getStatus()).setProcessInstanceId(""));
        String processId = processInstanceApi.createProcessInstance(userId, new BpmProcessInstanceCreateReqDTO()
                .setProcessDefinitionKey("srm_inquiry_approve").setBusinessKey(String.valueOf(id))
                .setVariables(Map.of("inquiryNo", inquiry.getNo(), "inquiryTitle", inquiry.getTitle())));
        inquiryMapper.updateById(new SrmInquiryDO().setId(id).setProcessInstanceId(processId));
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateApprovalStatus(Long id, String processInstanceId, Integer status) {
        SrmInquiryDO inquiry = validateInquiryForUpdate(id);
        if (!InquiryStatusEnum.APPROVING.getStatus().equals(inquiry.getStatus())
                || (StrUtil.isNotEmpty(inquiry.getProcessInstanceId()) && !Objects.equals(inquiry.getProcessInstanceId(), processInstanceId))) return;
        Integer next = null;
        if (BpmProcessInstanceStatusEnum.APPROVE.getStatus().equals(status)) next = InquiryStatusEnum.APPROVED.getStatus();
        if (BpmProcessInstanceStatusEnum.REJECT.getStatus().equals(status) || BpmProcessInstanceStatusEnum.CANCEL.getStatus().equals(status)) next = InquiryStatusEnum.REJECTED.getStatus();
        if (next != null) inquiryMapper.updateById(new SrmInquiryDO().setId(id).setStatus(next));
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void publishInquiry(Long id) {
        SrmInquiryDO inquiry = validateInquiryExists(id);
        SrmInquiryDO inquiry = validateInquiryForUpdate(id);
        if (!InquiryStatusEnum.DRAFT.getStatus().equals(inquiry.getStatus())) {
            throw new ServiceException(ErrorCodeConstants.INQUIRY_STATUS_NOT_QUOTING.getCode(),
                    "询价单【" + inquiry.getNo() + "】当前状态为【" + statusName(inquiry.getStatus())
@@ -175,9 +225,10 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void cancelInquiry(Long id) {
        SrmInquiryDO inquiry = validateInquiryExists(id);
        SrmInquiryDO inquiry = validateInquiryForUpdate(id);
        if (!InquiryStatusEnum.DRAFT.getStatus().equals(inquiry.getStatus())
                && !InquiryStatusEnum.QUOTING.getStatus().equals(inquiry.getStatus())) {
                && !InquiryStatusEnum.QUOTING.getStatus().equals(inquiry.getStatus())
                && !InquiryStatusEnum.REJECTED.getStatus().equals(inquiry.getStatus())) {
            throw new ServiceException(ErrorCodeConstants.INQUIRY_STATUS_NOT_CANCELLABLE.getCode(),
                    "询价单【" + inquiry.getNo() + "】当前状态为【" + statusName(inquiry.getStatus())
                            + "】,仅草稿或询价中状态可取消。");
@@ -189,9 +240,10 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void saveQuotes(SrmInquiryQuoteSaveReqVO saveReqVO) {
        SrmInquiryDO inquiry = validateInquiryExists(saveReqVO.getInquiryId());
        SrmInquiryDO inquiry = validateInquiryForUpdate(saveReqVO.getInquiryId());
        if (!InquiryStatusEnum.DRAFT.getStatus().equals(inquiry.getStatus())
                && !InquiryStatusEnum.QUOTING.getStatus().equals(inquiry.getStatus())) {
                && !InquiryStatusEnum.QUOTING.getStatus().equals(inquiry.getStatus())
                && !InquiryStatusEnum.REJECTED.getStatus().equals(inquiry.getStatus())) {
            throw new ServiceException(ErrorCodeConstants.INQUIRY_STATUS_NOT_QUOTING.getCode(),
                    "询价单【" + inquiry.getNo() + "】当前状态为【" + statusName(inquiry.getStatus())
                            + "】,仅草稿或询价中状态可录入报价。");
@@ -269,12 +321,12 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public SrmInquiryConfirmRespVO confirmInquiry(SrmInquiryConfirmReqVO confirmReqVO) {
        SrmInquiryDO inquiry = validateInquiryExists(confirmReqVO.getId());
        if (!InquiryStatusEnum.DRAFT.getStatus().equals(inquiry.getStatus())
                && !InquiryStatusEnum.QUOTING.getStatus().equals(inquiry.getStatus())) {
            throw new ServiceException(ErrorCodeConstants.INQUIRY_STATUS_NOT_CONFIRMABLE.getCode(),
                    "询价单【" + inquiry.getNo() + "】当前状态为【" + statusName(inquiry.getStatus())
                            + "】,仅草稿或询价中状态可确认转订单。");
        SrmInquiryDO inquiry = validateInquiryForUpdate(confirmReqVO.getId());
        if (!InquiryStatusEnum.APPROVED.getStatus().equals(inquiry.getStatus())) {
            throw new ServiceException(ErrorCodeConstants.INQUIRY_STATUS_NOT_CONFIRMABLE.getCode(), "询价单审核通过后才能转订单");
        }
        if (CollUtil.isNotEmpty(confirmReqVO.getSelections())) {
            throw new ServiceException(ErrorCodeConstants.INQUIRY_STATUS_NOT_CONFIRMABLE.getCode(), "审核通过后不能更改中标结果");
        }
        List<SrmInquiryItemDO> items = inquiryItemMapper.selectListByInquiryId(inquiry.getId());
        if (CollUtil.isEmpty(items)) {
@@ -647,6 +699,12 @@
    // ========== 校验 ==========
    private SrmInquiryDO validateInquiryForUpdate(Long id) {
        SrmInquiryDO inquiry = inquiryMapper.selectByIdForUpdate(id);
        if (inquiry == null) throw ServiceExceptionUtil.exception(ErrorCodeConstants.INQUIRY_NOT_EXISTS);
        return inquiry;
    }
    private SrmInquiryDO validateInquiryExists(Long id) {
        SrmInquiryDO inquiry = inquiryMapper.selectById(id);
        if (inquiry == null) {