tuqin
5 天以前 af0d2a46cd8a995c0f5b2d7f3cfc0ea8aeb69fdd
feat(srm): 北方科技供应商准入改为免协同审批

需求:采购供应商准入不再走协同审批,提交即生效。

原流程:准入申请提交 → 弹窗选协同办公流程 → 采购/质量/财务三级审批
→ 通过后才生成供应商。

改动:
1. BpmProcessInstanceApi 新增 isAutoApprove(processDefinitionKey)
原来只暴露 isGlobalAutoApprove(),业务模块无法单独对某个流程免审批。
2. BpmProcessInstanceApiImpl 实现该方法,委托给
BpmProcessAutoApproveService.isAutoApprove(判定规则:全局开 || 该流程开)。
3. BpmProcessAutoApproveController 的 /ui-policy 支持可选 key 参数:
不传返回全局开关(保持原行为,兼容其他调用方);
传 key 返回该流程的最终策略,供业务页面精确判断。
4. SrmSupplierApplyServiceImpl.submitApply 改用 isAutoApprove(processDefinitionKey),
命中免审批则直接置审批通过并生成供应商,不再创建 BPM 流程实例。
5. 前端 audit-policy.ts 新增 isAutoApproveByKey(key),
supplierApply 页提交时按流程 key 判断,免审批则跳过「选择审批流程」弹窗。
6. SQL 配置:bpm_process_auto_approve_config 增加
supplier_apply_approve = 1(仅该流程免审批,全局总开关保持关闭,
不影响请假、报销等其他流程)。

恢复审批方式(无需改代码):
UPDATE bpm_process_auto_approve_config SET auto_approve = b'0'
WHERE process_definition_key = 'supplier_apply_approve';

已验证:/bpm/process-auto-approve/ui-policy?key=supplier_apply_approve 返回 true,
全局开关仍为 false。
已添加1个文件
已修改4个文件
70 ■■■■■ 文件已修改
sql/mysql/bfkj_supplier_apply_auto_approve.sql 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/api/task/BpmProcessInstanceApi.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/api/task/BpmProcessInstanceApiImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessAutoApproveController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/service/apply/SrmSupplierApplyServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/mysql/bfkj_supplier_apply_auto_approve.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
-- =====================================================================
-- åŒ—方科技:供应商准入改为「不走协同审批」
--
-- èƒŒæ™¯ï¼š
--   åŽŸæµç¨‹æ˜¯ã€Œå‡†å…¥ç”³è¯· â†’ æäº¤ â†’ é€‰ååŒåŠžå…¬å®¡æ‰¹æµç¨‹ â†’ é‡‡è´­/质量/财务三级审批
--   â†’ é€šè¿‡åŽæ‰ç”Ÿæˆä¾›åº”商」。客户要求准入不再走协同审批。
--
-- å®žçŽ°ï¼š
--   BPM å…å®¡æ‰¹é…ç½®è¡¨é‡Œæ”¯æŒã€Œå…¨å±€æ€»å¼€å…³ã€ä¸Žã€ŒæŒ‰æµç¨‹å•独开关」两种粒度,
--   åŽç«¯ submitApply å·²æ”¹ä¸ºç”¨ isAutoApprove(processDefinitionKey) åˆ¤æ–­ï¼Œ
--   è¿™é‡Œåªæ‰“开供应商准入这一个流程的免审批,不影响请假、报销等其他流程。
--
-- æ•ˆæžœï¼š
--   å‡†å…¥ç”³è¯·ç‚¹ã€Œæäº¤ã€åŽç«‹å³ç”Ÿæ•ˆï¼ˆå®¡æ‰¹çŠ¶æ€ç›´æŽ¥ç½®ä¸ºé€šè¿‡ï¼ŒåŒæ—¶ç”Ÿæˆä¾›åº”å•†ï¼‰ï¼Œ
--   ä¸å†å¼¹å‡ºã€Œé€‰æ‹©å®¡æ‰¹æµç¨‹ã€çš„窗口,也不再产生流程实例。
--
-- å¦‚需恢复审批:
--   UPDATE bpm_process_auto_approve_config SET auto_approve = b'0'
--   WHERE process_definition_key = 'supplier_apply_approve';
--
-- ç‰¹æ€§ï¼šå¯é‡å¤æ‰§è¡Œ
-- =====================================================================
DELETE FROM bpm_process_auto_approve_config
WHERE process_definition_key = 'supplier_apply_approve';
INSERT INTO bpm_process_auto_approve_config
    (process_definition_key, auto_approve, remark,
     creator, create_time, updater, update_time, deleted)
VALUES
    ('supplier_apply_approve', b'1', '北方科技:供应商准入不走协同审批,提交即生效',
     '1', NOW(), '1', NOW(), b'0');
-- éªŒè¯
SELECT id, process_definition_key, auto_approve, remark
FROM bpm_process_auto_approve_config
WHERE deleted = b'0';
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/api/task/BpmProcessInstanceApi.java
@@ -16,6 +16,17 @@
    boolean isGlobalAutoApprove();
    /**
     * æŒ‡å®šæµç¨‹æ˜¯å¦å…å®¡æ‰¹ã€‚
     *
     * åˆ¤å®šè§„则:全局总开关开启 â†’ ä¸€å¾‹å…å®¡æ‰¹ï¼›å¦åˆ™çœ‹è¯¥æµç¨‹è‡ªå·±çš„开关。
     * ä¸šåŠ¡æ¨¡å—åº”ä¼˜å…ˆç”¨æœ¬æ–¹æ³•åˆ¤æ–­ï¼Œè¿™æ ·æ—¢èƒ½å—å…¨å±€å¼€å…³ç»Ÿä¸€æŽ§åˆ¶ï¼Œ
     * ä¹Ÿèƒ½åªå¯¹ä¸ªåˆ«æµç¨‹å•独开启免审批(例如供应商准入不走协同审批)。
     *
     * @param processDefinitionKey æµç¨‹å®šä¹‰ Key,如 supplier_apply_approve
     */
    boolean isAutoApprove(String processDefinitionKey);
    /**
     * åˆ›å»ºæµç¨‹å®žä¾‹ï¼ˆæä¾›ç»™å†…部)
     *
     * @param userId ç”¨æˆ·ç¼–号
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/api/task/BpmProcessInstanceApiImpl.java
@@ -30,6 +30,11 @@
    }
    @Override
    public boolean isAutoApprove(String processDefinitionKey) {
        return processAutoApproveService.isAutoApprove(processDefinitionKey);
    }
    @Override
    public String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqDTO reqDTO) {
        return processInstanceService.createProcessInstance(userId, reqDTO);
    }
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessAutoApproveController.java
@@ -72,9 +72,15 @@
    }
    @GetMapping("/ui-policy")
    @Operation(summary = "获得当前登录用户的审核界面策略")
    @Operation(summary = "获得当前登录用户的审核界面策略",
            description = "不传 key è¿”回全局总开关;传 key åˆ™è¿”回该流程的最终策略(全局开或该流程开都为 true)")
    @Parameter(name = "key", description = "流程定义 Key,如 supplier_apply_approve", example = "supplier_apply_approve")
    @PreAuthorize("isAuthenticated()")
    public CommonResult<Boolean> getUiPolicy() {
    public CommonResult<Boolean> getUiPolicy(@RequestParam(value = "key", required = false) String key) {
        // ä¼ å…¥æµç¨‹ key æ—¶æŒ‰ã€Œå…¨å±€ || è¯¥æµç¨‹ã€åˆ¤å®šï¼Œä¾¿äºŽä¸šåŠ¡é¡µé¢åªå¯¹è‡ªå·±å…³å¿ƒçš„æµç¨‹æ”¾å¼€å…å®¡æ‰¹
        if (key != null && !key.isBlank()) {
            return success(processAutoApproveService.isAutoApprove(key));
        }
        return success(processAutoApproveService.isGlobalAutoApprove());
    }
yudao-module-srm/src/main/java/cn/iocoder/yudao/module/srm/service/apply/SrmSupplierApplyServiceImpl.java
@@ -133,9 +133,10 @@
                && !SupplierApplyStatusEnum.REJECTED.getCode().equals(apply.getApplyStatus())) {
            throw ServiceExceptionUtil.exception(ErrorCodeConstants.APPLY_STATUS_NOT_DRAFT);
        }
        // 2. åˆ›å»º BPM æµç¨‹å®žä¾‹ï¼ˆé‡‡è´­å®¡æ ¸â†’质量审核→财务审核,流程与审批人在协同办公配置)
        // å…¨å±€å…å®¡æ‰¹ï¼šä¸šåŠ¡æ ¡éªŒé€šè¿‡åŽç›´æŽ¥æ‰§è¡Œå®¡æ‰¹é€šè¿‡é€»è¾‘ï¼Œæ— éœ€æµç¨‹æ¨¡åž‹ã€‚
        if (processInstanceApi.isGlobalAutoApprove()) {
        // 2. ä¾›åº”商准入不走协同审批:判断该流程是否配置了免审批
        //    ï¼ˆå…¨å±€æ€»å¼€å…³å¼€å¯ä¹Ÿç®—),命中则直接执行审批通过逻辑,不再创建 BPM æµç¨‹å®žä¾‹ã€‚
        //    å¦‚需恢复审批,把配置表里 supplier_apply_approve æ”¹ä¸º 0 å³å¯ï¼Œæ— éœ€æ”¹ä»£ç ã€‚
        if (processInstanceApi.isAutoApprove(processDefinitionKey)) {
            supplierApplyMapper.updateById(new SrmSupplierApplyDO()
                    .setId(id)
                    .setApplyStatus(SupplierApplyStatusEnum.PROCESS.getCode())