liu
5 天以前 8ad99e5f72085d14fd56e8faa7aa36701823c8b5
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/quotation/CrmSaleQuotationServiceImpl.java
@@ -20,12 +20,12 @@
import cn.iocoder.yudao.module.crm.service.contact.CrmContactService;
import cn.iocoder.yudao.module.crm.service.contract.CrmContractService;
import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService;
import cn.iocoder.yudao.module.crm.api.customer.CrmCustomerApi;
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;
@@ -42,7 +42,7 @@
/**
 * CRM 销售报价单 Service 实现类
 *
 * @author 芋道源码
 * @author 超级管理员
 */
@Service
@Validated
@@ -62,8 +62,6 @@
    @Resource
    private CrmCustomerService customerService;
    @Resource
    private CrmCustomerApi customerApi;
    @Resource
    private CrmBusinessService businessService;
    @Resource
@@ -240,9 +238,9 @@
    @Override
    public PageResult<CrmSaleQuotationDO> getSaleQuotationPage(CrmSaleQuotationPageReqVO pageReqVO, Long userId) {
        // 获取用户有权限的客户 ID 列表
        List<Long> permittedCustomerIds = customerApi.getPermittedCustomerIds();
        return saleQuotationMapper.selectPage(pageReqVO, userId, permittedCustomerIds);
        // 可见性完全由 appendPermissionCondition 控制(报价团队 ∪ 客户团队),
        // 不再额外按「有权限的客户」过滤,避免不在客户团队、但属于报价负责人/报价团队的用户被错误过滤
        return saleQuotationMapper.selectPage(pageReqVO, userId, null);
    }
    @Override
@@ -284,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() + "-合同");
@@ -318,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);
    }
}