package com.iailab.module.bpm.convert.definition; import cn.hutool.core.util.ArrayUtil; import com.iailab.framework.common.util.date.DateUtils; import com.iailab.framework.common.util.json.JsonUtils; import com.iailab.framework.common.util.object.BeanUtils; import com.iailab.module.bpm.controller.admin.base.user.UserSimpleBaseVO; import com.iailab.module.bpm.controller.admin.definition.vo.model.BpmModelMetaInfoVO; import com.iailab.module.bpm.controller.admin.definition.vo.model.BpmModelRespVO; import com.iailab.module.bpm.controller.admin.definition.vo.model.BpmModelSaveReqVO; import com.iailab.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO; import com.iailab.module.bpm.dal.dataobject.definition.BpmCategoryDO; import com.iailab.module.bpm.dal.dataobject.definition.BpmFormDO; import com.iailab.module.bpm.framework.flowable.core.util.BpmnModelUtils; import com.iailab.module.system.api.user.dto.AdminUserRespDTO; import org.flowable.common.engine.impl.db.SuspensionState; import org.flowable.engine.repository.Deployment; import org.flowable.engine.repository.Model; import org.flowable.engine.repository.ProcessDefinition; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Map; import static com.iailab.framework.common.util.collection.CollectionUtils.convertList; /** * 流程模型 Convert * * @author hou */ @Mapper public interface BpmModelConvert { BpmModelConvert INSTANCE = Mappers.getMapper(BpmModelConvert.class); default List buildModelList(List list, Map formMap, Map categoryMap, Map deploymentMap, Map processDefinitionMap, Map userMap) { List result = convertList(list, model -> { BpmModelMetaInfoVO metaInfo = parseMetaInfo(model); BpmFormDO form = metaInfo != null ? formMap.get(metaInfo.getFormId()) : null; BpmCategoryDO category = categoryMap.get(model.getCategory()); Deployment deployment = model.getDeploymentId() != null ? deploymentMap.get(model.getDeploymentId()) : null; ProcessDefinition processDefinition = model.getDeploymentId() != null ? processDefinitionMap.get(model.getDeploymentId()) : null; List startUsers = metaInfo != null ? convertList(metaInfo.getStartUserIds(), userMap::get) : null; return buildModel0(model, metaInfo, form, category, deployment, processDefinition, startUsers); }); // 排序 result.sort(Comparator.comparing(BpmModelMetaInfoVO::getSort)); return result; } default BpmModelRespVO buildModel(Model model, byte[] bpmnBytes) { BpmModelMetaInfoVO metaInfo = parseMetaInfo(model); BpmModelRespVO modelVO = buildModel0(model, metaInfo, null, null, null, null, null); if (ArrayUtil.isNotEmpty(bpmnBytes)) { modelVO.setBpmnXml(BpmnModelUtils.getBpmnXml(bpmnBytes)); } return modelVO; } default BpmModelRespVO buildModel0(Model model, BpmModelMetaInfoVO metaInfo, BpmFormDO form, BpmCategoryDO category, Deployment deployment, ProcessDefinition processDefinition, List startUsers) { BpmModelRespVO modelRespVO = new BpmModelRespVO().setId(model.getId()).setName(model.getName()) .setKey(model.getKey()).setCategory(model.getCategory()) .setCreateTime(DateUtils.of(model.getCreateTime())); // Form BeanUtils.copyProperties(metaInfo, modelRespVO); if (form != null) { modelRespVO.setFormName(form.getName()); } // Category if (category != null) { modelRespVO.setCategoryName(category.getName()); } // ProcessDefinition if (processDefinition != null) { modelRespVO.setProcessDefinition(BeanUtils.toBean(processDefinition, BpmProcessDefinitionRespVO.class)); modelRespVO.getProcessDefinition().setSuspensionState(processDefinition.isSuspended() ? SuspensionState.SUSPENDED.getStateCode() : SuspensionState.ACTIVE.getStateCode()); if (deployment != null) { modelRespVO.getProcessDefinition().setDeploymentTime(DateUtils.of(deployment.getDeploymentTime())); } } // User modelRespVO.setStartUsers(BeanUtils.toBean(startUsers, UserSimpleBaseVO.class)); return modelRespVO; } default void copyToModel(Model model, BpmModelSaveReqVO reqVO) { model.setName(reqVO.getName()); model.setKey(reqVO.getKey()); model.setCategory(reqVO.getCategory()); model.setMetaInfo(JsonUtils.toJsonString(BeanUtils.toBean(reqVO, BpmModelMetaInfoVO.class))); } default BpmModelMetaInfoVO parseMetaInfo(Model model) { BpmModelMetaInfoVO vo = JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoVO.class); if (vo == null) { return null; } if (vo.getManagerUserIds() == null) { vo.setManagerUserIds(Collections.emptyList()); } if (vo.getStartUserIds() == null) { vo.setStartUserIds(Collections.emptyList()); } // 如果为空,兜底处理,使用 createTime 创建时间 if (vo.getSort() == null) { vo.setSort(model.getCreateTime().getTime()); } return vo; } }