增加动态表单依赖,增加节点与表单字段关联功能
This commit is contained in:
parent
537b74d96c
commit
6a879782de
@ -14,7 +14,7 @@
|
|||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>ink.wgink</groupId>
|
<groupId>ink.wgink</groupId>
|
||||||
<artifactId>common</artifactId>
|
<artifactId>module-form</artifactId>
|
||||||
<version>1.0-SNAPSHOT</version>
|
<version>1.0-SNAPSHOT</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
@ -69,9 +69,9 @@ public class ActivitiController extends DefaultBaseController {
|
|||||||
@ApiImplicitParam(name = "modelId", value = "模型ID", paramType = "path")
|
@ApiImplicitParam(name = "modelId", value = "模型ID", paramType = "path")
|
||||||
})
|
})
|
||||||
@ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
|
@ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
|
||||||
@PutMapping("publish/{modelId}")
|
@PutMapping("deploy/{modelId}")
|
||||||
public SuccessResult publish(@PathVariable("modelId") String modelId) throws IOException {
|
public SuccessResult deploy(@PathVariable("modelId") String modelId) throws IOException {
|
||||||
activitiService.publish(modelId);
|
activitiService.saveDeploy(modelId);
|
||||||
return new SuccessResult();
|
return new SuccessResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,9 +80,9 @@ public class ActivitiController extends DefaultBaseController {
|
|||||||
@ApiImplicitParam(name = "modelId", value = "模型ID", paramType = "path")
|
@ApiImplicitParam(name = "modelId", value = "模型ID", paramType = "path")
|
||||||
})
|
})
|
||||||
@ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
|
@ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
|
||||||
@PutMapping("revoke-publish/{modelId}")
|
@PutMapping("revoke-deploy/{modelId}")
|
||||||
public SuccessResult revokePublish(@PathVariable("modelId") String modelId) {
|
public SuccessResult revokeDeploy(@PathVariable("modelId") String modelId) {
|
||||||
activitiService.revokePublish(modelId);
|
activitiService.revokeDeploy(modelId);
|
||||||
return new SuccessResult();
|
return new SuccessResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@ package ink.wgink.module.activiti.controller.api;
|
|||||||
|
|
||||||
import ink.wgink.common.base.DefaultBaseController;
|
import ink.wgink.common.base.DefaultBaseController;
|
||||||
import ink.wgink.interfaces.consts.ISystemConstant;
|
import ink.wgink.interfaces.consts.ISystemConstant;
|
||||||
|
import ink.wgink.module.activiti.pojo.dtos.ActivitiFlowNodeDTO;
|
||||||
import ink.wgink.module.activiti.pojo.dtos.ActivitiProcdefDTO;
|
import ink.wgink.module.activiti.pojo.dtos.ActivitiProcdefDTO;
|
||||||
import ink.wgink.module.activiti.service.activiti.IActivitiProcdefService;
|
import ink.wgink.module.activiti.service.activiti.IActivitiProcdefService;
|
||||||
import ink.wgink.pojo.ListPage;
|
import ink.wgink.pojo.ListPage;
|
||||||
@ -10,6 +11,7 @@ import ink.wgink.pojo.result.SuccessResultList;
|
|||||||
import io.swagger.annotations.*;
|
import io.swagger.annotations.*;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
@ -41,4 +43,14 @@ public class ActivitiProcdefController extends DefaultBaseController {
|
|||||||
return activitiProcdefService.listPage(page.getPage(), page.getRows());
|
return activitiProcdefService.listPage(page.getPage(), page.getRows());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "通过部署ID获取任务列表", notes = "通过部署ID获取任务列表接口")
|
||||||
|
@ApiImplicitParams({
|
||||||
|
@ApiImplicitParam(name = "deploymentId", value = "部署ID", paramType = "path"),
|
||||||
|
})
|
||||||
|
@ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
|
||||||
|
@GetMapping("list-flow-node/deployment-id/{deploymentId}")
|
||||||
|
public List<ActivitiFlowNodeDTO> listFlowNodeByDefineId(@PathVariable("deploymentId") String deploymentId) {
|
||||||
|
return activitiProcdefService.listFlowNodeByDeploymentId(deploymentId);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,25 @@
|
|||||||
|
package ink.wgink.module.activiti.controller.api.oa;
|
||||||
|
|
||||||
|
import ink.wgink.common.base.DefaultBaseController;
|
||||||
|
import ink.wgink.interfaces.consts.ISystemConstant;
|
||||||
|
import ink.wgink.module.activiti.service.oa.INodeFieldService;
|
||||||
|
import io.swagger.annotations.Api;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description: 表单字段与流程节点
|
||||||
|
* @Author: WenG
|
||||||
|
* @Date: 2022/3/17 19:49
|
||||||
|
* @Version: 1.0
|
||||||
|
**/
|
||||||
|
@Api(tags = ISystemConstant.API_TAGS_SYSTEM_PREFIX + "表单字段与流程节点")
|
||||||
|
@RestController
|
||||||
|
@RequestMapping(ISystemConstant.API_PREFIX + "/node-field")
|
||||||
|
public class NodeFieldController extends DefaultBaseController {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private INodeFieldService nodeFieldService;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
package ink.wgink.module.activiti.dao.oa;
|
||||||
|
|
||||||
|
import ink.wgink.exceptions.RemoveException;
|
||||||
|
import ink.wgink.exceptions.SaveException;
|
||||||
|
import ink.wgink.interfaces.init.IInitBaseTable;
|
||||||
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description: 表单字段与流程节点
|
||||||
|
* @Author: WenG
|
||||||
|
* @Date: 2022/3/17 20:09
|
||||||
|
* @Version: 1.0
|
||||||
|
**/
|
||||||
|
@Repository
|
||||||
|
public interface INodeFieldDao extends IInitBaseTable {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增
|
||||||
|
*
|
||||||
|
* @param params
|
||||||
|
* @throws SaveException
|
||||||
|
*/
|
||||||
|
void save(Map<String, Object> params) throws SaveException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除
|
||||||
|
*
|
||||||
|
* @param params
|
||||||
|
* @throws RemoveException
|
||||||
|
*/
|
||||||
|
void delete(Map<String, Object> params) throws RemoveException;
|
||||||
|
}
|
@ -0,0 +1,56 @@
|
|||||||
|
package ink.wgink.module.activiti.pojo.dtos;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description: 表单节点
|
||||||
|
* @Author: WenG
|
||||||
|
* @Date: 2022/3/17 18:04
|
||||||
|
* @Version: 1.0
|
||||||
|
**/
|
||||||
|
public class ActivitiFlowNodeDTO {
|
||||||
|
|
||||||
|
private String type;
|
||||||
|
private String id;
|
||||||
|
private String name;
|
||||||
|
private String summary;
|
||||||
|
private String formKey;
|
||||||
|
|
||||||
|
public String getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setType(String type) {
|
||||||
|
this.type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(String id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSummary() {
|
||||||
|
return summary;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSummary(String summary) {
|
||||||
|
this.summary = summary;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFormKey() {
|
||||||
|
return formKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFormKey(String formKey) {
|
||||||
|
this.formKey = formKey;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,64 @@
|
|||||||
|
package ink.wgink.module.activiti.pojo.vos.oa;
|
||||||
|
|
||||||
|
import ink.wgink.annotation.CheckEmptyAnnotation;
|
||||||
|
import ink.wgink.annotation.CheckListAnnotation;
|
||||||
|
import ink.wgink.annotation.CheckListBeanAnnotation;
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description: 表单字段与流程节点更新
|
||||||
|
* @Author: WenG
|
||||||
|
* @Date: 2022/3/17 20:12
|
||||||
|
* @Version: 1.0
|
||||||
|
**/
|
||||||
|
@ApiModel
|
||||||
|
public class NodeFieldUpdateVO {
|
||||||
|
|
||||||
|
@ApiModelProperty(name = "deploymentId", value = "部署ID")
|
||||||
|
@CheckEmptyAnnotation(name = "部署ID")
|
||||||
|
private String deploymentId;
|
||||||
|
@ApiModelProperty(name = "formId", value = "表单ID")
|
||||||
|
@CheckEmptyAnnotation(name = "表单ID")
|
||||||
|
private String formId;
|
||||||
|
@ApiModelProperty(name = "flowNodeId", value = "流程节点ID")
|
||||||
|
@CheckEmptyAnnotation(name = "流程节点ID")
|
||||||
|
private String flowNodeId;
|
||||||
|
@CheckListAnnotation(name = "表单字段列表")
|
||||||
|
@CheckListBeanAnnotation
|
||||||
|
private List<NodeFieldVO> formFields;
|
||||||
|
|
||||||
|
public String getDeploymentId() {
|
||||||
|
return deploymentId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDeploymentId(String deploymentId) {
|
||||||
|
this.deploymentId = deploymentId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFormId() {
|
||||||
|
return formId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFormId(String formId) {
|
||||||
|
this.formId = formId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFlowNodeId() {
|
||||||
|
return flowNodeId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFlowNodeId(String flowNodeId) {
|
||||||
|
this.flowNodeId = flowNodeId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<NodeFieldVO> getFormFields() {
|
||||||
|
return formFields;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFormFields(List<NodeFieldVO> formFields) {
|
||||||
|
this.formFields = formFields;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,49 @@
|
|||||||
|
package ink.wgink.module.activiti.pojo.vos.oa;
|
||||||
|
|
||||||
|
import ink.wgink.annotation.CheckEmptyAnnotation;
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description: 表单字段与流程节点
|
||||||
|
* @Author: WenG
|
||||||
|
* @Date: 2022/3/17 19:51
|
||||||
|
* @Version: 1.0
|
||||||
|
**/
|
||||||
|
@ApiModel
|
||||||
|
public class NodeFieldVO {
|
||||||
|
|
||||||
|
@ApiModelProperty(name = "fieldName", value = "字段名")
|
||||||
|
@CheckEmptyAnnotation(name = "字段名")
|
||||||
|
private String fieldName;
|
||||||
|
@ApiModelProperty(name = "isVisible", value = "是否可见")
|
||||||
|
@CheckEmptyAnnotation(name = "是否可见")
|
||||||
|
private Integer isVisible;
|
||||||
|
@ApiModelProperty(name = "isEditable", value = "是否可编辑")
|
||||||
|
@CheckEmptyAnnotation(name = "是否可编辑")
|
||||||
|
private Integer isEditable;
|
||||||
|
|
||||||
|
public String getFieldName() {
|
||||||
|
return fieldName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFieldName(String fieldName) {
|
||||||
|
this.fieldName = fieldName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getIsVisible() {
|
||||||
|
return isVisible;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIsVisible(Integer isVisible) {
|
||||||
|
this.isVisible = isVisible;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getIsEditable() {
|
||||||
|
return isEditable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIsEditable(Integer isEditable) {
|
||||||
|
this.isEditable = isEditable;
|
||||||
|
}
|
||||||
|
}
|
@ -1,7 +1,9 @@
|
|||||||
package ink.wgink.module.activiti.service.activiti;
|
package ink.wgink.module.activiti.service.activiti;
|
||||||
|
|
||||||
|
import ink.wgink.module.activiti.pojo.dtos.ActivitiFlowNodeDTO;
|
||||||
import ink.wgink.module.activiti.pojo.dtos.ActivitiProcdefDTO;
|
import ink.wgink.module.activiti.pojo.dtos.ActivitiProcdefDTO;
|
||||||
import ink.wgink.pojo.result.SuccessResultList;
|
import ink.wgink.pojo.result.SuccessResultList;
|
||||||
|
import org.activiti.bpmn.model.BpmnModel;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -16,4 +18,7 @@ public interface IActivitiProcdefService {
|
|||||||
|
|
||||||
SuccessResultList<List<ActivitiProcdefDTO>> listPage(int page, int rows);
|
SuccessResultList<List<ActivitiProcdefDTO>> listPage(int page, int rows);
|
||||||
|
|
||||||
|
List<ActivitiFlowNodeDTO> listFlowNodeByDeploymentId(String deploymentId);
|
||||||
|
|
||||||
|
List<ActivitiFlowNodeDTO> listFlowNodeByModel(BpmnModel bpmnModel);
|
||||||
}
|
}
|
||||||
|
@ -42,14 +42,14 @@ public interface IActivitiService {
|
|||||||
*
|
*
|
||||||
* @param modelId
|
* @param modelId
|
||||||
*/
|
*/
|
||||||
void publish(String modelId) throws IOException;
|
void saveDeploy(String modelId) throws IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 撤销发布模型
|
* 撤销发布模型
|
||||||
*
|
*
|
||||||
* @param modelId
|
* @param modelId
|
||||||
*/
|
*/
|
||||||
void revokePublish(String modelId);
|
void revokeDeploy(String modelId);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 模型列表
|
* 模型列表
|
||||||
|
@ -1,9 +1,14 @@
|
|||||||
package ink.wgink.module.activiti.service.activiti.impl;
|
package ink.wgink.module.activiti.service.activiti.impl;
|
||||||
|
|
||||||
import ink.wgink.common.base.DefaultBaseService;
|
import ink.wgink.common.base.DefaultBaseService;
|
||||||
|
import ink.wgink.exceptions.SearchException;
|
||||||
|
import ink.wgink.exceptions.base.SystemException;
|
||||||
|
import ink.wgink.module.activiti.pojo.dtos.ActivitiFlowNodeDTO;
|
||||||
import ink.wgink.module.activiti.pojo.dtos.ActivitiProcdefDTO;
|
import ink.wgink.module.activiti.pojo.dtos.ActivitiProcdefDTO;
|
||||||
import ink.wgink.module.activiti.service.activiti.IActivitiProcdefService;
|
import ink.wgink.module.activiti.service.activiti.IActivitiProcdefService;
|
||||||
import ink.wgink.pojo.result.SuccessResultList;
|
import ink.wgink.pojo.result.SuccessResultList;
|
||||||
|
import org.activiti.bpmn.model.Process;
|
||||||
|
import org.activiti.bpmn.model.*;
|
||||||
import org.activiti.engine.RepositoryService;
|
import org.activiti.engine.RepositoryService;
|
||||||
import org.activiti.engine.repository.ProcessDefinition;
|
import org.activiti.engine.repository.ProcessDefinition;
|
||||||
import org.activiti.engine.repository.ProcessDefinitionQuery;
|
import org.activiti.engine.repository.ProcessDefinitionQuery;
|
||||||
@ -38,7 +43,50 @@ public class ActivitiProcdefServiceImpl extends DefaultBaseService implements IA
|
|||||||
BeanUtils.copyProperties(processDefinition, activitiProcdefDTO);
|
BeanUtils.copyProperties(processDefinition, activitiProcdefDTO);
|
||||||
activitiProcdefDTOs.add(activitiProcdefDTO);
|
activitiProcdefDTOs.add(activitiProcdefDTO);
|
||||||
});
|
});
|
||||||
|
|
||||||
return new SuccessResultList<>(activitiProcdefDTOs, page, processDefinitionQuery.count());
|
return new SuccessResultList<>(activitiProcdefDTOs, page, processDefinitionQuery.count());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<ActivitiFlowNodeDTO> listFlowNodeByDeploymentId(String deploymentId) {
|
||||||
|
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deploymentId).singleResult();
|
||||||
|
if (processDefinition == null) {
|
||||||
|
throw new SearchException("流程定义不存在,请检查流程部署情况");
|
||||||
|
}
|
||||||
|
BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinition.getId());
|
||||||
|
return listFlowNodeByModel(bpmnModel);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<ActivitiFlowNodeDTO> listFlowNodeByModel(BpmnModel bpmnModel) {
|
||||||
|
List<Process> processes = bpmnModel.getProcesses();
|
||||||
|
if (processes.size() > 1) {
|
||||||
|
throw new SystemException("流程不能有多条");
|
||||||
|
}
|
||||||
|
List<FlowNode> flowNodes = processes.get(0).findFlowElementsOfType(FlowNode.class);
|
||||||
|
List<ActivitiFlowNodeDTO> activitiFlowNodeDTOs = new ArrayList<>();
|
||||||
|
for (FlowNode flowNode : flowNodes) {
|
||||||
|
ActivitiFlowNodeDTO activitiFlowNodeDTO = new ActivitiFlowNodeDTO();
|
||||||
|
activitiFlowNodeDTO.setId(flowNode.getId());
|
||||||
|
activitiFlowNodeDTO.setName(flowNode.getName());
|
||||||
|
activitiFlowNodeDTO.setSummary(flowNode.getDocumentation());
|
||||||
|
if (flowNode instanceof StartEvent) {
|
||||||
|
StartEvent startEvent = (StartEvent) flowNode;
|
||||||
|
activitiFlowNodeDTO.setFormKey(startEvent.getFormKey());
|
||||||
|
activitiFlowNodeDTO.setType(StartEvent.class.getSimpleName());
|
||||||
|
} else if (flowNode instanceof EndEvent) {
|
||||||
|
activitiFlowNodeDTO.setType(EndEvent.class.getSimpleName());
|
||||||
|
} else if (flowNode instanceof UserTask) {
|
||||||
|
UserTask userTask = (UserTask) flowNode;
|
||||||
|
activitiFlowNodeDTO.setFormKey(userTask.getFormKey());
|
||||||
|
activitiFlowNodeDTO.setType(UserTask.class.getSimpleName());
|
||||||
|
} else {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
activitiFlowNodeDTOs.add(activitiFlowNodeDTO);
|
||||||
|
}
|
||||||
|
return activitiFlowNodeDTOs;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -6,11 +6,22 @@ import com.fasterxml.jackson.databind.ObjectMapper;
|
|||||||
import ink.wgink.common.base.DefaultBaseService;
|
import ink.wgink.common.base.DefaultBaseService;
|
||||||
import ink.wgink.exceptions.RemoveException;
|
import ink.wgink.exceptions.RemoveException;
|
||||||
import ink.wgink.exceptions.SearchException;
|
import ink.wgink.exceptions.SearchException;
|
||||||
|
import ink.wgink.exceptions.base.SystemException;
|
||||||
import ink.wgink.interfaces.consts.ISystemConstant;
|
import ink.wgink.interfaces.consts.ISystemConstant;
|
||||||
|
import ink.wgink.module.activiti.pojo.dtos.ActivitiFlowNodeDTO;
|
||||||
import ink.wgink.module.activiti.pojo.vos.ActivitiVO;
|
import ink.wgink.module.activiti.pojo.vos.ActivitiVO;
|
||||||
|
import ink.wgink.module.activiti.pojo.vos.oa.NodeFieldUpdateVO;
|
||||||
|
import ink.wgink.module.activiti.pojo.vos.oa.NodeFieldVO;
|
||||||
|
import ink.wgink.module.activiti.service.activiti.IActivitiProcdefService;
|
||||||
import ink.wgink.module.activiti.service.activiti.IActivitiService;
|
import ink.wgink.module.activiti.service.activiti.IActivitiService;
|
||||||
|
import ink.wgink.module.activiti.service.oa.INodeFieldService;
|
||||||
|
import ink.wgink.module.form.pojo.pos.design.FormFieldPO;
|
||||||
|
import ink.wgink.module.form.pojo.pos.design.FormPO;
|
||||||
|
import ink.wgink.module.form.service.design.IFormFieldService;
|
||||||
|
import ink.wgink.module.form.service.design.IFormService;
|
||||||
import ink.wgink.pojo.result.SuccessResultList;
|
import ink.wgink.pojo.result.SuccessResultList;
|
||||||
import org.activiti.bpmn.model.BpmnModel;
|
import org.activiti.bpmn.model.BpmnModel;
|
||||||
|
import org.activiti.bpmn.model.StartEvent;
|
||||||
import org.activiti.editor.constants.ModelDataJsonConstants;
|
import org.activiti.editor.constants.ModelDataJsonConstants;
|
||||||
import org.activiti.editor.language.json.converter.BpmnJsonConverter;
|
import org.activiti.editor.language.json.converter.BpmnJsonConverter;
|
||||||
import org.activiti.engine.HistoryService;
|
import org.activiti.engine.HistoryService;
|
||||||
@ -25,6 +36,7 @@ import org.springframework.stereotype.Service;
|
|||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -46,6 +58,14 @@ public class ActivitiServiceImpl extends DefaultBaseService implements IActiviti
|
|||||||
private HistoryService historyService;
|
private HistoryService historyService;
|
||||||
@Autowired
|
@Autowired
|
||||||
private RuntimeService runtimeService;
|
private RuntimeService runtimeService;
|
||||||
|
@Autowired
|
||||||
|
private IActivitiProcdefService activitiProcdefService;
|
||||||
|
@Autowired
|
||||||
|
private INodeFieldService nodeFieldService;
|
||||||
|
@Autowired
|
||||||
|
private IFormService formService;
|
||||||
|
@Autowired
|
||||||
|
private IFormFieldService formFieldService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String create(ActivitiVO activitiVO) throws UnsupportedEncodingException {
|
public String create(ActivitiVO activitiVO) throws UnsupportedEncodingException {
|
||||||
@ -77,7 +97,7 @@ public class ActivitiServiceImpl extends DefaultBaseService implements IActiviti
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void publish(String modelId) throws IOException {
|
public void saveDeploy(String modelId) throws IOException {
|
||||||
Model model = repositoryService.getModel(modelId);
|
Model model = repositoryService.getModel(modelId);
|
||||||
if (model == null) {
|
if (model == null) {
|
||||||
throw new SearchException("模型不存在");
|
throw new SearchException("模型不存在");
|
||||||
@ -86,6 +106,7 @@ public class ActivitiServiceImpl extends DefaultBaseService implements IActiviti
|
|||||||
if (modelEditorSource == null) {
|
if (modelEditorSource == null) {
|
||||||
throw new SearchException("模型数据不存在");
|
throw new SearchException("模型数据不存在");
|
||||||
}
|
}
|
||||||
|
LOG.debug("部署流程");
|
||||||
JsonNode modelNode = new ObjectMapper().readTree(modelEditorSource);
|
JsonNode modelNode = new ObjectMapper().readTree(modelEditorSource);
|
||||||
BpmnModel bpmnModel = new BpmnJsonConverter().convertToBpmnModel(modelNode);
|
BpmnModel bpmnModel = new BpmnJsonConverter().convertToBpmnModel(modelNode);
|
||||||
Deployment deployment = repositoryService.createDeployment()
|
Deployment deployment = repositoryService.createDeployment()
|
||||||
@ -95,10 +116,62 @@ public class ActivitiServiceImpl extends DefaultBaseService implements IActiviti
|
|||||||
.deploy();
|
.deploy();
|
||||||
model.setDeploymentId(deployment.getId());
|
model.setDeploymentId(deployment.getId());
|
||||||
repositoryService.saveModel(model);
|
repositoryService.saveModel(model);
|
||||||
|
LOG.debug("节点关联表单");
|
||||||
|
saveNodeField(deployment.getId(), bpmnModel);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存节点与表单字段
|
||||||
|
*
|
||||||
|
* @param deploymentId
|
||||||
|
*/
|
||||||
|
private void saveNodeField(String deploymentId, BpmnModel bpmnModel) {
|
||||||
|
List<ActivitiFlowNodeDTO> activitiFlowNodeDTOs = activitiProcdefService.listFlowNodeByModel(bpmnModel);
|
||||||
|
if (activitiFlowNodeDTOs.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
String formKey = getFormIdByStartEvent(activitiFlowNodeDTOs);
|
||||||
|
if (StringUtils.isBlank(formKey)) {
|
||||||
|
LOG.debug("开始节点未绑定表单");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
FormPO formPO = formService.getPO(formKey);
|
||||||
|
if (formPO == null) {
|
||||||
|
throw new SystemException("表单不存在");
|
||||||
|
}
|
||||||
|
List<FormFieldPO> formFieldPOs = formFieldService.listPO(formPO.getFormId());
|
||||||
|
if (formFieldPOs.isEmpty()) {
|
||||||
|
throw new SystemException("表单字段为空");
|
||||||
|
}
|
||||||
|
activitiFlowNodeDTOs.forEach(activitiFlowNodeDTO -> {
|
||||||
|
NodeFieldUpdateVO nodeFieldUpdateVO = new NodeFieldUpdateVO();
|
||||||
|
nodeFieldUpdateVO.setFlowNodeId(activitiFlowNodeDTO.getId());
|
||||||
|
nodeFieldUpdateVO.setFormId(formPO.getFormId());
|
||||||
|
nodeFieldUpdateVO.setDeploymentId(deploymentId);
|
||||||
|
List<NodeFieldVO> nodeFieldVOs = new ArrayList<>();
|
||||||
|
formFieldPOs.forEach(formFieldPO -> {
|
||||||
|
NodeFieldVO nodeFieldVO = new NodeFieldVO();
|
||||||
|
nodeFieldVO.setFieldName(formFieldPO.getFieldName());
|
||||||
|
nodeFieldVO.setIsVisible(1);
|
||||||
|
nodeFieldVO.setIsEditable(1);
|
||||||
|
nodeFieldVOs.add(nodeFieldVO);
|
||||||
|
});
|
||||||
|
nodeFieldUpdateVO.setFormFields(nodeFieldVOs);
|
||||||
|
nodeFieldService.save(nodeFieldUpdateVO);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getFormIdByStartEvent(List<ActivitiFlowNodeDTO> activitiFlowNodeDTOs) {
|
||||||
|
for (ActivitiFlowNodeDTO activitiFlowNodeDTO : activitiFlowNodeDTOs) {
|
||||||
|
if (StringUtils.equals(activitiFlowNodeDTO.getType(), StartEvent.class.getSimpleName())) {
|
||||||
|
return activitiFlowNodeDTO.getFormKey();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void revokePublish(String modelId) {
|
public void revokeDeploy(String modelId) {
|
||||||
Model modelData = repositoryService.getModel(modelId);
|
Model modelData = repositoryService.getModel(modelId);
|
||||||
if (modelData == null) {
|
if (modelData == null) {
|
||||||
throw new SearchException("模型不存在");
|
throw new SearchException("模型不存在");
|
||||||
@ -147,7 +220,7 @@ public class ActivitiServiceImpl extends DefaultBaseService implements IActiviti
|
|||||||
editorObject.put("resourceId", "canvas");
|
editorObject.put("resourceId", "canvas");
|
||||||
|
|
||||||
JSONObject stencilSetObject = new JSONObject();
|
JSONObject stencilSetObject = new JSONObject();
|
||||||
stencilSetObject.put("namespace", "http://b3mn.org/stencilset/bpmn2.0#");
|
stencilSetObject.put("namespace", "wgink");
|
||||||
|
|
||||||
editorObject.put("stencilset", stencilSetObject);
|
editorObject.put("stencilset", stencilSetObject);
|
||||||
repositoryService.addModelEditorSource(modelId, editorObject.toString().getBytes(ISystemConstant.CHARSET_UTF8));
|
repositoryService.addModelEditorSource(modelId, editorObject.toString().getBytes(ISystemConstant.CHARSET_UTF8));
|
||||||
|
@ -0,0 +1,20 @@
|
|||||||
|
package ink.wgink.module.activiti.service.oa;
|
||||||
|
|
||||||
|
import ink.wgink.module.activiti.pojo.vos.oa.NodeFieldUpdateVO;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description: 表单字段与流程节点
|
||||||
|
* @Author: WenG
|
||||||
|
* @Date: 2022/3/17 20:08
|
||||||
|
* @Version: 1.0
|
||||||
|
**/
|
||||||
|
public interface INodeFieldService {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增绑定
|
||||||
|
*
|
||||||
|
* @param nodeFieldUpdateVO
|
||||||
|
*/
|
||||||
|
void save(NodeFieldUpdateVO nodeFieldUpdateVO);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,71 @@
|
|||||||
|
package ink.wgink.module.activiti.service.oa.impl;
|
||||||
|
|
||||||
|
import ink.wgink.common.base.DefaultBaseService;
|
||||||
|
import ink.wgink.module.activiti.dao.oa.INodeFieldDao;
|
||||||
|
import ink.wgink.module.activiti.pojo.vos.oa.NodeFieldUpdateVO;
|
||||||
|
import ink.wgink.module.activiti.pojo.vos.oa.NodeFieldVO;
|
||||||
|
import ink.wgink.module.activiti.service.oa.INodeFieldService;
|
||||||
|
import ink.wgink.util.UUIDUtil;
|
||||||
|
import ink.wgink.util.map.HashMapUtil;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description: 表单字段与流程节点
|
||||||
|
* @Author: WenG
|
||||||
|
* @Date: 2022/3/17 20:09
|
||||||
|
* @Version: 1.0
|
||||||
|
**/
|
||||||
|
@Service
|
||||||
|
public class NodeFieldFieldServiceImpl extends DefaultBaseService implements INodeFieldService {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private INodeFieldDao nodeFieldDao;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void save(NodeFieldUpdateVO nodeFieldUpdateVO) {
|
||||||
|
LOG.debug("删除原有配置");
|
||||||
|
delete(nodeFieldUpdateVO.getDeploymentId(), nodeFieldUpdateVO.getFormId(), nodeFieldUpdateVO.getFlowNodeId());
|
||||||
|
LOG.debug("新增现有配置");
|
||||||
|
save(nodeFieldUpdateVO.getDeploymentId(), nodeFieldUpdateVO.getFormId(), nodeFieldUpdateVO.getFlowNodeId(), nodeFieldUpdateVO.getFormFields());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存
|
||||||
|
*
|
||||||
|
* @param deploymentId
|
||||||
|
* @param formId
|
||||||
|
* @param flowNodeId
|
||||||
|
* @param formFields
|
||||||
|
*/
|
||||||
|
private void save(String deploymentId, String formId, String flowNodeId, List<NodeFieldVO> formFields) {
|
||||||
|
formFields.forEach(nodeFieldVO -> {
|
||||||
|
Map<String, Object> params = HashMapUtil.beanToMap(nodeFieldVO);
|
||||||
|
params.put("nodeFieldId", UUIDUtil.getUUID());
|
||||||
|
params.put("deploymentId", deploymentId);
|
||||||
|
params.put("formId", formId);
|
||||||
|
params.put("flowNodeId", flowNodeId);
|
||||||
|
nodeFieldDao.save(params);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除
|
||||||
|
*
|
||||||
|
* @param deploymentId 部署ID
|
||||||
|
* @param formId 表单ID
|
||||||
|
* @param flowNodeId 流程节点ID
|
||||||
|
*/
|
||||||
|
private void delete(String deploymentId, String formId, String flowNodeId) {
|
||||||
|
Map<String, Object> params = getHashMap(6);
|
||||||
|
params.put("deploymentId", deploymentId);
|
||||||
|
params.put("formId", formId);
|
||||||
|
params.put("flowNodeId", flowNodeId);
|
||||||
|
|
||||||
|
nodeFieldDao.delete(params);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,56 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
|
<mapper namespace="ink.wgink.module.activiti.dao.oa.INodeFieldDao">
|
||||||
|
|
||||||
|
<update id="createTable">
|
||||||
|
CREATE TABLE IF NOT EXISTS `oa_node_field` (
|
||||||
|
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
|
||||||
|
`node_field_id` char(36) DEFAULT NULL COMMENT '主键',
|
||||||
|
`deployment_id` char(36) DEFAULT NULL COMMENT '流程部署ID',
|
||||||
|
`form_id` char(36) DEFAULT NULL COMMENT '表单ID',
|
||||||
|
`flow_node_id` char(60) DEFAULT NULL COMMENT '流程节点ID',
|
||||||
|
`field_name` varchar(255) DEFAULT NULL COMMENT '字段名',
|
||||||
|
`is_visible` int(1) DEFAULT '1' COMMENT '是否可见',
|
||||||
|
`is_editable` int(1) DEFAULT '1' COMMENT '是否可编辑',
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='节点字段绑定';
|
||||||
|
</update>
|
||||||
|
|
||||||
|
<!-- 新增 -->
|
||||||
|
<insert id="save" parameterType="map">
|
||||||
|
INSERT INTO oa_node_field(
|
||||||
|
node_field_id,
|
||||||
|
deployment_id,
|
||||||
|
form_id,
|
||||||
|
flow_node_id,
|
||||||
|
field_name,
|
||||||
|
is_visible,
|
||||||
|
is_editable
|
||||||
|
) VALUES(
|
||||||
|
#{nodeFieldId},
|
||||||
|
#{deploymentId},
|
||||||
|
#{formId},
|
||||||
|
#{flowNodeId},
|
||||||
|
#{fieldName},
|
||||||
|
#{isVisible},
|
||||||
|
#{isEditable}
|
||||||
|
)
|
||||||
|
</insert>
|
||||||
|
|
||||||
|
<!-- 删除 -->
|
||||||
|
<delete id="delete" parameterType="map">
|
||||||
|
DELETE FROM
|
||||||
|
oa_node_field
|
||||||
|
WHERE
|
||||||
|
deployment_id = #{deploymentId}
|
||||||
|
<if test="formId != null and formId != ''">
|
||||||
|
AND
|
||||||
|
form_id = #{formId}
|
||||||
|
</if>
|
||||||
|
<if test="flowNodeId != null and flowNodeId != ''">
|
||||||
|
AND
|
||||||
|
flow_node_id = #{flowNodeId}
|
||||||
|
</if>
|
||||||
|
</delete>
|
||||||
|
|
||||||
|
</mapper>
|
@ -127,7 +127,7 @@
|
|||||||
},
|
},
|
||||||
{field: 'option2', width: 80, title: '操作', align:'center', fixed: 'right',
|
{field: 'option2', width: 80, title: '操作', align:'center', fixed: 'right',
|
||||||
templet: function(row) {
|
templet: function(row) {
|
||||||
return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="publishEvent">部署</button>';
|
return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="deployEvent">部署</button>';
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
@ -233,11 +233,11 @@
|
|||||||
table.on('tool(dataTable)', function(obj) {
|
table.on('tool(dataTable)', function(obj) {
|
||||||
var data = obj.data;
|
var data = obj.data;
|
||||||
var layEvent = obj.event;
|
var layEvent = obj.event;
|
||||||
if(layEvent === 'publishEvent') {
|
if(layEvent === 'deployEvent') {
|
||||||
top.dialog.confirm('确定 部署 流程?', function(index) {
|
top.dialog.confirm('确定 部署 流程?', function(index) {
|
||||||
top.dialog.close(index);
|
top.dialog.close(index);
|
||||||
var loadLayerIndex;
|
var loadLayerIndex;
|
||||||
top.restAjax.put(top.restAjax.path('api/activiti/publish/{modelId}', [data.id]), {}, null, function(code, data) {
|
top.restAjax.put(top.restAjax.path('api/activiti/deploy/{modelId}', [data.id]), {}, null, function(code, data) {
|
||||||
top.dialog.msg('操作成功');
|
top.dialog.msg('操作成功');
|
||||||
reloadTable();
|
reloadTable();
|
||||||
}, function(code, data) {
|
}, function(code, data) {
|
||||||
|
@ -135,6 +135,14 @@
|
|||||||
}
|
}
|
||||||
return '<button class="layui-btn layui-btn-xs" lay-event="flowChatEvent">查看</button>';
|
return '<button class="layui-btn layui-btn-xs" lay-event="flowChatEvent">查看</button>';
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{field: 'form', width: 180, title: '操作', align:'center', fixed: 'right',
|
||||||
|
templet: function(row) {
|
||||||
|
return '<div class="layui-btn-group">' +
|
||||||
|
'<button class="layui-btn layui-btn-xs" lay-event="bindFormEvent">绑定表单</button>'+
|
||||||
|
'<button class="layui-btn layui-btn-primary layui-btn-xs" lay-event="bindFormEvent">节点管理</button>'+
|
||||||
|
'</div>';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
@ -189,6 +197,8 @@
|
|||||||
height: '400px',
|
height: '400px',
|
||||||
onClose: function() {}
|
onClose: function() {}
|
||||||
});
|
});
|
||||||
|
} else if(layEvent === 'bindFormEvent') {
|
||||||
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user