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 099a3415..ce499498 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 @@ -53,17 +53,6 @@ public class ActivitiController extends DefaultBaseController { return new SuccessResultData<>(activitiService.create(activitiVO)); } - @ApiOperation(value = "删除模型", notes = "删除模型接口") - @ApiImplicitParams({ - @ApiImplicitParam(name = "modelId", value = "模型ID", paramType = "path") - }) - @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) - @DeleteMapping("delete/{modelId}") - public SuccessResult delete(@PathVariable("modelId") String modelId) { - activitiService.delete(modelId); - return new SuccessResult(); - } - @ApiOperation(value = "发布模型", notes = "发布模型接口") @ApiImplicitParams({ @ApiImplicitParam(name = "modelId", value = "模型ID", paramType = "path") diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/ActivitiModelController.java b/module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/ActivitiModelController.java index 556ca002..b71774b2 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/ActivitiModelController.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/ActivitiModelController.java @@ -53,7 +53,18 @@ public class ActivitiModelController extends DefaultBaseController { if (RegexUtil.isChinese(activitiModelVO.getName())) { throw new ParamsException("名称不能有中文"); } - activitiModelService.saveModel(modelId, activitiModelVO.getName(), activitiModelVO.getDescription(), activitiModelVO.getJsonXml(), activitiModelVO.getSvgXml()); + activitiModelService.save(modelId, activitiModelVO); + return new SuccessResult(); + } + + @ApiOperation(value = "删除模型", notes = "删除模型接口") + @ApiImplicitParams({ + @ApiImplicitParam(name = "modelId", value = "模型ID", paramType = "path") + }) + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @DeleteMapping("delete/{modelId}") + public SuccessResult delete(@PathVariable("modelId") String modelId) { + activitiModelService.delete(modelId); return new SuccessResult(); } diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/dao/oa/INodeAssigneeDao.java b/module-activiti/src/main/java/ink/wgink/module/activiti/dao/oa/INodeAssigneeDao.java new file mode 100644 index 00000000..7fdf326f --- /dev/null +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/dao/oa/INodeAssigneeDao.java @@ -0,0 +1,51 @@ +package ink.wgink.module.activiti.dao.oa; + +import ink.wgink.exceptions.RemoveException; +import ink.wgink.exceptions.SaveException; +import ink.wgink.exceptions.UpdateException; +import org.springframework.stereotype.Repository; + +import java.util.Map; + +/** + * @ClassName: INodeAssigneeDao + * @Description: 节点代理人 + * @Author: wanggeng + * @Date: 2022/4/4 15:18 + * @Version: 1.0 + */ +@Repository +public interface INodeAssigneeDao { + + /** + * 新增 + * + * @param params + * @throws SaveException + */ + void save(Map params) throws SaveException; + + /** + * 删除 + * + * @param params + * @throws RemoveException + */ + void delete(Map params) throws RemoveException; + + /** + * 更新部署ID + * + * @param params + * @throws UpdateException + */ + void updateDeploymentId(Map params) throws UpdateException; + + /** + * 删除部署ID + * + * @param deploymentId + * @throws UpdateException + */ + void deleteDeploymentId(String deploymentId) throws UpdateException; +} 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 index 21639aa6..35f2ae3d 100644 --- 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 @@ -44,6 +44,22 @@ public interface INodeFieldDao extends IInitBaseTable { */ void update(Map params) throws UpdateException; + /** + * 更新部署ID + * + * @param params + * @throws UpdateException + */ + void updateDeploymentId(Map params) throws UpdateException; + + /** + * 删除部署ID + * + * @param deploymentId + * @throws UpdateException + */ + void deleteDeploymentId(String deploymentId) throws UpdateException; + /** * 节点列表 * @@ -62,4 +78,5 @@ public interface INodeFieldDao extends IInitBaseTable { */ List list(Map params) throws SearchException; + } diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/ActivitiModelVO.java b/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/ActivitiModelVO.java index aec62b9f..1fb27fce 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/ActivitiModelVO.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/ActivitiModelVO.java @@ -1,5 +1,9 @@ package ink.wgink.module.activiti.pojo.vos; +import ink.wgink.module.activiti.pojo.vos.oa.nodemanage.OaNodeManageVO; + +import java.util.List; + /** * @ClassName: ActivitiModelVO * @Description: 模型 @@ -14,6 +18,8 @@ public class ActivitiModelVO { private String description; private String jsonXml; private String svgXml; + private Boolean isOa; + private List oaNodeManages; public String getName() { return name == null ? "" : name.trim(); @@ -46,4 +52,20 @@ public class ActivitiModelVO { public void setSvgXml(String svgXml) { this.svgXml = svgXml; } + + public Boolean getOa() { + return isOa == null ? false : isOa; + } + + public void setOa(Boolean oa) { + isOa = oa; + } + + public List getOaNodeManages() { + return oaNodeManages; + } + + public void setOaNodeManages(List oaNodeManages) { + this.oaNodeManages = oaNodeManages; + } } diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/nodemanage/ConfigVO.java b/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/nodemanage/ConfigVO.java new file mode 100644 index 00000000..f3d86473 --- /dev/null +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/nodemanage/ConfigVO.java @@ -0,0 +1,63 @@ +package ink.wgink.module.activiti.pojo.vos.oa.nodemanage; + +import ink.wgink.module.activiti.pojo.vos.oa.nodemanage.config.AssigneeVO; +import ink.wgink.module.activiti.pojo.vos.oa.nodemanage.config.NodeFormFieldVO; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import java.util.List; + +/** + * @ClassName: ConfigVO + * @Description: 配置 + * @Author: wanggeng + * @Date: 2022/4/4 11:06 + * @Version: 1.0 + */ +@ApiModel +public class ConfigVO { + + @ApiModelProperty(name = "formId", value = "表单ID") + private String formId; + @ApiModelProperty(name = "assignee", value = "代理人") + private AssigneeVO assignee; + @ApiModelProperty(name = "formFields", value = "表单字段列表") + private List formFields; + + public String getFormId() { + return formId == null ? "" : formId.trim(); + } + + public void setFormId(String formId) { + this.formId = formId; + } + + public AssigneeVO getAssignee() { + return assignee; + } + + public void setAssignee(AssigneeVO assignee) { + this.assignee = assignee; + } + + public List getFormFields() { + return formFields; + } + + public void setFormFields(List formFields) { + this.formFields = formFields; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("{"); + sb.append("\"formId\":\"") + .append(formId).append('\"'); + sb.append(",\"assignee\":") + .append(assignee); + sb.append(",\"formFields\":") + .append(formFields); + sb.append('}'); + return sb.toString(); + } +} diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/nodemanage/OaNodeManageVO.java b/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/nodemanage/OaNodeManageVO.java new file mode 100644 index 00000000..683424f0 --- /dev/null +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/nodemanage/OaNodeManageVO.java @@ -0,0 +1,47 @@ +package ink.wgink.module.activiti.pojo.vos.oa.nodemanage; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * @ClassName: OaNodeManageVO + * @Description: oa节点管理 + * @Author: wanggeng + * @Date: 2022/4/4 11:06 + * @Version: 1.0 + */ +@ApiModel +public class OaNodeManageVO { + + @ApiModelProperty(name = "nodeId", value = "节点ID") + private String nodeId; + @ApiModelProperty(name = "config", value = "配置") + private ConfigVO config; + + public String getNodeId() { + return nodeId == null ? "" : nodeId.trim(); + } + + public void setNodeId(String nodeId) { + this.nodeId = nodeId; + } + + public ConfigVO getConfig() { + return config; + } + + public void setConfig(ConfigVO config) { + this.config = config; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("{"); + sb.append("\"nodeId\":\"") + .append(nodeId).append('\"'); + sb.append(",\"config\":") + .append(config); + sb.append('}'); + return sb.toString(); + } +} diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/nodemanage/config/AssigneeVO.java b/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/nodemanage/config/AssigneeVO.java new file mode 100644 index 00000000..2e2d72a8 --- /dev/null +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/nodemanage/config/AssigneeVO.java @@ -0,0 +1,237 @@ +package ink.wgink.module.activiti.pojo.vos.oa.nodemanage.config; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * @ClassName: AssigneeVO + * @Description: 代理人 + * @Author: wanggeng + * @Date: 2022/4/4 10:46 + * @Version: 1.0 + */ +@ApiModel +public class AssigneeVO { + + @ApiModelProperty(name = "nodeType", value = "节点类型") + private String nodeType; + @ApiModelProperty(name = "assigneeType", value = "代理人类型") + private String assigneeType; + @ApiModelProperty(name = "assigneeCount", value = "代理人数量") + private String assigneeCount; + @ApiModelProperty(name = "assignee", value = "代理人") + private String assignee; + @ApiModelProperty(name = "assigneeName", value = "代理人名称") + private String assigneeName; + @ApiModelProperty(name = "autoAssignType", value = "自动方式") + private String autoAssignType; + @ApiModelProperty(name = "departmentType", value = "部门类型") + private String departmentType; + @ApiModelProperty(name = "departments", value = "选择部门") + private String departments; + @ApiModelProperty(name = "departmentNames", value = "选择部门名称") + private String departmentNames; + @ApiModelProperty(name = "roles", value = "角色") + private String roles; + @ApiModelProperty(name = "roleNames", value = "角色名称") + private String roleNames; + @ApiModelProperty(name = "positions", value = "职位") + private String positions; + @ApiModelProperty(name = "positionNames", value = "职位名称") + private String positionNames; + @ApiModelProperty(name = "quickAssignee", value = "快速代理人") + private String quickAssignee; + @ApiModelProperty(name = "signType", value = "会签类型") + private String signType; + @ApiModelProperty(name = "signUsers", value = "会签人") + private String signUsers; + @ApiModelProperty(name = "completeCondition", value = "完成条件") + private String completeCondition; + @ApiModelProperty(name = "completeCount", value = "") + private Integer completeCount; + + public String getNodeType() { + return nodeType == null ? "" : nodeType.trim(); + } + + public void setNodeType(String nodeType) { + this.nodeType = nodeType; + } + + public String getAssigneeType() { + return assigneeType == null ? "" : assigneeType.trim(); + } + + public void setAssigneeType(String assigneeType) { + this.assigneeType = assigneeType; + } + + public String getAssigneeCount() { + return assigneeCount == null ? "" : assigneeCount.trim(); + } + + public void setAssigneeCount(String assigneeCount) { + this.assigneeCount = assigneeCount; + } + + public String getAssignee() { + return assignee == null ? "" : assignee.trim(); + } + + public void setAssignee(String assignee) { + this.assignee = assignee; + } + + public String getAssigneeName() { + return assigneeName == null ? "" : assigneeName.trim(); + } + + public void setAssigneeName(String assigneeName) { + this.assigneeName = assigneeName; + } + + public String getAutoAssignType() { + return autoAssignType == null ? "" : autoAssignType.trim(); + } + + public void setAutoAssignType(String autoAssignType) { + this.autoAssignType = autoAssignType; + } + + public String getDepartmentType() { + return departmentType == null ? "" : departmentType.trim(); + } + + public void setDepartmentType(String departmentType) { + this.departmentType = departmentType; + } + + public String getDepartments() { + return departments == null ? "" : departments.trim(); + } + + public void setDepartments(String departments) { + this.departments = departments; + } + + public String getDepartmentNames() { + return departmentNames == null ? "" : departmentNames.trim(); + } + + public void setDepartmentNames(String departmentNames) { + this.departmentNames = departmentNames; + } + + public String getRoles() { + return roles == null ? "" : roles.trim(); + } + + public void setRoles(String roles) { + this.roles = roles; + } + + public String getRoleNames() { + return roleNames == null ? "" : roleNames.trim(); + } + + public void setRoleNames(String roleNames) { + this.roleNames = roleNames; + } + + public String getPositions() { + return positions == null ? "" : positions.trim(); + } + + public void setPositions(String positions) { + this.positions = positions; + } + + public String getPositionNames() { + return positionNames == null ? "" : positionNames.trim(); + } + + public void setPositionNames(String positionNames) { + this.positionNames = positionNames; + } + + public String getQuickAssignee() { + return quickAssignee == null ? "" : quickAssignee.trim(); + } + + public void setQuickAssignee(String quickAssignee) { + this.quickAssignee = quickAssignee; + } + + public String getSignType() { + return signType == null ? "" : signType.trim(); + } + + public void setSignType(String signType) { + this.signType = signType; + } + + public String getSignUsers() { + return signUsers == null ? "" : signUsers.trim(); + } + + public void setSignUsers(String signUsers) { + this.signUsers = signUsers; + } + + public String getCompleteCondition() { + return completeCondition == null ? "" : completeCondition.trim(); + } + + public void setCompleteCondition(String completeCondition) { + this.completeCondition = completeCondition; + } + + public Integer getCompleteCount() { + return completeCount == null ? 0 : completeCount; + } + + public void setCompleteCount(Integer completeCount) { + this.completeCount = completeCount; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("{"); + sb.append("\"nodeType\":\"") + .append(nodeType).append('\"'); + sb.append(",\"assigneeType\":\"") + .append(assigneeType).append('\"'); + sb.append(",\"assigneeCount\":") + .append(assigneeCount); + sb.append(",\"assignee\":\"") + .append(assignee).append('\"'); + sb.append(",\"autoAssignType\":\"") + .append(autoAssignType).append('\"'); + sb.append(",\"departmentType\":\"") + .append(departmentType).append('\"'); + sb.append(",\"departments\":\"") + .append(departments).append('\"'); + sb.append(",\"departmentNames\":\"") + .append(departmentNames).append('\"'); + sb.append(",\"roles\":\"") + .append(roles).append('\"'); + sb.append(",\"roleNames\":\"") + .append(roleNames).append('\"'); + sb.append(",\"positions\":\"") + .append(positions).append('\"'); + sb.append(",\"positionNames\":\"") + .append(positionNames).append('\"'); + sb.append(",\"quickAssignee\":\"") + .append(quickAssignee).append('\"'); + sb.append(",\"signType\":\"") + .append(signType).append('\"'); + sb.append(",\"signUsers\":\"") + .append(signUsers).append('\"'); + sb.append(",\"completeCondition\":\"") + .append(completeCondition).append('\"'); + sb.append(",\"completeCount\":") + .append(completeCount); + sb.append('}'); + return sb.toString(); + } +} diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/nodemanage/config/NodeFormFieldVO.java b/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/nodemanage/config/NodeFormFieldVO.java new file mode 100644 index 00000000..42471c88 --- /dev/null +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/nodemanage/config/NodeFormFieldVO.java @@ -0,0 +1,107 @@ +package ink.wgink.module.activiti.pojo.vos.oa.nodemanage.config; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * @ClassName: FormFieldVO + * @Description: 表单字段 + * @Author: wanggeng + * @Date: 2022/4/4 10:48 + * @Version: 1.0 + */ +@ApiModel +public class NodeFormFieldVO { + + @ApiModelProperty(name = "fieldId", value = "字段ID") + private String fieldId; + @ApiModelProperty(name = "fieldExplain", value = "字段描述") + private String fieldExplain; + @ApiModelProperty(name = "fieldName", value = "字段名") + private String fieldName; + @ApiModelProperty(name = "fieldTag", value = "字段标签") + private String fieldTag; + @ApiModelProperty(name = "fieldType", value = "字段类型") + private String fieldType; + @ApiModelProperty(name = "isEditable", value = "是否操作") + private Boolean isEditable; + @ApiModelProperty(name = "isVisible", value = "是否可见") + private Boolean isVisible; + + public String getFieldId() { + return fieldId == null ? "" : fieldId.trim(); + } + + public void setFieldId(String fieldId) { + this.fieldId = fieldId; + } + + public String getFieldExplain() { + return fieldExplain == null ? "" : fieldExplain.trim(); + } + + public void setFieldExplain(String fieldExplain) { + this.fieldExplain = fieldExplain; + } + + public String getFieldName() { + return fieldName == null ? "" : fieldName.trim(); + } + + public void setFieldName(String fieldName) { + this.fieldName = fieldName; + } + + public String getFieldTag() { + return fieldTag == null ? "" : fieldTag.trim(); + } + + public void setFieldTag(String fieldTag) { + this.fieldTag = fieldTag; + } + + public String getFieldType() { + return fieldType == null ? "" : fieldType.trim(); + } + + public void setFieldType(String fieldType) { + this.fieldType = fieldType; + } + + public Boolean getEditable() { + return isEditable; + } + + public void setEditable(Boolean editable) { + isEditable = editable; + } + + public Boolean getVisible() { + return isVisible; + } + + public void setVisible(Boolean visible) { + isVisible = visible; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("{"); + sb.append("\"fieldId\":\"") + .append(fieldId).append('\"'); + sb.append(",\"fieldExplain\":\"") + .append(fieldExplain).append('\"'); + sb.append(",\"fieldName\":\"") + .append(fieldName).append('\"'); + sb.append(",\"fieldTag\":\"") + .append(fieldTag).append('\"'); + sb.append(",\"fieldType\":\"") + .append(fieldType).append('\"'); + sb.append(",\"isEditable\":") + .append(isEditable); + sb.append(",\"isVisible\":") + .append(isVisible); + sb.append('}'); + return sb.toString(); + } +} diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/IActivitiModelService.java b/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/IActivitiModelService.java index 00f81674..9abcd5d0 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/IActivitiModelService.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/IActivitiModelService.java @@ -2,6 +2,7 @@ package ink.wgink.module.activiti.service.activiti; import com.alibaba.fastjson.JSONObject; import ink.wgink.module.activiti.pojo.dtos.ActivitiFlowNodeDTO; +import ink.wgink.module.activiti.pojo.vos.ActivitiModelVO; import org.activiti.bpmn.model.*; import javax.servlet.http.HttpServletResponse; @@ -36,13 +37,17 @@ public interface IActivitiModelService { * 保存模型 * * @param modelId - * @param name - * @param description - * @param json_xml - * @param svg_xml + * @param activitiModelVO * @throws Exception */ - void saveModel(String modelId, String name, String description, String json_xml, String svg_xml) throws Exception; + void save(String modelId, ActivitiModelVO activitiModelVO) throws Exception; + + /** + * 删除模型 + * + * @param modelId + */ + void delete(String modelId); /** * 获取原生流程节点列表 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 132e2428..4d4e70f7 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 @@ -29,13 +29,6 @@ public interface IActivitiService { */ String create(ActivitiVO activitiVO) throws UnsupportedEncodingException; - /** - * 删除模型 - * - * @param modelId 模型ID - */ - void delete(String modelId); - /** * 发布模型 diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/impl/ActivitiModelServiceImpl.java b/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/impl/ActivitiModelServiceImpl.java index f98ce19d..3e7e43e5 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/impl/ActivitiModelServiceImpl.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/impl/ActivitiModelServiceImpl.java @@ -3,11 +3,14 @@ package ink.wgink.module.activiti.service.activiti.impl; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; 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.ActivitiModelVO; import ink.wgink.module.activiti.service.activiti.IActivitiModelService; +import ink.wgink.module.activiti.service.oa.INodeManageService; import ink.wgink.util.ResourceUtil; import ink.wgink.util.xml.XMLUtil; import org.activiti.bpmn.model.*; @@ -51,24 +54,35 @@ public class ActivitiModelServiceImpl extends DefaultBaseService implements IAct private RuntimeService runtimeService; @Autowired private HistoryService historyService; + @Autowired + private INodeManageService nodeManageService; @Override - public void saveModel(String modelId, String name, String description, String json_xml, String svg_xml) throws Exception { + public void save(String modelId, ActivitiModelVO activitiModelVO) throws Exception { Model model = repositoryService.getModel(modelId); if (model == null) { throw new SearchException("模型不存在"); } + String deploymentId = model.getDeploymentId(); + Integer modelVersion; + if (!StringUtils.isBlank(deploymentId)) { + LOG.debug("已经部署,版本号递增"); + modelVersion = model.getVersion() + 1; + } else { + LOG.debug("未部署,版本号不变"); + modelVersion = model.getVersion(); + } JSONObject modelObject = JSONObject.parseObject(model.getMetaInfo()); - modelObject.put(MODEL_NAME, name); - modelObject.put(MODEL_DESCRIPTION, description); + modelObject.put(MODEL_NAME, activitiModelVO.getName()); + modelObject.put(MODEL_DESCRIPTION, activitiModelVO.getDescription()); model.setMetaInfo(modelObject.toString()); - model.setName(name); - model.setVersion(model.getVersion() + 1); + model.setName(activitiModelVO.getName()); + model.setVersion(modelVersion); repositoryService.saveModel(model); - repositoryService.addModelEditorSource(model.getId(), json_xml.getBytes(ISystemConstant.CHARSET_UTF8)); + repositoryService.addModelEditorSource(model.getId(), activitiModelVO.getJsonXml().getBytes(ISystemConstant.CHARSET_UTF8)); - InputStream svgStream = new ByteArrayInputStream(svg_xml.getBytes(ISystemConstant.CHARSET_UTF8)); + InputStream svgStream = new ByteArrayInputStream(activitiModelVO.getSvgXml().getBytes(ISystemConstant.CHARSET_UTF8)); TranscoderInput input = new TranscoderInput(svgStream); PNGTranscoder transcoder = new PNGTranscoder(); @@ -82,6 +96,22 @@ public class ActivitiModelServiceImpl extends DefaultBaseService implements IAct repositoryService.addModelEditorSourceExtra(model.getId(), result); outStream.close(); + LOG.debug("保存节点配置"); + nodeManageService.save(activitiModelVO, modelId, modelVersion, deploymentId); + } + + @Override + public void delete(String modelId) { + Model model = repositoryService.getModel(modelId); + if (model == null) { + throw new SearchException("模型不存在"); + } + if (!StringUtils.isBlank(model.getDeploymentId())) { + throw new RemoveException("已部署的模型不能删除"); + } + repositoryService.deleteModel(modelId); + LOG.debug("删除节点配置"); + nodeManageService.delete(modelId, model.getVersion()); } @Override 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 25b1026a..a1ad2d72 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 @@ -4,6 +4,8 @@ import ink.wgink.common.base.DefaultBaseService; import ink.wgink.module.activiti.pojo.dtos.ActivitiProcdefDTO; import ink.wgink.module.activiti.service.activiti.IActivitiModelService; import ink.wgink.module.activiti.service.activiti.IActivitiProcdefService; +import ink.wgink.module.activiti.service.oa.INodeAssigneeService; +import ink.wgink.module.activiti.service.oa.INodeFieldService; import ink.wgink.pojo.result.SuccessResultList; import org.activiti.engine.RepositoryService; import org.activiti.engine.RuntimeService; @@ -29,13 +31,17 @@ public class ActivitiProcdefServiceImpl extends DefaultBaseService implements IA @Autowired private RepositoryService repositoryService; @Autowired - private RuntimeService runtimeService; + private INodeAssigneeService nodeAssigneeService; @Autowired - private IActivitiModelService activitiModelService; + private INodeFieldService nodeFieldService; @Override public void delete(String deploymentId) { repositoryService.deleteDeployment(deploymentId, true); + LOG.debug("删除代理人配置部署ID"); + nodeAssigneeService.deleteDeploymentId(deploymentId); + LOG.debug("删除表单配置部署ID"); + nodeFieldService.deleteDeploymentId(deploymentId); } @Override 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 53eeeb04..e6280972 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 @@ -4,29 +4,20 @@ import com.alibaba.fastjson.JSONObject; import com.fasterxml.jackson.databind.JsonNode; 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.IActivitiModelService; -import ink.wgink.module.activiti.service.activiti.IActivitiProcdefService; import ink.wgink.module.activiti.service.activiti.IActivitiService; +import ink.wgink.module.activiti.service.oa.INodeAssigneeService; 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.*; +import org.activiti.bpmn.model.BpmnModel; +import org.activiti.bpmn.model.FlowNode; +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; import org.activiti.engine.RepositoryService; -import org.activiti.engine.RuntimeService; import org.activiti.engine.repository.Deployment; import org.activiti.engine.repository.Model; import org.activiti.engine.repository.ModelQuery; @@ -36,7 +27,6 @@ import org.springframework.stereotype.Service; import java.io.IOException; import java.io.UnsupportedEncodingException; -import java.util.ArrayList; import java.util.List; /** @@ -55,19 +45,11 @@ public class ActivitiServiceImpl extends DefaultBaseService implements IActiviti @Autowired private RepositoryService repositoryService; @Autowired - private HistoryService historyService; - @Autowired - private RuntimeService runtimeService; - @Autowired private IActivitiModelService activitiModelService; @Autowired - private IActivitiProcdefService activitiProcdefService; + private INodeAssigneeService nodeAssigneeService; @Autowired private INodeFieldService nodeFieldService; - @Autowired - private IFormService formService; - @Autowired - private IFormFieldService formFieldService; @Override public String create(ActivitiVO activitiVO) throws UnsupportedEncodingException { @@ -86,18 +68,6 @@ public class ActivitiServiceImpl extends DefaultBaseService implements IActiviti return model.getId(); } - @Override - public void delete(String modelId) { - Model model = repositoryService.getModel(modelId); - if (model == null) { - throw new SearchException("模型不存在"); - } - if (!StringUtils.isBlank(model.getDeploymentId())) { - throw new RemoveException("已部署的模型不能删除"); - } - repositoryService.deleteModel(modelId); - } - @Override public void saveDeploy(String modelId) throws IOException { Model model = repositoryService.getModel(modelId); @@ -112,7 +82,6 @@ public class ActivitiServiceImpl extends DefaultBaseService implements IActiviti JsonNode modelNode = new ObjectMapper().readTree(modelEditorSource); BpmnModel bpmnModel = new BpmnJsonConverter().convertToBpmnModel(modelNode); - LOG.debug("获取流程节点列表"); List flowNodes = activitiModelService.listFlowNode(bpmnModel); LOG.debug("获得开始节点"); @@ -122,12 +91,12 @@ public class ActivitiServiceImpl extends DefaultBaseService implements IActiviti String deploymentId; if (!StringUtils.isBlank(formKey)) { LOG.debug("存在自定义表单,是OA流程,执行初始化操作"); - LOG.debug("1.初始化"); - LOG.debug("2.部署流程"); + LOG.debug("1.部署流程"); deploymentId = deployProcess(model, bpmnModel); - LOG.debug("3.绑定节点设置"); - LOG.debug("4.绑定流程节点与表单关系"); - saveNodeField(deploymentId, flowNodes); + LOG.debug("2.绑定节点代理人"); + nodeAssigneeService.updateDeploymentId(modelId, model.getVersion(), deploymentId); + LOG.debug("3.绑定节点表单字段"); + nodeFieldService.updateDeploymentId(modelId, model.getVersion(), deploymentId); } else { LOG.debug("不存在自定义表单,不是OA流程,直接部署"); deploymentId = deployProcess(model, bpmnModel); @@ -153,62 +122,6 @@ public class ActivitiServiceImpl extends DefaultBaseService implements IActiviti return deployment.getId(); } - /** - * 保存节点与表单字段 - * - * @param deploymentId - */ - private void saveNodeField(String deploymentId, List flowNodes) { - List activitiFlowNodeDTOs = activitiModelService.listActivitiFlowNodeByModel(flowNodes); - 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.listPOByFormId(formPO.getFormId()); - if (formFieldPOs.isEmpty()) { - throw new SystemException("表单字段为空"); - } - for (int i = 0; i < activitiFlowNodeDTOs.size(); i++) { - ActivitiFlowNodeDTO activitiFlowNodeDTO = activitiFlowNodeDTOs.get(i); - if (StringUtils.equals(activitiFlowNodeDTO.getType(), EndEvent.class.getSimpleName())) { - return; - } - NodeFieldUpdateVO nodeFieldUpdateVO = new NodeFieldUpdateVO(); - nodeFieldUpdateVO.setFlowNodeIndex(i); - nodeFieldUpdateVO.setFlowNodeId(activitiFlowNodeDTO.getId()); - nodeFieldUpdateVO.setFlowNodeName(activitiFlowNodeDTO.getName()); - nodeFieldUpdateVO.setFormId(formPO.getFormId()); - nodeFieldUpdateVO.setDeploymentId(deploymentId); - List nodeFieldVOs = new ArrayList<>(); - for (FormFieldPO formFieldPO : formFieldPOs) { - 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 revokeDeploy(String modelId) { Model modelData = repositoryService.getModel(modelId); diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/INodeAssigneeService.java b/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/INodeAssigneeService.java new file mode 100644 index 00000000..01e4fcc1 --- /dev/null +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/INodeAssigneeService.java @@ -0,0 +1,59 @@ +package ink.wgink.module.activiti.service.oa; + +import ink.wgink.module.activiti.pojo.vos.oa.nodemanage.config.AssigneeVO; + +/** + * @ClassName: INodeAssigneeService + * @Description: 节点代理人 + * @Author: wanggeng + * @Date: 2022/4/4 15:08 + * @Version: 1.0 + */ +public interface INodeAssigneeService { + + /** + * 保存 + * + * @param modelId + * @param modelVersion + * @param nodeId + * @param nodeIndex + * @param assignee + */ + void save(String modelId, Integer modelVersion, String nodeId, int nodeIndex, AssigneeVO assignee); + + /** + * 更新 + * + * @param modelId + * @param modelVersion + * @param nodeId + * @param nodeIndex + * @param assignee + */ + void update(String modelId, Integer modelVersion, String nodeId, int nodeIndex, AssigneeVO assignee); + + /** + * 更新部署ID + * + * @param modelId + * @param version + * @param deploymentId + */ + void updateDeploymentId(String modelId, Integer version, String deploymentId); + + /** + * 删除部署ID + * + * @param deploymentId + */ + void deleteDeploymentId(String deploymentId); + + /** + * 删除 + * + * @param modelId 模型ID + * @param modelVersion 模型版本 + */ + void deleteByModelIdAndModelVersion(String modelId, Integer modelVersion); +} 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 index e27d799d..2f5b06d2 100644 --- 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 @@ -1,7 +1,7 @@ package ink.wgink.module.activiti.service.oa; import ink.wgink.module.activiti.pojo.dtos.oa.NodeFieldDTO; -import ink.wgink.module.activiti.pojo.vos.oa.NodeFieldUpdateVO; +import ink.wgink.module.activiti.pojo.vos.oa.nodemanage.config.NodeFormFieldVO; import java.util.List; @@ -14,11 +14,37 @@ import java.util.List; public interface INodeFieldService { /** - * 新增绑定 + * 新增节点绑定 * - * @param nodeFieldUpdateVO + * @param modelId 模型ID + * @param modelVersion 模型版本 + * @param nodeId 节点ID + * @param nodeIndex 节点下标 + * @param formId 表单ID + * @param formFields 表单字段 */ - void save(NodeFieldUpdateVO nodeFieldUpdateVO); + void save(String modelId, Integer modelVersion, String nodeId, Integer nodeIndex, String formId, List formFields); + + /** + * 更新节点 + * + * @param modelId + * @param modelVersion + * @param nodeId + * @param nodeIndex + * @param formId + * @param formFields + */ + void update(String modelId, Integer modelVersion, String nodeId, int nodeIndex, String formId, List formFields); + + /** + * 更新部署ID + * + * @param modelId 模型ID + * @param modelVersion 模型版本 + * @param deploymentId 部署ID + */ + void updateDeploymentId(String modelId, Integer modelVersion, String deploymentId); /** * 更新显示状态 @@ -36,6 +62,22 @@ public interface INodeFieldService { */ void updateEditable(String nodeFieldId, Integer isEditable); + + /** + * 删除部署ID + * + * @param deploymentId + */ + void deleteDeploymentId(String deploymentId); + + /** + * 删除 + * + * @param modelId 模型ID + * @param modelVersion 模型版本 + */ + void deleteByModelIdAndModelVersion(String modelId, Integer modelVersion); + /** * 节点列表 * diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/INodeManageService.java b/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/INodeManageService.java new file mode 100644 index 00000000..8e31ef7d --- /dev/null +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/INodeManageService.java @@ -0,0 +1,31 @@ +package ink.wgink.module.activiti.service.oa; + +import ink.wgink.module.activiti.pojo.vos.ActivitiModelVO; + +/** + * @ClassName: INodeConfigService + * @Description: 节点配置 + * @Author: wanggeng + * @Date: 2022/4/5 20:27 + * @Version: 1.0 + */ +public interface INodeManageService { + + /** + * 保存管理配置 + * + * @param activitiModelVO + * @param modelId + * @param modelVersion + * @param deploymentId + */ + void save(ActivitiModelVO activitiModelVO, String modelId, Integer modelVersion, String deploymentId); + + /** + * 删除管理配置 + * + * @param modelId + * @param modelVersion + */ + void delete(String modelId, Integer modelVersion); +} diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/impl/NodeAssigneeServiceImpl.java b/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/impl/NodeAssigneeServiceImpl.java new file mode 100644 index 00000000..347002b5 --- /dev/null +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/impl/NodeAssigneeServiceImpl.java @@ -0,0 +1,83 @@ +package ink.wgink.module.activiti.service.oa.impl; + +import ink.wgink.common.base.DefaultBaseService; +import ink.wgink.module.activiti.dao.oa.INodeAssigneeDao; +import ink.wgink.module.activiti.pojo.vos.oa.nodemanage.config.AssigneeVO; +import ink.wgink.module.activiti.service.oa.INodeAssigneeService; +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.Map; + +/** + * @ClassName: NodeAssigneeServiceImpl + * @Description: 节点代理人 + * @Author: wanggeng + * @Date: 2022/4/4 15:09 + * @Version: 1.0 + */ +@Service +public class NodeAssigneeServiceImpl extends DefaultBaseService implements INodeAssigneeService { + + @Autowired + private INodeAssigneeDao nodeAssigneeDao; + + @Override + public void save(String modelId, Integer modelVersion, String nodeId, int nodeIndex, AssigneeVO assignee) { + LOG.debug("新增代理人配置"); + Map params = HashMapUtil.beanToMap(assignee); + params.put("nodeFieldId", UUIDUtil.getUUID()); + params.put("modelId", modelId); + params.put("modelVersion", modelVersion); + params.put("nodeId", nodeId); + params.put("nodeIndex", nodeIndex); + nodeAssigneeDao.save(params); + } + + @Override + public void update(String modelId, Integer modelVersion, String nodeId, int nodeIndex, AssigneeVO assignee) { + delete(modelId, modelVersion, nodeId); + save(modelId, modelVersion, nodeId, nodeIndex, assignee); + } + + @Override + public void updateDeploymentId(String modelId, Integer modelVersion, String deploymentId) { + Map params = getHashMap(6); + params.put("modelId", modelId); + params.put("modelVersion", modelVersion); + params.put("deploymentId", deploymentId); + nodeAssigneeDao.updateDeploymentId(params); + } + + @Override + public void deleteDeploymentId(String deploymentId) { + nodeAssigneeDao.deleteDeploymentId(deploymentId); + } + + @Override + public void deleteByModelIdAndModelVersion(String modelId, Integer modelVersion) { + Map params = getHashMap(4); + params.put("modelId", modelId); + params.put("modelVersion", modelVersion); + nodeAssigneeDao.delete(params); + } + + /** + * 删除 + * + * @param modelId 模型ID + * @param modelVersion 模型版本 + * @param nodeId 节点ID + */ + private void delete(String modelId, Integer modelVersion, String nodeId) { + LOG.debug("删除代理人配置"); + Map params = getHashMap(6); + params.put("modelId", modelId); + params.put("modelVersion", modelVersion); + params.put("nodeId", nodeId); + nodeAssigneeDao.delete(params); + } + +} 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/NodeFieldServiceImpl.java similarity index 51% rename from module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/impl/NodeFieldFieldServiceImpl.java rename to module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/impl/NodeFieldServiceImpl.java index fdfa1976..f5e592c9 100644 --- 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/NodeFieldServiceImpl.java @@ -3,8 +3,7 @@ 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.dtos.oa.NodeFieldDTO; -import ink.wgink.module.activiti.pojo.vos.oa.NodeFieldUpdateVO; -import ink.wgink.module.activiti.pojo.vos.oa.NodeFieldVO; +import ink.wgink.module.activiti.pojo.vos.oa.nodemanage.config.NodeFormFieldVO; import ink.wgink.module.activiti.service.oa.INodeFieldService; import ink.wgink.util.UUIDUtil; import ink.wgink.util.map.HashMapUtil; @@ -21,22 +20,41 @@ import java.util.Map; * @Version: 1.0 **/ @Service -public class NodeFieldFieldServiceImpl extends DefaultBaseService implements INodeFieldService { +public class NodeFieldServiceImpl 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.getFlowNodeIndex(), - nodeFieldUpdateVO.getFlowNodeId(), - nodeFieldUpdateVO.getFlowNodeName(), - nodeFieldUpdateVO.getFormFields()); + public void save(String modelId, Integer modelVersion, String nodeId, Integer nodeIndex, String formId, List formFields) { + LOG.debug("新增字段配置"); + formFields.forEach(nodeFormFieldVO -> { + Map params = HashMapUtil.beanToMap(nodeFormFieldVO); + params.put("nodeFieldId", UUIDUtil.getUUID()); + params.put("modelId", modelId); + params.put("modelVersion", modelVersion); + params.put("nodeId", nodeId); + params.put("nodeIndex", nodeIndex); + params.put("formId", formId); + params.put("isVisible", nodeFormFieldVO.getVisible() ? 1 : 0); + params.put("isEditable", nodeFormFieldVO.getEditable() ? 1 : 0); + nodeFieldDao.save(params); + }); + } + + @Override + public void update(String modelId, Integer modelVersion, String nodeId, int nodeIndex, String formId, List formFields) { + delete(modelId, modelVersion, nodeId, formId); + save(modelId, modelVersion, nodeId, nodeIndex, formId, formFields); + } + + @Override + public void updateDeploymentId(String modelId, Integer modelVersion, String deploymentId) { + Map params = getHashMap(6); + params.put("modelId", modelId); + params.put("modelVersion", modelVersion); + params.put("deploymentId", deploymentId); + nodeFieldDao.updateDeploymentId(params); } @Override @@ -55,6 +73,19 @@ public class NodeFieldFieldServiceImpl extends DefaultBaseService implements INo nodeFieldDao.update(params); } + @Override + public void deleteDeploymentId(String deploymentId) { + nodeFieldDao.deleteDeploymentId(deploymentId); + } + + @Override + public void deleteByModelIdAndModelVersion(String modelId, Integer modelVersion) { + Map params = getHashMap(4); + params.put("modelId", modelId); + params.put("modelVersion", modelVersion); + nodeFieldDao.delete(params); + } + @Override public List listNodeByDeploymentId(String deploymentId) { Map params = getHashMap(2); @@ -70,40 +101,21 @@ public class NodeFieldFieldServiceImpl extends DefaultBaseService implements INo return nodeFieldDao.list(params); } - /** - * 保存 - * - * @param deploymentId - * @param formId - * @param flowNodeId - * @param formFields - */ - private void save(String deploymentId, String formId, Integer flowNodeIndex, String flowNodeId, String flowNodeName, 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("flowNodeIndex", flowNodeIndex); - params.put("flowNodeId", flowNodeId); - params.put("flowNodeName", flowNodeName); - nodeFieldDao.save(params); - }); - } - /** * 删除 * - * @param deploymentId 部署ID + * @param modelId 模型ID + * @param modelVersion 模型版本 + * @param nodeId 节点ID * @param formId 表单ID - * @param flowNodeId 流程节点ID */ - private void delete(String deploymentId, String formId, String flowNodeId) { + private void delete(String modelId, Integer modelVersion, String nodeId, String formId) { + LOG.debug("删除原有字段配置"); Map params = getHashMap(6); - params.put("deploymentId", deploymentId); + params.put("modelId", modelId); + params.put("modelVersion", modelVersion); + params.put("nodeId", nodeId); params.put("formId", formId); - params.put("flowNodeId", flowNodeId); - nodeFieldDao.delete(params); } diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/impl/NodeManageServiceImpl.java b/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/impl/NodeManageServiceImpl.java new file mode 100644 index 00000000..ff2fe426 --- /dev/null +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/impl/NodeManageServiceImpl.java @@ -0,0 +1,74 @@ +package ink.wgink.module.activiti.service.oa.impl; + +import ink.wgink.common.base.DefaultBaseService; +import ink.wgink.module.activiti.pojo.vos.ActivitiModelVO; +import ink.wgink.module.activiti.pojo.vos.oa.nodemanage.OaNodeManageVO; +import ink.wgink.module.activiti.pojo.vos.oa.nodemanage.config.AssigneeVO; +import ink.wgink.module.activiti.pojo.vos.oa.nodemanage.config.NodeFormFieldVO; +import ink.wgink.module.activiti.service.oa.INodeAssigneeService; +import ink.wgink.module.activiti.service.oa.INodeManageService; +import ink.wgink.module.activiti.service.oa.INodeFieldService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @ClassName: NodeConfigServiceImpl + * @Description: 节点配置 + * @Author: wanggeng + * @Date: 2022/4/5 20:28 + * @Version: 1.0 + */ +@Service +public class NodeManageServiceImpl extends DefaultBaseService implements INodeManageService { + + @Autowired + private INodeAssigneeService nodeAssigneeService; + @Autowired + private INodeFieldService nodeFieldService; + + @Override + public void save(ActivitiModelVO activitiModelVO, String modelId, Integer modelVersion, String deploymentId) { + if (!activitiModelVO.getOa()) { + return; + } + LOG.debug("保存节点管理"); + List oaNodeManages = activitiModelVO.getOaNodeManages(); + if (!StringUtils.isBlank(deploymentId)) { + for (int i = 0; i < oaNodeManages.size(); i++) { + OaNodeManageVO oaNodeManageVO = oaNodeManages.get(i); + String nodeId = oaNodeManageVO.getNodeId(); + AssigneeVO assignee = oaNodeManageVO.getConfig().getAssignee(); + String formId = oaNodeManageVO.getConfig().getFormId(); + List formFields = oaNodeManageVO.getConfig().getFormFields(); + // 保存节点与代理人配置 + nodeAssigneeService.save(modelId, modelVersion, nodeId, i, assignee); + // 保存节点与表单字段配置 + nodeFieldService.save(modelId, modelVersion, nodeId, i, formId, formFields); + } + } else { + for (int i = 0; i < oaNodeManages.size(); i++) { + OaNodeManageVO oaNodeManageVO = oaNodeManages.get(i); + String nodeId = oaNodeManageVO.getNodeId(); + AssigneeVO assignee = oaNodeManageVO.getConfig().getAssignee(); + String formId = oaNodeManageVO.getConfig().getFormId(); + List formFields = oaNodeManageVO.getConfig().getFormFields(); + // 保存节点与代理人配置 + nodeAssigneeService.update(modelId, modelVersion, nodeId, i, assignee); + // 保存节点与表单字段配置 + nodeFieldService.update(modelId, modelVersion, nodeId, i, formId, formFields); + } + } + } + + @Override + public void delete(String modelId, Integer modelVersion) { + LOG.debug("删除代理人配置"); + nodeAssigneeService.deleteByModelIdAndModelVersion(modelId, modelVersion); + LOG.debug("删除表单字段配置"); + nodeFieldService.deleteByModelIdAndModelVersion(modelId, modelVersion); + } + +} diff --git a/module-activiti/src/main/resources/mybatis/mapper/oa/node-assignee-mapper.xml b/module-activiti/src/main/resources/mybatis/mapper/oa/node-assignee-mapper.xml new file mode 100644 index 00000000..ad0404db --- /dev/null +++ b/module-activiti/src/main/resources/mybatis/mapper/oa/node-assignee-mapper.xml @@ -0,0 +1,125 @@ + + + + + + CREATE TABLE IF NOT EXISTS `oa_node_assignee` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `node_assignee_id` char(36) DEFAULT NULL, + `model_id` char(36) DEFAULT NULL COMMENT '模型ID', + `model_version` int(11) DEFAULT NULL COMMENT '模型版本', + `deployment_id` char(36) DEFAULT NULL COMMENT '部署ID', + `node_id` char(60) DEFAULT NULL COMMENT '节点ID', + `node_index` int(11) DEFAULT NULL COMMENT '节点下标', + `node_type` varchar(255) DEFAULT NULL COMMENT '节点类型', + `assignee_type` varchar(255) DEFAULT NULL COMMENT '代理人类型', + `assignee_count` varchar(255) DEFAULT NULL COMMENT '代理人数量', + `assignee` varchar(255) DEFAULT NULL COMMENT '代理人', + `assignee_names` varchar(255) DEFAULT NULL COMMENT '代理人名称', + `auto_assign_type` varchar(255) DEFAULT NULL COMMENT '自动方式', + `department_type` varchar(255) DEFAULT NULL COMMENT '部门类型', + `departments` varchar(255) DEFAULT NULL COMMENT '部门', + `department_names` varchar(255) DEFAULT NULL COMMENT '部门名称', + `roles` varchar(255) DEFAULT NULL COMMENT '角色', + `role_names` varchar(255) DEFAULT NULL COMMENT '角色名称', + `positions` varchar(255) DEFAULT NULL COMMENT '职位', + `position_names` varchar(255) DEFAULT NULL COMMENT '职位名称', + `quick_assignee` varchar(255) DEFAULT NULL COMMENT '快速代理人', + `sign_type` varchar(255) DEFAULT NULL COMMENT '会签类型', + `sign_users` varchar(255) DEFAULT NULL COMMENT '会签人', + `complete_condition` varchar(255) DEFAULT NULL COMMENT '完成条件', + `complete_count` int(11) DEFAULT NULL COMMENT '完成人数量', + PRIMARY KEY (`id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='节点代理人'; + + + + + INSERT INTO oa_node_assignee( + node_assignee_id, + model_id, + model_version, + node_id, + node_index, + node_type, + assignee_type, + assignee_count, + assignee, + assignee_name, + auto_assign_type, + department_type, + departments, + department_names, + roles, + role_names, + positions, + position_names, + quick_assignee, + sign_type, + sign_users, + complete_condition, + complete_count + ) VALUES( + #{nodeFieldId}, + #{modelId}, + #{modelVersion}, + #{nodeId}, + #{nodeIndex}, + #{nodeType}, + #{assigneeType}, + #{assigneeCount}, + #{assignee}, + #{assigneeName}, + #{autoAssignType}, + #{departmentType}, + #{departments}, + #{departmentNames}, + #{roles}, + #{roleNames}, + #{positions}, + #{positionNames}, + #{quickAssignee}, + #{signType}, + #{signUsers}, + #{completeCondition}, + #{completeCount} + ) + + + + + DELETE FROM + oa_node_assignee + WHERE + model_id = #{modelId} + AND + model_version = #{modelVersion} + + AND + node_id = #{nodeId} + + + + + + UPDATE + oa_node_assignee + SET + deployment_id = #{deploymentId} + WHERE + model_id = #{modelId} + AND + model_version = #{modelVersion} + + + + + UPDATE + oa_node_assignee + SET + deployment_id = NULL + WHERE + deployment_id = #{_parameter} + + + \ No newline at end of file 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 index f4b2ad59..b11215dd 100644 --- 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 @@ -18,12 +18,15 @@ 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', + `model_id` char(36) DEFAULT NULL COMMENT '模型ID', + `model_version` int(11) DEFAULT NULL COMMENT '模型版本', + `deployment_id` char(36) DEFAULT NULL COMMENT '部署ID', `form_id` char(36) DEFAULT NULL COMMENT '表单ID', - `flow_node_index` int(11) DEFAULT '0' COMMENT '流程节点下标', - `flow_node_id` char(60) DEFAULT NULL COMMENT '流程节点ID', - `flow_node_name` varchar(255) DEFAULT NULL COMMENT '流程节点名称', + `node_id` char(60) DEFAULT NULL COMMENT '节点ID', + `node_index` int(11) DEFAULT NULL COMMENT '节点下标', + `field_id` char(36) DEFAULT NULL COMMENT '字段ID', `field_name` varchar(255) DEFAULT NULL COMMENT '字段名', + `field_explain` varchar(255) DEFAULT NULL COMMENT '字段描述', `is_visible` int(1) DEFAULT '1' COMMENT '是否可见', `is_editable` int(1) DEFAULT '1' COMMENT '是否可编辑', PRIMARY KEY (`id`) @@ -34,22 +37,26 @@ INSERT INTO oa_node_field( node_field_id, - deployment_id, + model_id, + model_version, form_id, - flow_node_index, - flow_node_id, - flow_node_name, + node_id, + node_index, + field_id, field_name, + field_explain, is_visible, is_editable ) VALUES( #{nodeFieldId}, - #{deploymentId}, + #{modelId}, + #{modelVersion}, #{formId}, - #{flowNodeIndex}, - #{flowNodeId}, - #{flowNodeName}, + #{nodeId}, + #{nodeIndex}, + #{fieldId}, #{fieldName}, + #{fieldExplain}, #{isVisible}, #{isEditable} ) @@ -60,14 +67,16 @@ DELETE FROM oa_node_field WHERE - deployment_id = #{deploymentId} + model_id = #{modelId} + AND + model_version = #{modelVersion} AND form_id = #{formId} - + AND - flow_node_id = #{flowNodeId} + node_id = #{nodeId} @@ -87,6 +96,28 @@ node_field_id = #{nodeFieldId} + + + UPDATE + oa_node_field + SET + deployment_id = #{deploymentId} + WHERE + model_id = #{modelId} + AND + model_version = #{modelVersion} + + + + + UPDATE + oa_node_field + SET + deployment_id = NULL + WHERE + deployment_id = #{_parameter} + + - - 用户1 + + + {{oaNodeManage.assignee.assigneeName}} @@ -134,8 +135,9 @@ - - 部门 + + + {{oaNodeManage.assignee.departmentNames}} diff --git a/module-activiti/src/main/resources/static/editor-app/configuration/toolbar-default-actions.js b/module-activiti/src/main/resources/static/editor-app/configuration/toolbar-default-actions.js index d058d3d7..b8b20350 100644 --- a/module-activiti/src/main/resources/static/editor-app/configuration/toolbar-default-actions.js +++ b/module-activiti/src/main/resources/static/editor-app/configuration/toolbar-default-actions.js @@ -21,12 +21,48 @@ var KISBPM = KISBPM || {}; KISBPM.TOOLBAR = { ACTIONS: { + getSvgDom: function(scope) { + var selection = scope.editor.getSelection(); + scope.editor.setSelection([]); + // Get the serialized svg image source + var svgClone = scope.editor.getCanvas().getSVGRepresentation(true); + scope.editor.setSelection(selection); + if (scope.editor.getCanvas().properties["oryx-showstripableelements"] === false) { + var stripOutArray = jQuery(svgClone).find(".stripable-element"); + for (var i = stripOutArray.length - 1; i >= 0; i--) { + stripOutArray[i].remove(); + } + } + // Remove all forced stripable elements + var stripOutArray = jQuery(svgClone).find(".stripable-element-force"); + for (var i = stripOutArray.length - 1; i >= 0; i--) { + stripOutArray[i].remove(); + } + // Parse dom to string + return DataManager.serialize(svgClone); + }, + listOaNodeManage: function(json) { + var nodes = json.childShapes; + + var oaNodeManages = []; + for(var i = 0, item; item = nodes[i++];) { + if(item.stencil.id === 'UserTask') { + if(!item.properties.oanodemanage) { + continue; + } + oaNodeManages.push({ + nodeId: item.resourceId, + config: item.properties.oanodemanage + }) + } + } + return oaNodeManages; + }, saveModel: function (services) { var scope = services.$scope; top.dialog.confirm('确定保存吗?', function (index) { top.dialog.close(index); var json = scope.editor.getJSON(); - console.log(json) if(!json.properties.name) { top.dialog.msg('流程的 元素名称 不能为空'); return; @@ -35,36 +71,19 @@ KISBPM.TOOLBAR = { top.dialog.msg('流程图节点不能为空'); return; } - json = JSON.stringify(json); - var selection = scope.editor.getSelection(); - scope.editor.setSelection([]); - // Get the serialized svg image source - var svgClone = scope.editor.getCanvas().getSVGRepresentation(true); - scope.editor.setSelection(selection); - if (scope.editor.getCanvas().properties["oryx-showstripableelements"] === false) { - var stripOutArray = jQuery(svgClone).find(".stripable-element"); - for (var i = stripOutArray.length - 1; i >= 0; i--) { - stripOutArray[i].remove(); - } - } - // Remove all forced stripable elements - var stripOutArray = jQuery(svgClone).find(".stripable-element-force"); - for (var i = stripOutArray.length - 1; i >= 0; i--) { - stripOutArray[i].remove(); - } - // Parse dom to string - var svgDOM = DataManager.serialize(svgClone); + var svgDOM = KISBPM.TOOLBAR.ACTIONS.getSvgDom(scope); var modelMetaData = scope.editor.getModelMetaData(); - // 构建oaNodeManages管理列表 - + var oaNodeManages = KISBPM.TOOLBAR.ACTIONS.listOaNodeManage(json); + console.log(oaNodeManages) var params = { - jsonXml: json, + jsonXml: JSON.stringify(json), svgXml: svgDOM, name: modelMetaData.name, description: modelMetaData.description, - oaNodeManages: [] - }; + isOa: oaNodeManages.length > 0 ? true : false, + oaNodeManages: oaNodeManages + } var loadLayerIndex; top.restAjax.put(KISBPM.URL.putModel(modelMetaData.modelId), params, null, function (code, data) { parent.layer.close(parent.layer.getFrameIndex(window.name)); diff --git a/module-activiti/src/main/resources/static/editor-app/editor.html b/module-activiti/src/main/resources/static/editor-app/editor.html index cdac22e1..46c40616 100644 --- a/module-activiti/src/main/resources/static/editor-app/editor.html +++ b/module-activiti/src/main/resources/static/editor-app/editor.html @@ -26,7 +26,7 @@
-
+
@@ -56,7 +56,7 @@
-
+
-
+
@@ -130,6 +130,6 @@
-
+
diff --git a/module-activiti/src/main/resources/templates/activiti/list.html b/module-activiti/src/main/resources/templates/activiti/list.html index 8acd321e..ee029549 100644 --- a/module-activiti/src/main/resources/templates/activiti/list.html +++ b/module-activiti/src/main/resources/templates/activiti/list.html @@ -156,28 +156,6 @@ height: $win.height() - 50, }); } - // 删除 - function removeData(ids) { - top.dialog.msg(top.dataMessage.delete, { - time: 0, - btn: [top.dataMessage.button.yes, top.dataMessage.button.no], - shade: 0.3, - yes: function (index) { - top.dialog.close(index); - var layIndex; - top.restAjax.delete(top.restAjax.path('api/activiti/delete/{ids}', [ids]), {}, null, function (code, data) { - top.dialog.msg(top.dataMessage.deleteSuccess, {time: 1000}); - reloadTable(); - }, function (code, data) { - top.dialog.msg(data.msg); - }, function () { - layIndex = top.dialog.msg(top.dataMessage.deleting, {icon: 16, time: 0, shade: 0.3}); - }, function () { - top.dialog.close(layIndex); - }); - } - }); - } initTable(); // 事件 - 页面变化 $win.on('resize', function() { @@ -237,7 +215,25 @@ } }); } else if(layEvent === 'removeEvent') { - removeData(data.id); + top.dialog.msg(top.dataMessage.delete, { + time: 0, + btn: [top.dataMessage.button.yes, top.dataMessage.button.no], + shade: 0.3, + yes: function (index) { + top.dialog.close(index); + var layIndex; + top.restAjax.delete(top.restAjax.path('api/activiti/model/delete/{id}', [data.id]), {}, null, function (code, data) { + top.dialog.msg(top.dataMessage.deleteSuccess, {time: 1000}); + reloadTable(); + }, function (code, data) { + top.dialog.msg(data.msg); + }, function () { + layIndex = top.dialog.msg(top.dataMessage.deleting, {icon: 16, time: 0, shade: 0.3}); + }, function () { + top.dialog.close(layIndex); + }); + } + }); } }); }); 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 d0290d24..1c4127f6 100644 --- a/module-activiti/src/main/resources/templates/activiti/procdef/list.html +++ b/module-activiti/src/main/resources/templates/activiti/procdef/list.html @@ -132,10 +132,9 @@ return flowChatImg; } }, - {field: 'form', width: 140, title: '操作', align:'center', fixed: 'right', + {field: 'form', width: 70, title: '操作', align:'center', fixed: 'right', templet: function(row) { return '
' + - ''+ ''+ '
'; } @@ -189,14 +188,6 @@ height: '95%', onClose: function() {} }); - } else if(layEvent === 'nodeEvent') { - top.dialog.open({ - url: top.restAjax.path('route/oa/node-field/list-node?deploymentId={deploymentId}', [data.deploymentId]), - title: '节点字段管理', - width: '800px', - height: '500px', - onClose: function() {} - }); } else if(layEvent === 'deleteEvent') { top.dialog.msg('删除流程会删除与流程有关的所有数据,确定删除吗?', { time: 0,