liu
5 天以前 8ad99e5f72085d14fd56e8faa7aa36701823c8b5
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/quotation/CrmSaleQuotationServiceImpl.java
@@ -22,8 +22,10 @@
import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService;
import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO;
import cn.iocoder.yudao.module.system.api.storage.StorageAttachmentApi;
import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi;
import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -40,7 +42,7 @@
/**
 * CRM 销售报价单 Service 实现类
 *
 * @author 芋道源码
 * @author 超级管理员
 */
@Service
@Validated
@@ -66,6 +68,8 @@
    private CrmContactService contactService;
    @Resource
    private CrmPermissionService permissionService;
    @Resource
    private StorageAttachmentApi storageAttachmentApi;
    @Resource
    private CrmContractService contractService;
@@ -97,6 +101,8 @@
                .setBizType(CrmBizTypeEnum.CRM_SALE_QUOTATION.getType())
                .setBizId(saleQuotation.getId())
                .setLevel(CrmPermissionLevelEnum.OWNER.getLevel()));
        storageAttachmentApi.bindAttachments("file", "crm_sale_quotation",
                saleQuotation.getId(), createReqVO.getBlobIds());
        return saleQuotation.getId();
    }
@@ -120,6 +126,7 @@
        saleQuotationMapper.updateById(updateObj);
        // 2.2 更新报价明细
        updateQuotationProductList(updateReqVO.getId(), quotationProducts);
        storageAttachmentApi.updateAttachments("file", "crm_sale_quotation", updateReqVO.getId(), updateReqVO.getBlobIds());
    }
    @Override
@@ -138,6 +145,8 @@
        // 2. 遍历删除
        saleQuotations.forEach(saleQuotation -> {
            // 2.0 删除附件关联
            storageAttachmentApi.deleteAttachmentsByRecord("crm_sale_quotation", saleQuotation.getId());
            // 2.1 删除报价单
            saleQuotationMapper.deleteById(saleQuotation.getId());
            // 2.2 删除报价明细
@@ -229,7 +238,9 @@
    @Override
    public PageResult<CrmSaleQuotationDO> getSaleQuotationPage(CrmSaleQuotationPageReqVO pageReqVO, Long userId) {
        return saleQuotationMapper.selectPage(pageReqVO, userId);
        // 可见性完全由 appendPermissionCondition 控制(报价团队 ∪ 客户团队),
        // 不再额外按「有权限的客户」过滤,避免不在客户团队、但属于报价负责人/报价团队的用户被错误过滤
        return saleQuotationMapper.selectPage(pageReqVO, userId, null);
    }
    @Override
@@ -271,6 +282,16 @@
        // 2. 获取报价明细
        List<CrmSaleQuotationProductDO> quotationProducts = saleQuotationProductMapper.selectListByQuotationId(id);
        // 合同明细使用整数数量,禁止截断小数或溢出后生成错误订单。
        for (CrmSaleQuotationProductDO product : quotationProducts) {
            try {
                if (product.getCount() == null || product.getCount().intValueExact() <= 0) {
                    throw exception(SALE_QUOTATION_CONVERT_INVALID_COUNT);
                }
            } catch (ArithmeticException ex) {
                throw exception(SALE_QUOTATION_CONVERT_INVALID_COUNT);
            }
        }
        // 3. 构建合同创建 VO
        CrmContractSaveReqVO contractVO = new CrmContractSaveReqVO();
        contractVO.setName(saleQuotation.getName() + "-合同");
@@ -305,4 +326,14 @@
        return contractId;
    }
    @Override
    public CrmSaleQuotationDO getByContractId(Long id) {
        return saleQuotationMapper.selectOne(new LambdaQueryWrapper<CrmSaleQuotationDO>().eq(CrmSaleQuotationDO::getContractId,id));
    }
    @Override
    public void clearContractReference(Long quotationId) {
        saleQuotationMapper.clearContractReference(quotationId);
    }
}