liu
5 天以前 6d1bf32bc0b51dc12048fe6bb70badfbd31d67ac
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java
@@ -33,7 +33,6 @@
import cn.iocoder.yudao.module.crm.framework.permission.core.annotations.CrmPermission;
import cn.iocoder.yudao.module.crm.service.business.CrmBusinessService;
import cn.iocoder.yudao.module.crm.service.contact.CrmContactService;
import cn.iocoder.yudao.module.crm.api.customer.CrmCustomerApi;
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;
@@ -48,6 +47,7 @@
import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderRespDTO;
import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi;
import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO;
import cn.iocoder.yudao.module.mdm.enums.MdmItemTypeEnum;
import cn.iocoder.yudao.module.system.api.approval.ApprovalConfigApi;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
@@ -115,8 +115,6 @@
    @Resource
    private CrmCustomerService customerService;
    @Resource
    private CrmCustomerApi customerApi;
    @Resource
    private CrmBusinessService businessService;
    @Resource
    private CrmContactService contactService;
@@ -170,6 +168,9 @@
        crmPermissionService.createPermission(new CrmPermissionCreateReqBO().setUserId(contract.getOwnerUserId())
                .setBizType(CrmBizTypeEnum.CRM_CONTRACT.getType()).setBizId(contract.getId())
                .setLevel(CrmPermissionLevelEnum.OWNER.getLevel()));
        // 3.1 客户负责人自动拥有该合同的读写权限
        crmPermissionService.createPermissionForCustomerOwner(CrmBizTypeEnum.CRM_CONTRACT.getType(),
                contract.getId(), contract.getCustomerId(), contract.getOwnerUserId());
        // 4. 记录操作日志上下文
        LogRecordContext.putVariable("contract", contract);
@@ -481,10 +482,10 @@
                return PageResult.empty();
            }
        }
        // 2. 获取用户有权限的客户 ID 列表
        List<Long> permittedCustomerIds = customerApi.getPermittedCustomerIds();
        // 3. 查询分页
        return contractMapper.selectPage(pageReqVO, userId, config, permittedCustomerIds);
        // 2. 查询分页
        // 合同可见性完全由 appendPermissionCondition 控制(合同团队 ∪ 客户团队),
        // 不再额外按「有权限的客户」过滤,否则不在客户团队、但属于合同负责人/合同团队的用户会被错误过滤掉
        return contractMapper.selectPage(pageReqVO, userId, config);
    }
    @Override
@@ -584,16 +585,18 @@
        createReqDTO.setRemark("由合同【" + contract.getNo() + "】自动生成");
        // 5. 构建订单项
        Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
                convertSet(contractProducts, CrmContractProductDO::getItemId));
        List<ErpSaleOrderCreateReqDTO.Item> items = contractProducts.stream()
                .map(cp -> {
                    ErpSaleOrderCreateReqDTO.Item item = new ErpSaleOrderCreateReqDTO.Item();
                    item.setProductId(cp.getItemId());
                    item.setProductPrice(cp.getContractPrice());
                    item.setCount(cp.getCount());
                    // 合同产品默认需要生产:订单审批通过后才能自动创建 MPS,
                    // 否则「合同 → 订单 → 生产」链路在合同来源的订单上会断掉。
                    // 若个别产品为外购/转售,可在销售订单明细中把「需要生产」改为否。
                    item.setNeedProduction(1);
                    // 只有产品才进入生产计划;温控等外购物料可随合同进入销售订单,
                    // 但不能创建 MPS,否则会导致整笔销售订单审批回滚。
                    MdmItemRespDTO mdmItem = itemMap.get(cp.getItemId());
                    item.setNeedProduction(mdmItem != null && MdmItemTypeEnum.isProduct(mdmItem.getItemType()) ? 1 : 0);
                    return item;
                })
                .toList();
@@ -728,6 +731,9 @@
            if (!products.isEmpty() || contract.getTotalPrice() == null) calculateTotalPrice(contract, validateContractProducts(products));
            contractMapper.insert(contract);
            crmPermissionService.createPermission(new CrmPermissionCreateReqBO().setBizType(CrmBizTypeEnum.CRM_CONTRACT.getType()).setBizId(contract.getId()).setUserId(ownerId).setLevel(CrmPermissionLevelEnum.OWNER.getLevel()));
            // 客户负责人自动拥有该合同的读写权限
            crmPermissionService.createPermissionForCustomerOwner(CrmBizTypeEnum.CRM_CONTRACT.getType(),
                    contract.getId(), customer.getId(), ownerId);
        } else {
            contract.setId(existing.getId());
            List<CrmContractProductDO> amountDetails = products.isEmpty()