xiaoyi
6 天以前 481d8165f26fc7e37f0e87f6444ac0340bb563a3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
package cn.iocoder.yudao.module.bpm.service.attach;
 
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.bpm.controller.admin.attach.vo.attach.BpmBusinessAttachImportExcelVO;
import cn.iocoder.yudao.module.bpm.controller.admin.attach.vo.attach.BpmBusinessAttachImportReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.attach.vo.attach.BpmBusinessAttachImportRespVO;
import cn.iocoder.yudao.module.bpm.controller.admin.attach.vo.attach.BpmBusinessAttachPageReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.attach.vo.attach.BpmBusinessAttachSaveReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmBusinessAttachDO;
import cn.iocoder.yudao.module.bpm.dal.mysql.attach.BpmBusinessAttachMapper;
import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
 
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Objects;
 
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList;
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.BUSINESS_ATTACH_IMPORT_EXISTS;
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.BUSINESS_ATTACH_IMPORT_LIST_IS_EMPTY;
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.BUSINESS_ATTACH_NOT_EXISTS;
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.BUSINESS_ATTACH_PROCESS_DEFINITION_KEY_DUPLICATE;
 
/**
 * BPM 业务附件配置 Service 实现类
 *
 * @author 超级管理员
 */
@Service
@Validated
public class BpmBusinessAttachServiceImpl implements BpmBusinessAttachService {
 
    @Resource
    private BpmBusinessAttachMapper businessAttachMapper;
 
    @Override
    public Long createBusinessAttach(BpmBusinessAttachSaveReqVO createReqVO) {
        // 校验流程定义 Key 唯一
        validateProcessDefinitionKeyUnique(createReqVO);
        // 插入
        BpmBusinessAttachDO attach = BeanUtils.toBean(createReqVO, BpmBusinessAttachDO.class);
        businessAttachMapper.insert(attach);
        return attach.getId();
    }
 
    @Override
    public void updateBusinessAttach(BpmBusinessAttachSaveReqVO updateReqVO) {
        // 校验存在
        validateBusinessAttachExists(updateReqVO.getId());
        // 校验流程定义 Key 唯一
        validateProcessDefinitionKeyUnique(updateReqVO);
        // 更新
        BpmBusinessAttachDO updateObj = BeanUtils.toBean(updateReqVO, BpmBusinessAttachDO.class);
        businessAttachMapper.updateById(updateObj);
    }
 
    private void validateProcessDefinitionKeyUnique(BpmBusinessAttachSaveReqVO reqVO) {
        BpmBusinessAttachDO attach = businessAttachMapper.selectByProcessDefinitionKey(reqVO.getProcessDefinitionKey());
        if (attach == null || ObjUtil.equal(attach.getId(), reqVO.getId())) {
            return;
        }
        throw exception(BUSINESS_ATTACH_PROCESS_DEFINITION_KEY_DUPLICATE, reqVO.getProcessDefinitionKey());
    }
 
    @Override
    public void deleteBusinessAttach(Long id) {
        // 校验存在
        validateBusinessAttachExists(id);
        // 删除
        businessAttachMapper.deleteById(id);
    }
 
    private BpmBusinessAttachDO validateBusinessAttachExists(Long id) {
        BpmBusinessAttachDO attach = businessAttachMapper.selectById(id);
        if (attach == null) {
            throw exception(BUSINESS_ATTACH_NOT_EXISTS);
        }
        return attach;
    }
 
    @Override
    public BpmBusinessAttachDO getBusinessAttach(Long id) {
        return businessAttachMapper.selectById(id);
    }
 
    @Override
    public PageResult<BpmBusinessAttachDO> getBusinessAttachPage(BpmBusinessAttachPageReqVO pageReqVO) {
        return businessAttachMapper.selectPage(pageReqVO);
    }
 
    @Override
    public BpmBusinessAttachDO getBusinessAttachByProcessDefinitionKey(String processDefinitionKey) {
        return businessAttachMapper.selectByProcessDefinitionKey(processDefinitionKey);
    }
 
    @Override
    public void fillBusinessForm(BpmProcessDefinitionRespVO definitionResp, String processDefinitionKey, String businessKey) {
        // 未发起 / 无业务主键:不注入
        if (definitionResp == null || StrUtil.isBlank(businessKey)) {
            return;
        }
        // 非 NORMAL 流程表单(已手动配置 CUSTOM):不覆盖
        if (!Objects.equals(definitionResp.getFormType(), BpmModelFormTypeEnum.NORMAL.getType())) {
            return;
        }
        // 未命中配置 / 配置被禁用:保持原样
        BpmBusinessAttachDO attach = getBusinessAttachByProcessDefinitionKey(processDefinitionKey);
        if (attach == null || !Objects.equals(attach.getStatus(), CommonStatusEnum.ENABLE.getStatus())) {
            return;
        }
        // 覆盖为 CUSTOM,注入业务详情组件路径
        definitionResp.setFormType(BpmModelFormTypeEnum.CUSTOM.getType());
        definitionResp.setFormCustomViewPath(attach.getComponentPath());
        // 清空普通表单字段:详情页 CUSTOM 分支不读;打印页按 formFields.length == 0 判断渲染业务组件
        definitionResp.setFormFields(null);
        definitionResp.setFormConf(null);
    }
 
    @Override
    @Transactional(rollbackFor = Exception.class)
    public BpmBusinessAttachImportRespVO importBusinessAttachList(List<BpmBusinessAttachImportExcelVO> importBusinessAttaches,
                                                                 BpmBusinessAttachImportReqVO importReqVO) {
        // 1. 校验非空
        importBusinessAttaches = filterList(importBusinessAttaches,
                item -> StrUtil.isNotBlank(item.getProcessDefinitionKey()));
        if (CollUtil.isEmpty(importBusinessAttaches)) {
            throw exception(BUSINESS_ATTACH_IMPORT_LIST_IS_EMPTY);
        }
        // 2. 逐条处理
        BpmBusinessAttachImportRespVO respVO = BpmBusinessAttachImportRespVO.builder()
                .createBusinessAttachKeys(new ArrayList<>())
                .updateBusinessAttachKeys(new ArrayList<>())
                .failureBusinessAttachKeys(new LinkedHashMap<>())
                .build();
        importBusinessAttaches.forEach(importBusinessAttach -> {
            try {
                // 2.1 按流程定义 Key 匹配已存在记录
                BpmBusinessAttachDO existAttach = businessAttachMapper.selectByProcessDefinitionKey(
                        importBusinessAttach.getProcessDefinitionKey());
                if (existAttach == null) {
                    BpmBusinessAttachDO attach = BeanUtils.toBean(importBusinessAttach, BpmBusinessAttachDO.class);
                    businessAttachMapper.insert(attach);
                    respVO.getCreateBusinessAttachKeys().add(importBusinessAttach.getProcessDefinitionKey());
                    return;
                }
                // 2.2 已存在,判断是否允许更新
                if (!importReqVO.getUpdateSupport()) {
                    respVO.getFailureBusinessAttachKeys().put(importBusinessAttach.getProcessDefinitionKey(),
                            StrUtil.format(BUSINESS_ATTACH_IMPORT_EXISTS.getMsg(), importBusinessAttach.getProcessDefinitionKey()));
                    return;
                }
                BpmBusinessAttachDO updateAttach = BeanUtils.toBean(importBusinessAttach, BpmBusinessAttachDO.class)
                        .setId(existAttach.getId());
                businessAttachMapper.updateById(updateAttach);
                respVO.getUpdateBusinessAttachKeys().add(importBusinessAttach.getProcessDefinitionKey());
            } catch (ServiceException ex) {
                respVO.getFailureBusinessAttachKeys().put(importBusinessAttach.getProcessDefinitionKey(), ex.getMessage());
            }
        });
        return respVO;
    }
 
}