Przeglądaj źródła

Merge branch 'master_20240722' of http://git.dgtis.com/15896567520/oneportal_saas into master_20240722

zhaopeiqing 7 miesięcy temu
rodzic
commit
1fb4a975f5
22 zmienionych plików z 712 dodań i 41 usunięć
  1. 15 0
      yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/definition/BpmModelApi.java
  2. 19 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/api/definition/BpmModelApiImpl.java
  3. 22 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmModelController.java
  4. 21 9
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/stamp/stampinfo/OaStampInfoController.java
  5. 4 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/stamp/stampinfo/vo/OaStampInfoRespVO.java
  6. 8 5
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/stamp/stampinfo/OaStampInfoDO.java
  7. 9 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmTaskAssignRuleMapper.java
  8. 1 1
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java
  9. 13 1
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelService.java
  10. 170 1
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java
  11. 4 1
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionServiceImpl.java
  12. 0 3
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/purchase/OaPurchaseServiceImpl.java
  13. 0 3
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/receive/OaReceiveServiceImpl.java
  14. 23 3
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/stamp/OaStampServiceImpl.java
  15. 11 4
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/stamp/stampinfo/OaStampInfoService.java
  16. 35 1
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/stamp/stampinfo/OaStampInfoServiceImpl.java
  17. 312 1
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java
  18. 8 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskAssignRuleService.java
  19. 14 2
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskAssignRuleServiceImpl.java
  20. 4 4
      yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/mapper/stamp/stampinfo/OaStampInfoMapper.xml
  21. 5 0
      yudao-module-system/yudao-module-system-biz/pom.xml
  22. 14 2
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceImpl.java

+ 15 - 0
yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/definition/BpmModelApi.java

@@ -0,0 +1,15 @@
+package cn.iocoder.yudao.module.bpm.api.definition;
+
+import java.util.Map;
+
+public interface BpmModelApi {
+
+    /**
+     * 复制模型,并部署流程
+     *
+     * @param modelKey      模型 key,有值时表示复制部署指定流程,为空时表示复制部署所有12个流程
+     * @param modelTenantId 模型租户,有值时表示复制该租户的流程,为空时表示复制租户1的流程
+     * @return 结果说明
+     */
+    Map<String, String> copyAndDeploy(String modelKey, String modelTenantId);
+}

+ 19 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/api/definition/BpmModelApiImpl.java

@@ -0,0 +1,19 @@
+package cn.iocoder.yudao.module.bpm.api.definition;
+
+import cn.iocoder.yudao.module.bpm.service.definition.BpmModelService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+@Service
+public class BpmModelApiImpl implements BpmModelApi {
+
+    @Resource
+    private BpmModelService modelService;
+
+    @Override
+    public Map<String, String> copyAndDeploy(String modelKey, String modelTenantId) {
+        return modelService.copyAndDeploy(modelKey, modelTenantId);
+    }
+}

+ 22 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmModelController.java

@@ -1,6 +1,7 @@
 package cn.iocoder.yudao.module.bpm.controller.admin.definition;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
@@ -8,21 +9,26 @@ import cn.iocoder.yudao.framework.common.util.io.IoUtils;
 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.*;
+import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleCreateReqVO;
 import cn.iocoder.yudao.module.bpm.convert.definition.BpmModelConvert;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO;
 import cn.iocoder.yudao.module.bpm.service.definition.BpmCategoryService;
 import cn.iocoder.yudao.module.bpm.service.definition.BpmFormService;
 import cn.iocoder.yudao.module.bpm.service.definition.BpmModelService;
 import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
 import cn.iocoder.yudao.module.bpm.service.definition.dto.BpmModelMetaInfoRespDTO;
+import cn.iocoder.yudao.module.bpm.service.task.BpmTaskAssignRuleService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
+import org.flowable.engine.RepositoryService;
 import org.flowable.engine.repository.Deployment;
 import org.flowable.engine.repository.Model;
 import org.flowable.engine.repository.ProcessDefinition;
 import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
@@ -53,6 +59,12 @@ public class BpmModelController {
     @Resource
     private BpmProcessDefinitionService processDefinitionService;
 
+    @Resource
+    private RepositoryService repositoryService;
+
+    @Resource
+    private BpmTaskAssignRuleService bpmTaskAssignRuleService;
+
     @GetMapping("/page")
     @Operation(summary = "获得模型分页")
     public CommonResult<PageResult<BpmModelRespVO>> getModelPage(BpmModelPageReqVO pageVO) {
@@ -94,6 +106,16 @@ public class BpmModelController {
         return success(BpmModelConvert.INSTANCE.buildModel(model, bpmnBytes));
     }
 
+    @GetMapping("/copyAndDeploy")
+    @Operation(summary = "复制部署模型")
+    @Parameter(name = "modelKey", description = "模型key", required = false)
+    @Parameter(name = "modelTenantId", description = "模型租户", required = false)
+    public CommonResult<Map<String, String>> copyAndDeploy(@RequestParam(value = "modelKey", required = false) String modelKey,
+                                                           @RequestParam(value = "modelTenantId", required = false) String modelTenantId) {
+        Map<String, String> resultMap = modelService.copyAndDeploy(modelKey, modelTenantId);
+        return CommonResult.success(resultMap);
+    }
+
     @PostMapping("/create")
     @Operation(summary = "新建模型")
     @PreAuthorize("@ss.hasPermission('bpm:model:create')")

+ 21 - 9
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/stamp/stampinfo/OaStampInfoController.java

@@ -11,10 +11,12 @@ import cn.iocoder.yudao.module.bpm.controller.admin.stamp.stampinfo.vo.OaStampIn
 import cn.iocoder.yudao.module.bpm.controller.admin.stamp.stampinfo.vo.OaStampInfoSaveReqVO;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.stamp.stampinfo.OaStampInfoDO;
 import cn.iocoder.yudao.module.bpm.service.stamp.stampinfo.OaStampInfoService;
+import cn.iocoder.yudao.module.employee.api.EmployeeApi;
+import cn.iocoder.yudao.module.employee.api.dto.EmployeeRespDTO;
 import cn.iocoder.yudao.module.system.api.dept.DeptApi;
+import cn.iocoder.yudao.module.system.api.dept.PostApi;
 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
-import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
-import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
+import cn.iocoder.yudao.module.system.api.dept.dto.PostRespDTO;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -27,6 +29,7 @@ import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import java.io.IOException;
 import java.util.List;
+import java.util.Objects;
 
 import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@@ -41,11 +44,14 @@ public class OaStampInfoController {
     private OaStampInfoService oaStampInfoService;
 
     @Resource
-    private AdminUserApi adminUserApi;
+    private EmployeeApi employeeApi;
 
     @Resource
     private DeptApi deptApi;
 
+    @Resource
+    private PostApi postApi;
+
     @PostMapping("/create")
     @Operation(summary = "创建用印信息")
     // @PreAuthorize("@ss.hasPermission('bpm:oa-stamp-info:create')")
@@ -114,14 +120,20 @@ public class OaStampInfoController {
         }
         // 创建人名字
         Long createEmployeeId = oaStampInfoRespVO.getCreateEmployeeId();
-        AdminUserRespDTO createEmployee = adminUserApi.getUser(createEmployeeId);
-        oaStampInfoRespVO.setCreateEmployeeName(createEmployee.getNickname());
+        EmployeeRespDTO createEmployee = employeeApi.getEmployeeById(createEmployeeId);
+        oaStampInfoRespVO.setCreateEmployeeName(createEmployee.getName());
         // 用印人信息
         Long employeeId = oaStampInfoRespVO.getEmployeeId();
-        AdminUserRespDTO employee = adminUserApi.getUser(employeeId);
-        oaStampInfoRespVO.setEmployeeName(employee.getNickname());
-        oaStampInfoRespVO.setEmployeePhone(employee.getMobile());
-        oaStampInfoRespVO.setPosition("职位信息");
+        // AdminUserRespDTO employee = adminUserApi.getUser(employeeId);
+        EmployeeRespDTO employee = employeeApi.getEmployeeById(employeeId);
+        oaStampInfoRespVO.setEmployeeName(employee.getName());
+        oaStampInfoRespVO.setEmployeePhone(employee.getPhone());
+        // 职位
+        Long postId = oaStampInfoRespVO.getPostId();
+        PostRespDTO post = postApi.getPost(postId);
+        if (Objects.nonNull(post)) {
+            oaStampInfoRespVO.setPosition(post.getName());
+        }
         // 部门名称
         Long deptId = oaStampInfoRespVO.getDeptId();
         DeptRespDTO dept = deptApi.getDept(deptId);

+ 4 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/stamp/stampinfo/vo/OaStampInfoRespVO.java

@@ -49,6 +49,10 @@ public class OaStampInfoRespVO {
     @ExcelProperty("部门名称")
     private String deptName;
 
+    @Schema(description = "员工职位id")
+    @ExcelProperty("员工职位id")
+    private Long postId;
+
     @Schema(description = "员工职位")
     @ExcelProperty("员工职位")
     private String position;

+ 8 - 5
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/stamp/stampinfo/OaStampInfoDO.java

@@ -1,11 +1,10 @@
 package cn.iocoder.yudao.module.bpm.dal.dataobject.stamp.stampinfo;
 
-import lombok.*;
-import java.util.*;
-import java.time.LocalDateTime;
-import java.time.LocalDateTime;
-import com.baomidou.mybatisplus.annotation.*;
 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
 
 /**
  * 用印信息 DO
@@ -63,6 +62,10 @@ public class OaStampInfoDO extends BaseDO {
      * 部门uuid
      */
     private String deptUuid;
+    /**
+     * 职位id
+     */
+    private Long postId;
     /**
      * 员工职位
      */

+ 9 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/task/BpmTaskAssignRuleMapper.java

@@ -6,6 +6,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
+import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO;
 import org.apache.ibatis.annotations.Mapper;
 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.*;
@@ -36,6 +37,14 @@ public interface BpmTaskAssignRuleMapper extends BaseMapperX<BpmTaskAssignRuleDO
                 .eq("process_definition_id", BpmTaskAssignRuleDO.PROCESS_DEFINITION_ID_NULL));
     }
 
+    @TenantIgnore
+    default List<BpmTaskAssignRuleDO> selectListByModelId2(String modelId) {
+        return selectList(new QueryWrapperX<BpmTaskAssignRuleDO>()
+                .eq("tenant_id", 1L)
+                .eq("model_id", modelId)
+                .eq("process_definition_id", BpmTaskAssignRuleDO.PROCESS_DEFINITION_ID_NULL));
+    }
+
     default List<BpmTaskAssignRuleDO> selectListByProcessDefinitionId(String processDefinitionId,
                                                                       @Nullable String taskDefinitionKey) {
         return selectList(new QueryWrapperX<BpmTaskAssignRuleDO>()

+ 1 - 1
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java

@@ -53,7 +53,7 @@ public class BpmTaskEventListener extends AbstractFlowableEngineEventListener {
 
     @Override
     protected void taskAssigned(FlowableEngineEntityEvent event) {
-        taskService.updateTaskExtAssign((Task)event.getEntity());
+        // taskService.updateTaskExtAssign((Task)event.getEntity());
     }
 
     @Override

+ 13 - 1
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelService.java

@@ -1,11 +1,14 @@
 package cn.iocoder.yudao.module.bpm.service.definition;
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.*;
+import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelCreateReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelPageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelUpdateReqVO;
 import org.flowable.bpmn.model.BpmnModel;
 import org.flowable.engine.repository.Model;
 
 import javax.validation.Valid;
+import java.util.Map;
 
 /**
  * Flowable流程模型接口
@@ -47,6 +50,15 @@ public interface BpmModelService {
      */
     byte[] getModelBpmnXML(String id);
 
+    /**
+     * 复制模型,并部署流程
+     *
+     * @param modelKey      模型 key,有值时表示复制部署指定流程,为空时表示复制部署所有12个流程
+     * @param modelTenantId 模型租户,有值时表示复制该租户的流程,为空时表示复制租户1的流程
+     * @return 结果说明
+     */
+    Map<String, String> copyAndDeploy(String modelKey, String modelTenantId);
+
     /**
      * 修改流程模型
      *

+ 170 - 1
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java

@@ -1,16 +1,21 @@
 package cn.iocoder.yudao.module.bpm.service.definition;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.common.util.object.PageUtils;
 import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils;
 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelCreateReqVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelPageReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelRespVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelUpdateReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.rule.BpmTaskAssignRuleCreateReqVO;
 import cn.iocoder.yudao.module.bpm.convert.definition.BpmModelConvert;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO;
 import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum;
 import cn.iocoder.yudao.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateInvoker;
 import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils;
@@ -36,7 +41,10 @@ import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
 import javax.validation.Valid;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -80,6 +88,7 @@ public class BpmModelServiceImpl implements BpmModelService {
         if (StrUtil.isNotBlank(pageVO.getCategory())) {
             modelQuery.modelCategory(pageVO.getCategory());
         }
+        modelQuery.modelTenantId(FlowableUtils.getTenantId());
         // 执行查询
         long count = modelQuery.count();
         if (count == 0) {
@@ -92,6 +101,163 @@ public class BpmModelServiceImpl implements BpmModelService {
         return new PageResult<>(models, count);
     }
 
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Map<String, String> copyAndDeploy(String modelKey, String modelTenantId) {
+
+        // 复制部署模型结果说明
+        Map<String, String> resultMap = new LinkedHashMap<>();
+        // StringBuilder resultBuilder = new StringBuilder();
+
+        // 模型key列表:共12个
+        List<String> modelKeyList = new ArrayList<>();
+        modelKeyList.add("oa_universal");
+        modelKeyList.add("oa_entry");
+        modelKeyList.add("oa_conversion");
+        modelKeyList.add("oa_renew");
+        modelKeyList.add("oa_turnover");
+        modelKeyList.add("oa_leave");
+        modelKeyList.add("oa_business");
+        modelKeyList.add("oa_out");
+        modelKeyList.add("oa_receive");
+        modelKeyList.add("oa_purchase");
+        modelKeyList.add("oa_expense");
+        modelKeyList.add("oa_stamp");
+
+        // 默认租户:1
+        if (StrUtil.isBlank(modelTenantId)) {
+            modelTenantId = "1";
+        }
+
+        // 指定了模型key,只部署指定的模型,否则部署定义好的所有模型
+        if (StrUtil.isNotBlank(modelKey)) {
+            if (modelKeyList.contains(modelKey)) {
+                List<Model> nowList = repositoryService.createModelQuery()
+                        .modelKey(modelKey)
+                        .modelTenantId(FlowableUtils.getTenantId())
+                        .list();
+                if (CollUtil.isNotEmpty(nowList)) {
+                    resultMap.put(modelKey + ":" + FlowableUtils.getTenantId(), "模型已存在");
+                    // resultBuilder.append(modelKey).append(":").append(FlowableUtils.getTenantId()).append("的模型已存在");
+                    return resultMap;
+                }
+                List<Model> list = repositoryService.createModelQuery()
+                        .modelKey(modelKey)
+                        .modelTenantId(modelTenantId)
+                        .list();
+                // 同一个租户,同一个key,应该只有一条模型记录
+                if (CollUtil.isNotEmpty(list) && list.size() == 1) {
+                    // 模型源
+                    Model model = list.get(0);
+
+                    // 新模型
+                    Model newModel = repositoryService.newModel();
+                    newModel.setName(model.getName());
+                    newModel.setKey(model.getKey());
+                    newModel.setVersion(1);
+                    newModel.setMetaInfo(model.getMetaInfo());
+                    newModel.setTenantId(FlowableUtils.getTenantId());
+
+                    byte[] bpmnBytes = this.getModelBpmnXML(model.getId());
+                    if (bpmnBytes != null && bpmnBytes.length > 0) {
+                        BpmModelRespVO bpmModelRespVO = BpmModelConvert.INSTANCE.buildModel(model, bpmnBytes);
+                        BpmModelUpdateReqVO updateReqVO = BeanUtils.toBean(bpmModelRespVO, BpmModelUpdateReqVO.class);
+                        // 修改流程定义
+                        BpmModelConvert.INSTANCE.copyToUpdateModel(newModel, updateReqVO);
+                        // 添加模型
+                        repositoryService.saveModel(newModel);
+                        // 添加 BPMN XML
+                        repositoryService.addModelEditorSource(newModel.getId(), StrUtil.utf8Bytes(updateReqVO.getBpmnXml()));
+                    }
+
+                    // 添加分配规则
+                    List<BpmTaskAssignRuleDO> taskAssignRuleListByModelId = taskAssignRuleService.getTaskAssignRuleListByModelId2(model.getId());
+                    if (CollUtil.isNotEmpty(taskAssignRuleListByModelId)) {
+                        for (BpmTaskAssignRuleDO bpmTaskAssignRuleDO : taskAssignRuleListByModelId) {
+                            bpmTaskAssignRuleDO.setModelId(newModel.getId());
+                            BpmTaskAssignRuleCreateReqVO bpmTaskAssignRuleCreateReqVO = BeanUtils.toBean(bpmTaskAssignRuleDO, BpmTaskAssignRuleCreateReqVO.class);
+                            taskAssignRuleService.createTaskAssignRule(bpmTaskAssignRuleCreateReqVO);
+                        }
+
+                        // 部署流程
+                        this.deployModel(newModel.getId());
+                    }
+
+                    resultMap.put(modelKey + ":" + FlowableUtils.getTenantId(), "模型复制部署成功");
+                    // resultBuilder.append(modelKey).append(":").append(FlowableUtils.getTenantId()).append(" 模型复制部署成功;").append(System.lineSeparator());
+                } else {
+                    resultMap.put(modelKey + ":" + FlowableUtils.getTenantId(), "源模型不存在或数量大于1个,请查看原因");
+                    // resultBuilder.append(modelKey).append(":").append(FlowableUtils.getTenantId()).append(" 源模型数量大于1个,请查看原因").append(System.lineSeparator());
+                    return resultMap;
+                }
+            }
+        } else {
+            for (int i = 0; i < modelKeyList.size(); i++) {
+                modelKey = modelKeyList.get(i);
+
+                List<Model> nowList = repositoryService.createModelQuery()
+                        .modelKey(modelKey)
+                        .modelTenantId(FlowableUtils.getTenantId())
+                        .list();
+                if (CollUtil.isNotEmpty(nowList)) {
+                    resultMap.put(modelKey + ":" + FlowableUtils.getTenantId(), "模型已存在");
+                    // resultBuilder.append(modelKey).append(":").append(FlowableUtils.getTenantId()).append("的模型已存在").append(System.lineSeparator());
+                    continue;
+                }
+                List<Model> list = repositoryService.createModelQuery()
+                        .modelKey(modelKey)
+                        .modelTenantId(modelTenantId)
+                        .list();
+                // 同一个租户,同一个key,应该只有一条模型记录
+                if (CollUtil.isNotEmpty(list) && list.size() == 1) {
+                    // 模型源
+                    Model model = list.get(0);
+
+                    // 新模型
+                    Model newModel = repositoryService.newModel();
+                    newModel.setName(model.getName());
+                    newModel.setKey(model.getKey());
+                    newModel.setVersion(1);
+                    newModel.setMetaInfo(model.getMetaInfo());
+                    newModel.setTenantId(FlowableUtils.getTenantId());
+
+                    byte[] bpmnBytes = this.getModelBpmnXML(model.getId());
+                    if (bpmnBytes != null && bpmnBytes.length > 0) {
+                        BpmModelRespVO bpmModelRespVO = BpmModelConvert.INSTANCE.buildModel(model, bpmnBytes);
+                        BpmModelUpdateReqVO updateReqVO = BeanUtils.toBean(bpmModelRespVO, BpmModelUpdateReqVO.class);
+                        // 修改流程定义
+                        BpmModelConvert.INSTANCE.copyToUpdateModel(newModel, updateReqVO);
+                        // 添加模型
+                        repositoryService.saveModel(newModel);
+                        // 添加 BPMN XML
+                        repositoryService.addModelEditorSource(newModel.getId(), StrUtil.utf8Bytes(updateReqVO.getBpmnXml()));
+                    }
+
+                    // 添加分配规则
+                    List<BpmTaskAssignRuleDO> taskAssignRuleListByModelId = taskAssignRuleService.getTaskAssignRuleListByModelId2(model.getId());
+                    if (CollUtil.isNotEmpty(taskAssignRuleListByModelId)) {
+                        for (BpmTaskAssignRuleDO bpmTaskAssignRuleDO : taskAssignRuleListByModelId) {
+                            bpmTaskAssignRuleDO.setModelId(newModel.getId());
+                            BpmTaskAssignRuleCreateReqVO bpmTaskAssignRuleCreateReqVO = BeanUtils.toBean(bpmTaskAssignRuleDO, BpmTaskAssignRuleCreateReqVO.class);
+                            taskAssignRuleService.createTaskAssignRule(bpmTaskAssignRuleCreateReqVO);
+                        }
+
+                        // 部署流程
+                        this.deployModel(newModel.getId());
+                    }
+
+                    resultMap.put(modelKey + ":" + FlowableUtils.getTenantId(), "模型复制部署成功");
+                    // resultBuilder.append(modelKey).append(":").append(FlowableUtils.getTenantId()).append(" 模型复制部署成功;").append(System.lineSeparator());
+                } else {
+                    resultMap.put(modelKey + ":" + FlowableUtils.getTenantId(), "源模型不存在或数量大于1个,请查看原因");
+                    // resultBuilder.append(modelKey).append(":").append(FlowableUtils.getTenantId()).append(" 源模型数量大于1个,请查看原因;").append(System.lineSeparator());
+                }
+            }
+        }
+        return resultMap;
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public String createModel(@Valid BpmModelCreateReqVO createReqVO, String bpmnXml) {
@@ -291,7 +457,10 @@ public class BpmModelServiceImpl implements BpmModelService {
     }
 
     private Model getModelByKey(String key) {
-        return repositoryService.createModelQuery().modelKey(key).singleResult();
+        return repositoryService.createModelQuery()
+                .modelKey(key)
+                .modelTenantId(FlowableUtils.getTenantId())
+                .singleResult();
     }
 
     @Override

+ 4 - 1
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessDefinitionServiceImpl.java

@@ -86,7 +86,9 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
 
     @Override
     public ProcessDefinition getActiveProcessDefinition(String key) {
-        return repositoryService.createProcessDefinitionQuery().processDefinitionKey(key).active().singleResult();
+        return repositoryService.createProcessDefinitionQuery()
+                .processDefinitionTenantId(FlowableUtils.getTenantId())
+                .processDefinitionKey(key).active().singleResult();
     }
 
     @Override
@@ -181,6 +183,7 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
         ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery();
         if (StrUtil.isNotBlank(pageVO.getKey())) {
             query.processDefinitionKey(pageVO.getKey());
+            query.processDefinitionTenantId(FlowableUtils.getTenantId());
         }
         // 执行查询
         long count = query.count();

+ 0 - 3
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/purchase/OaPurchaseServiceImpl.java

@@ -309,9 +309,6 @@ public class OaPurchaseServiceImpl implements OaPurchaseService {
                     .setCurrentAuditEmployeeName(null)
                     .setFinalAuditDate(LocalDateTime.now())
                     .setId(oaPurchase.getId());
-
-            // TODO 复制业务单据信息到业务模块单据表
-
         }
         oaPurchaseMapper.updateById(oaPurchaseDO);
         // 发送通知

+ 0 - 3
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/receive/OaReceiveServiceImpl.java

@@ -307,9 +307,6 @@ public class OaReceiveServiceImpl implements OaReceiveService {
                     .setCurrentAuditEmployeeName(null)
                     .setFinalAuditDate(LocalDateTime.now())
                     .setId(oaReceive.getId());
-
-            // TODO 复制业务单据信息到业务模块单据表
-
         }
         oaReceiveMapper.updateById(oaReceiveDO);
         // 发送通知

+ 23 - 3
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/stamp/OaStampServiceImpl.java

@@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.bpm.service.oa.stamp;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.iocoder.yudao.framework.common.enums.InfoSourceEnum;
 import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
@@ -18,10 +19,12 @@ import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskApproveR
 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskReturnReqVO;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.stamp.OaStampDO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.stamp.stampinfo.OaStampInfoDO;
 import cn.iocoder.yudao.module.bpm.dal.mysql.oa.stamp.OaStampMapper;
 import cn.iocoder.yudao.module.bpm.enums.DictDataConstants;
 import cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants;
 import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmConstants;
+import cn.iocoder.yudao.module.bpm.service.stamp.stampinfo.OaStampInfoService;
 import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
 import cn.iocoder.yudao.module.employee.api.EmployeeApi;
 import cn.iocoder.yudao.module.employee.api.dto.EmployeeRespDTO;
@@ -73,6 +76,9 @@ public class OaStampServiceImpl implements OaStampService {
     @Resource
     private TaskService taskService;
 
+    @Resource
+    private OaStampInfoService oaStampInfoService;
+
     @Resource
     private FileApi fileApi;
 
@@ -289,11 +295,25 @@ public class OaStampServiceImpl implements OaStampService {
                     .setCurrentAuditEmployeeName(null)
                     .setFinalAuditDate(LocalDateTime.now())
                     .setId(oaStamp.getId());
-
-            // TODO 复制业务单据信息到业务模块单据表
-
         }
         oaStampMapper.updateById(oaStampDO);
+        // 复制业务单据信息到业务模块单据表
+        if(Objects.isNull(nextTask)) {
+            // 查询申请单
+            OaStampDO stamp = oaStampMapper.selectById(oaStampDO.getId());
+
+            // 转换
+            OaStampInfoDO stampInfoDO = BeanUtils.toBean(stamp, OaStampInfoDO.class);
+            stampInfoDO.setId(null);
+            stampInfoDO.setCreateTime(null);
+            stampInfoDO.setUpdater(null);
+            stampInfoDO.setUpdateTime(null);
+            stampInfoDO.setStatus("0");
+            stampInfoDO.setInfoSource(InfoSourceEnum.FLOW.getSource());
+
+            // 保存单据信息
+            oaStampInfoService.createStampInfoAfterAudit(stampInfoDO);
+        }
         // 发送通知
 
         // 返回

+ 11 - 4
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/stamp/stampinfo/OaStampInfoService.java

@@ -1,13 +1,12 @@
 package cn.iocoder.yudao.module.bpm.service.stamp.stampinfo;
 
-import javax.validation.*;
-
-import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.bpm.controller.admin.stamp.stampinfo.vo.OaStampInfoPageReqVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.stamp.stampinfo.vo.OaStampInfoRespVO;
 import cn.iocoder.yudao.module.bpm.controller.admin.stamp.stampinfo.vo.OaStampInfoSaveReqVO;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.stamp.stampinfo.OaStampInfoDO;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
+
+import javax.validation.Valid;
 
 /**
  * 用印信息 Service 接口
@@ -24,6 +23,14 @@ public interface OaStampInfoService {
      */
     Long createOaStampInfo(@Valid OaStampInfoSaveReqVO createReqVO);
 
+    /**
+     * 审批完成添加用印信息
+     *
+     * @param stampInfoDO 用印信息
+     * @return id
+     */
+    Long createStampInfoAfterAudit(OaStampInfoDO stampInfoDO);
+
     /**
      * 更新用印信息
      *

+ 35 - 1
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/stamp/stampinfo/OaStampInfoServiceImpl.java

@@ -13,17 +13,20 @@ import cn.iocoder.yudao.module.bpm.dal.dataobject.stamp.stampinfo.OaStampInfoDO;
 import cn.iocoder.yudao.module.bpm.dal.mysql.stamp.stampinfo.OaStampInfoMapper;
 import cn.iocoder.yudao.module.employee.api.EmployeeApi;
 import cn.iocoder.yudao.module.employee.api.dto.EmployeeRespDTO;
+import cn.iocoder.yudao.module.system.api.dept.PostApi;
 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
 import java.util.List;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_LOGIN_USER_NOT_EXISTS;
 import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_STAMP_INFO_NOT_EXISTS;
+import static cn.iocoder.yudao.module.employee.enums.ErrorCodeConstants.EMPLOYEE_INFO_NOT_EXISTS;
 
 /**
  * 用印信息 Service 实现类
@@ -43,6 +46,9 @@ public class OaStampInfoServiceImpl implements OaStampInfoService {
     @Resource
     private EmployeeApi employeeApi;
 
+    @Resource
+    private PostApi postApi;
+
     @Override
     public Long createOaStampInfo(OaStampInfoSaveReqVO createReqVO) {
         // 登录人
@@ -56,13 +62,21 @@ public class OaStampInfoServiceImpl implements OaStampInfoService {
         oaStampInfo.setStampUuid(IdUtil.fastSimpleUUID());
         // 创建员工
         EmployeeRespDTO createEmployee = employeeApi.getEmployeeByUserId(loginUser.getId());
+        if (Objects.isNull(createEmployee)) {
+            throw exception(EMPLOYEE_INFO_NOT_EXISTS);
+        }
         oaStampInfo.setCreateEmployeeId(createEmployee.getId());
         // 用印员工
         EmployeeRespDTO employee = employeeApi.getEmployeeById(createReqVO.getEmployeeId());
+        if (Objects.isNull(employee)) {
+            throw exception(EMPLOYEE_INFO_NOT_EXISTS);
+        }
         // 部门
         oaStampInfo.setDeptId(employee.getDeptId());
+        // 职位id
+        oaStampInfo.setPostId(employee.getPostId());
         // 职位
-        oaStampInfo.setPosition(String.valueOf(employee.getPostId()));
+        oaStampInfo.setPosition(employee.getPosition());
         // 印章
         List<Long> stampSealId = createReqVO.getStampSealId();
         if (CollUtil.isNotEmpty(stampSealId)) {
@@ -78,12 +92,32 @@ public class OaStampInfoServiceImpl implements OaStampInfoService {
         return oaStampInfo.getId();
     }
 
+    @Override
+    public Long createStampInfoAfterAudit(OaStampInfoDO stampInfoDO) {
+        if (Objects.isNull(stampInfoDO)) {
+            return -1L;
+        }
+        oaStampInfoMapper.insert(stampInfoDO);
+        return stampInfoDO.getId();
+    }
+
     @Override
     public void updateOaStampInfo(OaStampInfoSaveReqVO updateReqVO) {
         // 校验存在
         validateOaStampInfoExists(updateReqVO.getId());
         // 更新准备
         OaStampInfoDO updateObj = BeanUtils.toBean(updateReqVO, OaStampInfoDO.class);
+        // 用印员工
+        EmployeeRespDTO employee = employeeApi.getEmployeeById(updateReqVO.getEmployeeId());
+        if (Objects.isNull(employee)) {
+            throw exception(EMPLOYEE_INFO_NOT_EXISTS);
+        }
+        // 部门
+        updateObj.setDeptId(employee.getDeptId());
+        // 职位id
+        updateObj.setPostId(employee.getPostId());
+        // 职位
+        updateObj.setPosition(employee.getPosition());
         // 印章
         List<Long> stampSealId = updateReqVO.getStampSealId();
         if (CollUtil.isNotEmpty(stampSealId)) {

Plik diff jest za duży
+ 312 - 1
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java


+ 8 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskAssignRuleService.java

@@ -37,6 +37,14 @@ public interface BpmTaskAssignRuleService {
      */
     List<BpmTaskAssignRuleDO> getTaskAssignRuleListByModelId(String modelId);
 
+    /**
+     * 获得流程模型的任务规则数组
+     *
+     * @param modelId 流程模型的编号
+     * @return 任务规则数组
+     */
+    List<BpmTaskAssignRuleDO> getTaskAssignRuleListByModelId2(String modelId);
+
     /**
      * 获得流程定义的任务分配规则数组
      *

+ 14 - 2
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskAssignRuleServiceImpl.java

@@ -19,6 +19,8 @@ import cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.script.BpmTa
 import cn.iocoder.yudao.module.bpm.service.definition.BpmModelService;
 import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
 import cn.iocoder.yudao.module.bpm.service.definition.BpmUserGroupService;
+import cn.iocoder.yudao.module.employee.api.EmployeeApi;
+import cn.iocoder.yudao.module.employee.api.dto.EmployeeRespDTO;
 import cn.iocoder.yudao.module.system.api.dept.DeptApi;
 import cn.iocoder.yudao.module.system.api.dept.PostApi;
 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
@@ -82,6 +84,8 @@ public class BpmTaskAssignRuleServiceImpl implements BpmTaskAssignRuleService {
     @Resource
     private AdminUserApi adminUserApi;
     @Resource
+    private EmployeeApi employeeApi;
+    @Resource
     private DictDataApi dictDataApi;
     @Resource
     private PermissionApi permissionApi;
@@ -105,6 +109,10 @@ public class BpmTaskAssignRuleServiceImpl implements BpmTaskAssignRuleService {
     public List<BpmTaskAssignRuleDO> getTaskAssignRuleListByModelId(String modelId) {
         return taskRuleMapper.selectListByModelId(modelId);
     }
+    @Override
+    public List<BpmTaskAssignRuleDO> getTaskAssignRuleListByModelId2(String modelId) {
+        return taskRuleMapper.selectListByModelId2(modelId);
+    }
 
     @Override
     public List<BpmTaskAssignRuleRespVO> getTaskAssignRuleList(String modelId, String processDefinitionId) {
@@ -343,9 +351,13 @@ public class BpmTaskAssignRuleServiceImpl implements BpmTaskAssignRuleService {
             return;
         }
         Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(assigneeUserIds);
+        List<EmployeeRespDTO> employeeRespDTOList = employeeApi.getEmployeeListByIds(assigneeUserIds);
+        Map<Long, EmployeeRespDTO> respDTOMap = convertMap(employeeRespDTOList, EmployeeRespDTO::getId);
         assigneeUserIds.removeIf(id -> {
-            AdminUserRespDTO user = userMap.get(id);
-            return user == null || !CommonStatusEnum.ENABLE.getStatus().equals(user.getStatus());
+            // AdminUserRespDTO user = userMap.get(id);
+            EmployeeRespDTO employee = respDTOMap.get(id);
+            // return user == null || !CommonStatusEnum.ENABLE.getStatus().equals(user.getStatus());
+            return employee == null;
         });
     }
 

+ 4 - 4
yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/mapper/stamp/stampinfo/OaStampInfoMapper.xml

@@ -14,7 +14,7 @@
         FROM
         bpm_oa_stamp_info si
         LEFT JOIN employee_info ei ON si.employee_id = ei.id and ei.deleted = 0
-        LEFT JOIN system_post sp ON sp.id = ei.post_id and sp.deleted = 0
+        LEFT JOIN system_post sp ON sp.id = si.post_id and sp.deleted = 0
         LEFT JOIN employee_info ei2 ON si.create_employee_id = ei2.id and ei2.deleted = 0
         LEFT JOIN system_dept sd ON si.dept_id = sd.id and sd.deleted = 0
         WHERE si.deleted = 0
@@ -25,7 +25,7 @@
             AND si.dept_id = #{page.deptId}
         </if>
         <if test="page.postId != null">
-            AND sp.id = #{page.postId}
+            AND si.post_id = #{page.postId}
         </if>
         <if test="page.employeePhone != null and page.employeePhone != ''">
             AND ei.phone like concat('%',#{page.employeePhone},'%')
@@ -63,7 +63,7 @@
         FROM
         bpm_oa_stamp_info si
         LEFT JOIN employee_info ei ON si.employee_id = ei.id and ei.deleted = 0
-        LEFT JOIN system_post sp ON sp.id = ei.post_id and sp.deleted = 0
+        LEFT JOIN system_post sp ON sp.id = si.post_id and sp.deleted = 0
         LEFT JOIN employee_info ei2 ON si.create_employee_id = ei2.id and ei2.deleted = 0
         LEFT JOIN system_dept sd ON si.dept_id = sd.id and sd.deleted = 0
         WHERE si.deleted = 0
@@ -74,7 +74,7 @@
             AND si.dept_id = #{page.deptId}
         </if>
         <if test="page.postId != null">
-            AND sp.id = #{page.postId}
+            AND si.post_id = #{page.postId}
         </if>
         <if test="page.employeePhone != null and page.employeePhone != ''">
             AND ei.phone like concat('%',#{page.employeePhone},'%')

+ 5 - 0
yudao-module-system/yudao-module-system-biz/pom.xml

@@ -48,6 +48,11 @@
             <artifactId>yudao-module-attendance-api</artifactId>
             <version>${revision}</version>
         </dependency>
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-module-bpm-api</artifactId>
+            <version>${revision}</version>
+        </dependency>
 
         <!-- 业务组件 -->
         <dependency>

+ 14 - 2
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceImpl.java

@@ -17,6 +17,7 @@ import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
 import cn.iocoder.yudao.framework.tenant.config.TenantProperties;
 import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
 import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils;
+import cn.iocoder.yudao.module.bpm.api.definition.BpmModelApi;
 import cn.iocoder.yudao.module.employee.api.EmployeeApi;
 import cn.iocoder.yudao.module.employee.api.dto.EmployeeCreateReqDTO;
 import cn.iocoder.yudao.module.employee.api.dto.EmployeeQueryReqDTO;
@@ -27,7 +28,11 @@ import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthLoginRespVO;
 import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuListReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuTenantRelateSaveReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleSaveReqVO;
-import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.*;
+import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantJoinReqVO;
+import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantPageReqVO;
+import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantRespVO;
+import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantSaveReqVO;
+import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantSimpleRespVO;
 import cn.iocoder.yudao.module.system.controller.admin.user.vo.tenant.UserTenantRelateSaveReqVO;
 import cn.iocoder.yudao.module.system.convert.auth.AuthConvert;
 import cn.iocoder.yudao.module.system.convert.tenant.TenantConvert;
@@ -64,7 +69,10 @@ import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
 import java.time.LocalDateTime;
-import java.util.*;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -112,6 +120,8 @@ public class TenantServiceImpl implements TenantService {
     private AdminAuthService authService;
     @Resource
     private MenuTenantRelateService menuTenantRelateService;
+    @Resource
+    private BpmModelApi bpmModelApi;
 
     @Override
     public List<Long> getTenantIdList() {
@@ -189,6 +199,8 @@ public class TenantServiceImpl implements TenantService {
             permissionService.assignUserRole(user.getId(), singleton(roleId));
             // 修改租户的管理员
             tenantMapper.updateById(new TenantDO().setId(tenant.getId()).setContactUserId(user.getId()));
+            // 复制部署流程(目前共12个)
+            bpmModelApi.copyAndDeploy(null, null);
         });
         TenantSimpleRespVO tenantSimpleRespVO = new TenantSimpleRespVO();
         tenantSimpleRespVO.setId(tenant.getId());