6 小时以前 086b2186789ea04362db4bce71c6112686c43caa
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java
@@ -150,10 +150,15 @@
        List<CrmContractProductDO> contractProducts = validateContractProducts(createReqVO.getProducts());
        // 1.2 校验关联字段
        validateRelationDataExists(createReqVO);
        // 1.3 生成序号
        String no = noRedisDAO.generate(CrmNoRedisDAO.CONTRACT_NO_PREFIX);
        if (contractMapper.selectByNo(no) != null) {
            throw exception(CONTRACT_NO_EXISTS);
        // 1.3 生成或校验合同编号:支持自定义编号,未填写时自动生成
        String no = StrUtil.trimToNull(createReqVO.getNo());
        if (no == null) {
            no = noRedisDAO.generate(CrmNoRedisDAO.CONTRACT_NO_PREFIX);
            if (contractMapper.selectByNo(no) != null) {
                throw exception(CONTRACT_NO_EXISTS);
            }
        } else if (contractMapper.selectByNo(no) != null) {
            throw exception(CONTRACT_NO_DUPLICATE, no);
        }
        // 2.1 插入合同
@@ -188,14 +193,26 @@
        updateReqVO.setOwnerUserId(null); // 不允许更新的字段
        // 1.1 校验存在
        CrmContractDO oldContract = validateContractExists(updateReqVO.getId());
        // 1.2 只有草稿、审批中,可以编辑;
        // 1.2 合同编号:留空则保持原编号,填写则校验唯一性(排除自身)
        //     留空时回填原编号而非置空,避免操作日志 diff 出现“编号被清空”
        String no = StrUtil.trimToNull(updateReqVO.getNo());
        if (no == null) {
            no = oldContract.getNo();
        } else {
            CrmContractDO noContract = contractMapper.selectByNo(no);
            if (noContract != null && !ObjUtil.equal(noContract.getId(), updateReqVO.getId())) {
                throw exception(CONTRACT_NO_DUPLICATE, no);
            }
        }
        updateReqVO.setNo(no);
        // 1.3 只有草稿、审批中,可以编辑;
        if (!ObjectUtils.equalsAny(oldContract.getAuditStatus(), CrmAuditStatusEnum.DRAFT.getStatus(),
                CrmAuditStatusEnum.PROCESS.getStatus())) {
            throw exception(CONTRACT_UPDATE_FAIL_NOT_DRAFT);
        }
        // 1.3 校验产品项的有效性
        // 1.4 校验产品项的有效性
        List<CrmContractProductDO> contractProducts = validateContractProducts(updateReqVO.getProducts());
        // 1.4 校验关联字段
        // 1.5 校验关联字段
        validateRelationDataExists(updateReqVO);
        // 2.1 更新合同