From 6a879782deea9518105901259be1cba1e9293dcb Mon Sep 17 00:00:00 2001 From: WenG <450292408@qq.com> Date: Thu, 17 Mar 2022 23:11:57 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=8A=A8=E6=80=81=E8=A1=A8?= =?UTF-8?q?=E5=8D=95=E4=BE=9D=E8=B5=96=EF=BC=8C=E5=A2=9E=E5=8A=A0=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E4=B8=8E=E8=A1=A8=E5=8D=95=E5=AD=97=E6=AE=B5=E5=85=B3?= =?UTF-8?q?=E8=81=94=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module-activiti/pom.xml | 2 +- .../controller/api/ActivitiController.java | 12 +-- .../api/ActivitiProcdefController.java | 12 +++ .../api/oa/NodeFieldController.java | 25 ++++++ .../module/activiti/dao/oa/INodeFieldDao.java | 34 ++++++++ .../pojo/dtos/ActivitiFlowNodeDTO.java | 56 +++++++++++++ .../pojo/vos/oa/NodeFieldUpdateVO.java | 64 +++++++++++++++ .../activiti/pojo/vos/oa/NodeFieldVO.java | 49 ++++++++++++ .../activiti/IActivitiProcdefService.java | 5 ++ .../service/activiti/IActivitiService.java | 4 +- .../impl/ActivitiProcdefServiceImpl.java | 48 +++++++++++ .../activiti/impl/ActivitiServiceImpl.java | 79 ++++++++++++++++++- .../service/oa/INodeFieldService.java | 20 +++++ .../oa/impl/NodeFieldFieldServiceImpl.java | 71 +++++++++++++++++ .../mybatis/mapper/oa/node-field-mapper.xml | 56 +++++++++++++ .../resources/templates/activiti/list.html | 6 +- .../templates/activiti/procdef/list.html | 10 +++ 17 files changed, 538 insertions(+), 15 deletions(-) create mode 100644 module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/oa/NodeFieldController.java create mode 100644 module-activiti/src/main/java/ink/wgink/module/activiti/dao/oa/INodeFieldDao.java create mode 100644 module-activiti/src/main/java/ink/wgink/module/activiti/pojo/dtos/ActivitiFlowNodeDTO.java create mode 100644 module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/NodeFieldUpdateVO.java create mode 100644 module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/NodeFieldVO.java create mode 100644 module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/INodeFieldService.java create mode 100644 module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/impl/NodeFieldFieldServiceImpl.java create mode 100644 module-activiti/src/main/resources/mybatis/mapper/oa/node-field-mapper.xml diff --git a/module-activiti/pom.xml b/module-activiti/pom.xml index b5ee54c3..f7786f87 100644 --- a/module-activiti/pom.xml +++ b/module-activiti/pom.xml @@ -14,7 +14,7 @@ ink.wgink - common + module-form 1.0-SNAPSHOT diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/ActivitiController.java b/module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/ActivitiController.java index 5d931620..099a3415 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/ActivitiController.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/ActivitiController.java @@ -69,9 +69,9 @@ public class ActivitiController extends DefaultBaseController { @ApiImplicitParam(name = "modelId", value = "模型ID", paramType = "path") }) @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) - @PutMapping("publish/{modelId}") - public SuccessResult publish(@PathVariable("modelId") String modelId) throws IOException { - activitiService.publish(modelId); + @PutMapping("deploy/{modelId}") + public SuccessResult deploy(@PathVariable("modelId") String modelId) throws IOException { + activitiService.saveDeploy(modelId); return new SuccessResult(); } @@ -80,9 +80,9 @@ public class ActivitiController extends DefaultBaseController { @ApiImplicitParam(name = "modelId", value = "模型ID", paramType = "path") }) @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) - @PutMapping("revoke-publish/{modelId}") - public SuccessResult revokePublish(@PathVariable("modelId") String modelId) { - activitiService.revokePublish(modelId); + @PutMapping("revoke-deploy/{modelId}") + public SuccessResult revokeDeploy(@PathVariable("modelId") String modelId) { + activitiService.revokeDeploy(modelId); return new SuccessResult(); } diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/ActivitiProcdefController.java b/module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/ActivitiProcdefController.java index 4def28ba..e4fa0ba7 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/ActivitiProcdefController.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/ActivitiProcdefController.java @@ -2,6 +2,7 @@ package ink.wgink.module.activiti.controller.api; import ink.wgink.common.base.DefaultBaseController; 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.service.activiti.IActivitiProcdefService; import ink.wgink.pojo.ListPage; @@ -10,6 +11,7 @@ import ink.wgink.pojo.result.SuccessResultList; import io.swagger.annotations.*; import org.springframework.beans.factory.annotation.Autowired; 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.RestController; @@ -41,4 +43,14 @@ public class ActivitiProcdefController extends DefaultBaseController { 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 listFlowNodeByDefineId(@PathVariable("deploymentId") String deploymentId) { + return activitiProcdefService.listFlowNodeByDeploymentId(deploymentId); + } + } diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/oa/NodeFieldController.java b/module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/oa/NodeFieldController.java new file mode 100644 index 00000000..4e81c7ca --- /dev/null +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/oa/NodeFieldController.java @@ -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; + +} diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/dao/oa/INodeFieldDao.java b/module-activiti/src/main/java/ink/wgink/module/activiti/dao/oa/INodeFieldDao.java new file mode 100644 index 00000000..b61ef714 --- /dev/null +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/dao/oa/INodeFieldDao.java @@ -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 params) throws SaveException; + + /** + * 删除 + * + * @param params + * @throws RemoveException + */ + void delete(Map params) throws RemoveException; +} diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/dtos/ActivitiFlowNodeDTO.java b/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/dtos/ActivitiFlowNodeDTO.java new file mode 100644 index 00000000..ec465b2f --- /dev/null +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/dtos/ActivitiFlowNodeDTO.java @@ -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; + } +} diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/NodeFieldUpdateVO.java b/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/NodeFieldUpdateVO.java new file mode 100644 index 00000000..24141d25 --- /dev/null +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/NodeFieldUpdateVO.java @@ -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 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 getFormFields() { + return formFields; + } + + public void setFormFields(List formFields) { + this.formFields = formFields; + } +} diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/NodeFieldVO.java b/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/NodeFieldVO.java new file mode 100644 index 00000000..835e23b6 --- /dev/null +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/NodeFieldVO.java @@ -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; + } +} \ No newline at end of file diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/IActivitiProcdefService.java b/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/IActivitiProcdefService.java index 9daa321a..a5e65bf8 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/IActivitiProcdefService.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/IActivitiProcdefService.java @@ -1,7 +1,9 @@ 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.pojo.result.SuccessResultList; +import org.activiti.bpmn.model.BpmnModel; import java.util.List; @@ -16,4 +18,7 @@ public interface IActivitiProcdefService { SuccessResultList> listPage(int page, int rows); + List listFlowNodeByDeploymentId(String deploymentId); + + List listFlowNodeByModel(BpmnModel bpmnModel); } diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/IActivitiService.java b/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/IActivitiService.java index 73e6a291..132e2428 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/IActivitiService.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/IActivitiService.java @@ -42,14 +42,14 @@ public interface IActivitiService { * * @param modelId */ - void publish(String modelId) throws IOException; + void saveDeploy(String modelId) throws IOException; /** * 撤销发布模型 * * @param modelId */ - void revokePublish(String modelId); + void revokeDeploy(String modelId); /** * 模型列表 diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/impl/ActivitiProcdefServiceImpl.java b/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/impl/ActivitiProcdefServiceImpl.java index ee964865..f548ffe2 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/impl/ActivitiProcdefServiceImpl.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/impl/ActivitiProcdefServiceImpl.java @@ -1,9 +1,14 @@ package ink.wgink.module.activiti.service.activiti.impl; 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.service.activiti.IActivitiProcdefService; 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.repository.ProcessDefinition; import org.activiti.engine.repository.ProcessDefinitionQuery; @@ -38,7 +43,50 @@ public class ActivitiProcdefServiceImpl extends DefaultBaseService implements IA BeanUtils.copyProperties(processDefinition, activitiProcdefDTO); activitiProcdefDTOs.add(activitiProcdefDTO); }); + return new SuccessResultList<>(activitiProcdefDTOs, page, processDefinitionQuery.count()); } + @Override + public List 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 listFlowNodeByModel(BpmnModel bpmnModel) { + List processes = bpmnModel.getProcesses(); + if (processes.size() > 1) { + throw new SystemException("流程不能有多条"); + } + List flowNodes = processes.get(0).findFlowElementsOfType(FlowNode.class); + List 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; + } + + } diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/impl/ActivitiServiceImpl.java b/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/impl/ActivitiServiceImpl.java index 03d8a778..6354f0b4 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/impl/ActivitiServiceImpl.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/impl/ActivitiServiceImpl.java @@ -6,11 +6,22 @@ import com.fasterxml.jackson.databind.ObjectMapper; import ink.wgink.common.base.DefaultBaseService; import ink.wgink.exceptions.RemoveException; import ink.wgink.exceptions.SearchException; +import ink.wgink.exceptions.base.SystemException; 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.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.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 org.activiti.bpmn.model.BpmnModel; +import org.activiti.bpmn.model.StartEvent; import org.activiti.editor.constants.ModelDataJsonConstants; import org.activiti.editor.language.json.converter.BpmnJsonConverter; import org.activiti.engine.HistoryService; @@ -25,6 +36,7 @@ import org.springframework.stereotype.Service; import java.io.IOException; import java.io.UnsupportedEncodingException; +import java.util.ArrayList; import java.util.List; /** @@ -46,6 +58,14 @@ public class ActivitiServiceImpl extends DefaultBaseService implements IActiviti private HistoryService historyService; @Autowired private RuntimeService runtimeService; + @Autowired + private IActivitiProcdefService activitiProcdefService; + @Autowired + private INodeFieldService nodeFieldService; + @Autowired + private IFormService formService; + @Autowired + private IFormFieldService formFieldService; @Override public String create(ActivitiVO activitiVO) throws UnsupportedEncodingException { @@ -77,7 +97,7 @@ public class ActivitiServiceImpl extends DefaultBaseService implements IActiviti } @Override - public void publish(String modelId) throws IOException { + public void saveDeploy(String modelId) throws IOException { Model model = repositoryService.getModel(modelId); if (model == null) { throw new SearchException("模型不存在"); @@ -86,6 +106,7 @@ public class ActivitiServiceImpl extends DefaultBaseService implements IActiviti if (modelEditorSource == null) { throw new SearchException("模型数据不存在"); } + LOG.debug("部署流程"); JsonNode modelNode = new ObjectMapper().readTree(modelEditorSource); BpmnModel bpmnModel = new BpmnJsonConverter().convertToBpmnModel(modelNode); Deployment deployment = repositoryService.createDeployment() @@ -95,10 +116,62 @@ public class ActivitiServiceImpl extends DefaultBaseService implements IActiviti .deploy(); model.setDeploymentId(deployment.getId()); repositoryService.saveModel(model); + LOG.debug("节点关联表单"); + saveNodeField(deployment.getId(), bpmnModel); + } + + /** + * 保存节点与表单字段 + * + * @param deploymentId + */ + private void saveNodeField(String deploymentId, BpmnModel bpmnModel) { + List 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 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 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 activitiFlowNodeDTOs) { + for (ActivitiFlowNodeDTO activitiFlowNodeDTO : activitiFlowNodeDTOs) { + if (StringUtils.equals(activitiFlowNodeDTO.getType(), StartEvent.class.getSimpleName())) { + return activitiFlowNodeDTO.getFormKey(); + } + } + return null; } @Override - public void revokePublish(String modelId) { + public void revokeDeploy(String modelId) { Model modelData = repositoryService.getModel(modelId); if (modelData == null) { throw new SearchException("模型不存在"); @@ -147,7 +220,7 @@ public class ActivitiServiceImpl extends DefaultBaseService implements IActiviti editorObject.put("resourceId", "canvas"); JSONObject stencilSetObject = new JSONObject(); - stencilSetObject.put("namespace", "http://b3mn.org/stencilset/bpmn2.0#"); + stencilSetObject.put("namespace", "wgink"); editorObject.put("stencilset", stencilSetObject); repositoryService.addModelEditorSource(modelId, editorObject.toString().getBytes(ISystemConstant.CHARSET_UTF8)); diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/INodeFieldService.java b/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/INodeFieldService.java new file mode 100644 index 00000000..79bc685a --- /dev/null +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/INodeFieldService.java @@ -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); + +} diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/impl/NodeFieldFieldServiceImpl.java b/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/impl/NodeFieldFieldServiceImpl.java new file mode 100644 index 00000000..01094455 --- /dev/null +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/impl/NodeFieldFieldServiceImpl.java @@ -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 formFields) { + formFields.forEach(nodeFieldVO -> { + Map 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 params = getHashMap(6); + params.put("deploymentId", deploymentId); + params.put("formId", formId); + params.put("flowNodeId", flowNodeId); + + nodeFieldDao.delete(params); + } + +} diff --git a/module-activiti/src/main/resources/mybatis/mapper/oa/node-field-mapper.xml b/module-activiti/src/main/resources/mybatis/mapper/oa/node-field-mapper.xml new file mode 100644 index 00000000..8c2fc734 --- /dev/null +++ b/module-activiti/src/main/resources/mybatis/mapper/oa/node-field-mapper.xml @@ -0,0 +1,56 @@ + + + + + + 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='节点字段绑定'; + + + + + 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} + ) + + + + + DELETE FROM + oa_node_field + WHERE + deployment_id = #{deploymentId} + + AND + form_id = #{formId} + + + AND + flow_node_id = #{flowNodeId} + + + + \ No newline at end of file diff --git a/module-activiti/src/main/resources/templates/activiti/list.html b/module-activiti/src/main/resources/templates/activiti/list.html index 71325a23..cdde9e7a 100644 --- a/module-activiti/src/main/resources/templates/activiti/list.html +++ b/module-activiti/src/main/resources/templates/activiti/list.html @@ -127,7 +127,7 @@ }, {field: 'option2', width: 80, title: '操作', align:'center', fixed: 'right', templet: function(row) { - return ''; + return ''; } }, ] @@ -233,11 +233,11 @@ table.on('tool(dataTable)', function(obj) { var data = obj.data; var layEvent = obj.event; - if(layEvent === 'publishEvent') { + if(layEvent === 'deployEvent') { top.dialog.confirm('确定 部署 流程?', function(index) { top.dialog.close(index); 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('操作成功'); reloadTable(); }, function(code, data) { diff --git a/module-activiti/src/main/resources/templates/activiti/procdef/list.html b/module-activiti/src/main/resources/templates/activiti/procdef/list.html index 517ffd38..fd564548 100644 --- a/module-activiti/src/main/resources/templates/activiti/procdef/list.html +++ b/module-activiti/src/main/resources/templates/activiti/procdef/list.html @@ -135,6 +135,14 @@ } return ''; } + }, + {field: 'form', width: 180, title: '操作', align:'center', fixed: 'right', + templet: function(row) { + return '
' + + ''+ + ''+ + '
'; + } } ] ], @@ -189,6 +197,8 @@ height: '400px', onClose: function() {} }); + } else if(layEvent === 'bindFormEvent') { + } }); });