Procházet zdrojové kódy

完善 model 列表

YunaiV před 3 roky
rodič
revize
7833aa5d0e

+ 6 - 0
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/model/vo/BpmModelPageItemRespVO.java

@@ -38,6 +38,12 @@ public class BpmModelPageItemRespVO extends BpmModelBaseVO {
         @ApiModelProperty(value = "版本", required = true, example = "1")
         private Integer version;
 
+        @ApiModelProperty(value = "部署时间", required = true)
+        private Date deploymentTime;
+
+        @ApiModelProperty(value = "中断状态", required = true, example = "1", notes = "参见 SuspensionState 枚举")
+        private Integer suspensionState;
+
     }
 
 }

+ 11 - 2
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/model/ModelConvert.java

@@ -9,6 +9,8 @@ import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmDefini
 import cn.iocoder.yudao.adminserver.modules.bpm.service.model.dto.BpmModelMetaInfoRespDTO;
 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
+import org.activiti.engine.impl.persistence.entity.SuspensionState;
+import org.activiti.engine.repository.Deployment;
 import org.activiti.engine.repository.Model;
 import org.activiti.engine.repository.ProcessDefinition;
 import org.mapstruct.Mapper;
@@ -29,16 +31,18 @@ public interface ModelConvert {
     ModelConvert INSTANCE = Mappers.getMapper(ModelConvert.class);
 
     default List<BpmModelPageItemRespVO> convertList(List<Model> list, Map<Long, BpmFormDO> formMap,
+                                                     Map<String, Deployment> deploymentMap,
                                                      Map<String, ProcessDefinition> processDefinitionMap) {
         return CollectionUtils.convertList(list, model -> {
             BpmModelMetaInfoRespDTO metaInfo = JsonUtils.parseObject(model.getMetaInfo(), BpmModelMetaInfoRespDTO.class);
             BpmFormDO form = metaInfo != null ? formMap.get(metaInfo.getFormId()) : null;
+            Deployment deployment = model.getDeploymentId() != null ? deploymentMap.get(model.getDeploymentId()) : null;
             ProcessDefinition processDefinition = model.getDeploymentId() != null ? processDefinitionMap.get(model.getDeploymentId()) : null;
-            return convert(model, form, processDefinition);
+            return convert(model, form, deployment, processDefinition);
         });
     }
 
-    default BpmModelPageItemRespVO convert(Model model, BpmFormDO form, ProcessDefinition processDefinition) {
+    default BpmModelPageItemRespVO convert(Model model, BpmFormDO form, Deployment deployment, ProcessDefinition processDefinition) {
         BpmModelPageItemRespVO modelRespVO = new BpmModelPageItemRespVO();
         modelRespVO.setId(model.getId());
         modelRespVO.setName(model.getName());
@@ -54,6 +58,11 @@ public interface ModelConvert {
             modelRespVO.setFormName(form.getName());
         }
         modelRespVO.setProcessDefinition(this.convert(processDefinition));
+        if (modelRespVO.getProcessDefinition() != null) {
+            modelRespVO.getProcessDefinition().setSuspensionState(processDefinition.isSuspended() ?
+                    SuspensionState.SUSPENDED.getStateCode() : SuspensionState.ACTIVE.getStateCode());
+            modelRespVO.getProcessDefinition().setDeploymentTime(deployment.getDeploymentTime());
+        }
         return modelRespVO;
     }
 

+ 32 - 3
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/BpmDefinitionService.java

@@ -5,10 +5,13 @@ import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.processde
 import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.processdefinition.ProcessDefinitionRespVO;
 import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmDefinitionCreateReqDTO;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
+import org.activiti.engine.repository.Deployment;
 import org.activiti.engine.repository.ProcessDefinition;
 
 import javax.validation.Valid;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 /**
@@ -41,12 +44,38 @@ public interface BpmDefinitionService {
     ProcessDefinition getDefinition(String id);
 
     /**
-     * 获得 deploymentId 对应的 ProcessDefinition 数组
+     * 获得 id 对应的 Deployment
      *
-     * @param deploymentId 部署编号
+     * @param id 部署编号
+     * @return 流程部署
+     */
+    Deployment getDeployment(String id);
+
+    /**
+     * 获得 ids 对应的 Deployment 数组
+     *
+     * @param ids 部署编号的数组
+     * @return 流程部署的数组
+     */
+    List<Deployment> getDeployments(Set<String> ids);
+
+    /**
+     * 获得 ids 对应的 Deployment Map
+     *
+     * @param ids 部署编号的数组
+     * @return 流程部署 Map
+     */
+    default Map<String, Deployment> getDeploymentMap(Set<String> ids) {
+        return CollectionUtils.convertMap(getDeployments(ids), Deployment::getId);
+    }
+
+    /**
+     * 获得 deploymentIds 对应的 ProcessDefinition 数组
+     *
+     * @param deploymentIds 部署编号的数组
      * @return 流程定义的数组
      */
-    List<ProcessDefinition> getDefinitionListByDeploymentIds(Set<String> deploymentId);
+    List<ProcessDefinition> getDefinitionListByDeploymentIds(Set<String> deploymentIds);
 
     /**
      * 创建流程定义

+ 22 - 0
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/impl/BpmDefinitionServiceImpl.java

@@ -11,6 +11,7 @@ import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.definition.BpmProcessD
 import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmDefinitionService;
 import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto.BpmDefinitionCreateReqDTO;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.activiti.bpmn.converter.BpmnXMLConverter;
 import org.activiti.bpmn.model.BpmnModel;
@@ -23,6 +24,7 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Set;
@@ -77,6 +79,26 @@ public class BpmDefinitionServiceImpl implements BpmDefinitionService {
         return repositoryService.getProcessDefinition(id);
     }
 
+    @Override
+    public Deployment getDeployment(String id) {
+        if (StrUtil.isEmpty(id)) {
+            return null;
+        }
+        return repositoryService.createDeploymentQuery().deploymentId(id).singleResult();
+    }
+
+    @Override
+    public List<Deployment> getDeployments(Set<String> ids) {
+        if (CollUtil.isEmpty(ids)) {
+            return Collections.emptyList();
+        }
+        List<Deployment> list = new ArrayList<>(ids.size());
+        for (String id : ids) {
+            CollectionUtils.addIfNotNull(list, getDeployment(id));
+        }
+        return list;
+    }
+
     @Override
     public List<ProcessDefinition> getDefinitionListByDeploymentIds(Set<String> deploymentIds) {
         if (CollUtil.isEmpty(deploymentIds)) {

+ 5 - 2
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/model/impl/BpmModelServiceImpl.java

@@ -16,6 +16,7 @@ import cn.iocoder.yudao.framework.common.util.object.PageUtils;
 import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.activiti.engine.RepositoryService;
+import org.activiti.engine.repository.Deployment;
 import org.activiti.engine.repository.Model;
 import org.activiti.engine.repository.ModelQuery;
 import org.activiti.engine.repository.ProcessDefinition;
@@ -75,15 +76,17 @@ public class BpmModelServiceImpl implements BpmModelService {
         });
         Map<Long, BpmFormDO> formMap = bpmFormService.getFormMap(formIds);
 
-        // 获得 ProcessDefinition Map
+        // 获得 Deployment Map
         Set<String> deploymentIds = new HashSet<>();
         models.forEach(model -> CollectionUtils.addIfNotNull(deploymentIds, model.getDeploymentId()));
+        Map<String, Deployment> deploymentMap = bpmDefinitionService.getDeploymentMap(deploymentIds);
+        // 获得 ProcessDefinition Map
         List<ProcessDefinition> processDefinitions = bpmDefinitionService.getDefinitionListByDeploymentIds(deploymentIds);
         Map<String, ProcessDefinition> processDefinitionMap = convertMap(processDefinitions, ProcessDefinition::getDeploymentId);
 
         // 拼接结果
         long modelCount = modelQuery.count();
-        return new PageResult<>(ModelConvert.INSTANCE.convertList(models, formMap, processDefinitionMap), modelCount);
+        return new PageResult<>(ModelConvert.INSTANCE.convertList(models, formMap, deploymentMap, processDefinitionMap), modelCount);
     }
 
     @Override

+ 26 - 6
yudao-admin-ui/src/views/bpm/model/index.vue

@@ -34,14 +34,14 @@
     <!-- 列表 -->
     <el-table v-loading="loading" :data="list">
       <el-table-column label="流程标识" align="center" prop="key" />
-      <el-table-column label="流程名称" align="center" prop="name">
+      <el-table-column label="流程名称" align="center" prop="name" width="200">
         <template slot-scope="scope">
           <el-button type="text" @click="handleBpmnDetail(scope.row)">
             <span>{{ scope.row.name }}</span>
           </el-button>
         </template>
       </el-table-column>
-      <el-table-column label="流程分类" align="center" prop="category">
+      <el-table-column label="流程分类" align="center" prop="category" width="100">
         <template slot-scope="scope">
           <span>{{ getDictDataLabel(DICT_TYPE.BPM_MODEL_CATEGORY, scope.row.category) }}</span>
         </template>
@@ -54,18 +54,38 @@
           <label v-else>暂无表单</label>
         </template>
       </el-table-column>
-      <el-table-column label="流程版本" align="center" prop="processDefinition.version" />
       <el-table-column label="创建时间" align="center" prop="createTime" width="180">
         <template slot-scope="scope">
           <span>{{ parseTime(scope.row.createTime) }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="操作" align="center" width="240">
+      <el-table-column label="最新部署的流程定义" align="center">
+        <el-table-column label="流程版本" align="center" prop="processDefinition.version" width="80">
+          <template slot-scope="scope">
+            <el-tag size="medium" v-if="scope.row.processDefinition">v{{ scope.row.processDefinition.version }}</el-tag>
+            <el-tag size="medium" type="warning" v-else>未部署</el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column label="激活状态" align="center" prop="processDefinition.version" width="80">
+          <template slot-scope="scope">
+<!--            <el-tag type="success" v-if="scope.row.processDefinition && scope.row.processDefinition.suspensionState === 1">激活</el-tag>-->
+<!--            <el-tag type="warning" v-if="scope.row.processDefinition && scope.row.processDefinition.suspensionState === 2">挂起</el-tag>-->
+            <el-switch v-if="scope.row.processDefinition" v-model="scope.row.processDefinition.suspensionState"
+                       :active-value="1" :inactive-value="2" @change="handleStatusChange(scope.row)" />
+          </template>
+        </el-table-column>
+        <el-table-column label="部署时间" align="center" prop="createTime" width="180">
+          <template slot-scope="scope">
+            <span v-if="scope.row.processDefinition">{{ parseTime(scope.row.processDefinition.deploymentTime) }}</span>
+          </template>
+        </el-table-column>
+      </el-table-column>
+      <el-table-column label="操作" align="center" width="300">
         <template slot-scope="scope">
           <el-button size="mini" type="text" icon="el-icon-setting" @click="handleUpdate(scope.row)">设计流程</el-button>
+          <el-button size="mini" type="text" icon="el-icon-thumb" @click="handleDeploy(scope.row)">发布流程</el-button>
+          <el-button size="mini" type="text" icon="el-icon-ice-cream-round" @click="handleDeploy(scope.row)">流程定义</el-button>
           <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)">删除</el-button>
-          <el-button size="mini" type="text" icon="el-icon-thumb" @click="handleDeploy(scope.row)">发布</el-button>
-          <!-- TODO 芋艿:流程定义 -->
         </template>
       </el-table-column>
     </el-table>