|
@@ -1,20 +1,24 @@
|
|
|
package cn.iocoder.yudao.module.bpm.service.definition;
|
|
|
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
+import cn.hutool.core.util.ObjectUtil;
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
|
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
|
|
import cn.iocoder.yudao.framework.common.util.object.PageUtils;
|
|
|
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageReqVO;
|
|
|
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
|
|
|
-import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
|
|
|
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
|
|
|
import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmProcessDefinitionInfoMapper;
|
|
|
import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants;
|
|
|
import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils;
|
|
|
import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmModelMetaInfoRespDTO;
|
|
|
+import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmProcessDefinitionCreateReqDTO;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.flowable.bpmn.converter.BpmnXMLConverter;
|
|
|
import org.flowable.bpmn.model.BpmnModel;
|
|
|
import org.flowable.common.engine.impl.db.SuspensionState;
|
|
|
+import org.flowable.common.engine.impl.util.io.BytesStreamSource;
|
|
|
import org.flowable.engine.RepositoryService;
|
|
|
import org.flowable.engine.repository.Deployment;
|
|
|
import org.flowable.engine.repository.Model;
|
|
@@ -24,6 +28,7 @@ import org.springframework.stereotype.Service;
|
|
|
import org.springframework.validation.annotation.Validated;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
+import javax.validation.Valid;
|
|
|
import java.util.*;
|
|
|
|
|
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
@@ -128,7 +133,7 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
|
|
|
}
|
|
|
|
|
|
// 插入拓展表
|
|
|
- BpmProcessDefinitionInfoDO definitionDO = BeanUtils.toBean(modelMetaInfo, BpmProcessDefinitionInfoDO.class)
|
|
|
+ BpmProcessDefinitionExtDO definitionDO = BeanUtils.toBean(modelMetaInfo, BpmProcessDefinitionExtDO.class)
|
|
|
.setModelId(model.getId()).setProcessDefinitionId(definition.getId());
|
|
|
if (form != null) {
|
|
|
definitionDO.setFormFields(form.getFields()).setFormConf(form.getConf());
|
|
@@ -160,12 +165,12 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public BpmProcessDefinitionInfoDO getProcessDefinitionInfo(String id) {
|
|
|
+ public BpmProcessDefinitionExtDO getProcessDefinitionInfo(String id) {
|
|
|
return processDefinitionMapper.selectByProcessDefinitionId(id);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public List<BpmProcessDefinitionInfoDO> getProcessDefinitionInfoList(Collection<String> ids) {
|
|
|
+ public List<BpmProcessDefinitionExtDO> getProcessDefinitionInfoList(Collection<String> ids) {
|
|
|
return processDefinitionMapper.selectListByProcessDefinitionIds(ids);
|
|
|
}
|
|
|
|
|
@@ -204,4 +209,56 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
|
|
|
return repositoryService.getBpmnModel(processDefinitionId);
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public boolean isProcessDefinitionEquals(@Valid BpmProcessDefinitionCreateReqDTO createReqDTO) {
|
|
|
+ // 校验 name、description 是否更新
|
|
|
+ ProcessDefinition oldProcessDefinition = getActiveProcessDefinition(createReqDTO.getKey());
|
|
|
+ if (oldProcessDefinition == null) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ BpmProcessDefinitionExtDO oldProcessDefinitionExt = getProcessDefinitionExt(oldProcessDefinition.getId());
|
|
|
+ if (!StrUtil.equals(createReqDTO.getName(), oldProcessDefinition.getName())
|
|
|
+ || !StrUtil.equals(createReqDTO.getDescription(), oldProcessDefinitionExt.getDescription())
|
|
|
+ || !StrUtil.equals(createReqDTO.getCategory(), oldProcessDefinition.getCategory())) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ // 校验 form 信息是否更新
|
|
|
+ if (!ObjectUtil.equal(createReqDTO.getFormType(), oldProcessDefinitionExt.getFormType())
|
|
|
+ || !ObjectUtil.equal(createReqDTO.getFormId(), oldProcessDefinitionExt.getFormId())
|
|
|
+ || !ObjectUtil.equal(createReqDTO.getFormConf(), oldProcessDefinitionExt.getFormConf())
|
|
|
+ || !ObjectUtil.equal(createReqDTO.getFormFields(), oldProcessDefinitionExt.getFormFields())
|
|
|
+ || !ObjectUtil.equal(createReqDTO.getFormCustomCreatePath(), oldProcessDefinitionExt.getFormCustomCreatePath())
|
|
|
+ || !ObjectUtil.equal(createReqDTO.getFormCustomViewPath(), oldProcessDefinitionExt.getFormCustomViewPath())) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ // 校验 BPMN XML 信息
|
|
|
+ BpmnModel newModel = buildBpmnModel(createReqDTO.getBpmnBytes());
|
|
|
+ BpmnModel oldModel = getBpmnModel(oldProcessDefinition.getId());
|
|
|
+ // 对比字节变化
|
|
|
+ if (!cn.iocoder.yudao.framework.flowable.core.util.FlowableUtils.equals(oldModel, newModel)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ // 最终发现都一致,则返回 true
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public BpmProcessDefinitionExtDO getProcessDefinitionExt(String id) {
|
|
|
+ return processDefinitionMapper.selectByProcessDefinitionId(id);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构建对应的 BPMN Model
|
|
|
+ *
|
|
|
+ * @param bpmnBytes 原始的 BPMN XML 字节数组
|
|
|
+ * @return BPMN Model
|
|
|
+ */
|
|
|
+ private BpmnModel buildBpmnModel(byte[] bpmnBytes) {
|
|
|
+ // 转换成 BpmnModel 对象
|
|
|
+ BpmnXMLConverter converter = new BpmnXMLConverter();
|
|
|
+ return converter.convertToBpmnModel(new BytesStreamSource(bpmnBytes), true, true);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
}
|