调整了代码结构,增加了节点管理后台逻辑,增加了人员选择,部门选择

This commit is contained in:
wanggeng 2022-04-05 23:42:43 +08:00
parent 774afc6fa6
commit 538f85eeb4
29 changed files with 1316 additions and 287 deletions

View File

@ -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")

View File

@ -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();
}

View File

@ -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<String, Object> params) throws SaveException;
/**
* 删除
*
* @param params
* @throws RemoveException
*/
void delete(Map<String, Object> params) throws RemoveException;
/**
* 更新部署ID
*
* @param params
* @throws UpdateException
*/
void updateDeploymentId(Map<String, Object> params) throws UpdateException;
/**
* 删除部署ID
*
* @param deploymentId
* @throws UpdateException
*/
void deleteDeploymentId(String deploymentId) throws UpdateException;
}

View File

@ -44,6 +44,22 @@ public interface INodeFieldDao extends IInitBaseTable {
*/
void update(Map<String, Object> params) throws UpdateException;
/**
* 更新部署ID
*
* @param params
* @throws UpdateException
*/
void updateDeploymentId(Map<String, Object> params) throws UpdateException;
/**
* 删除部署ID
*
* @param deploymentId
* @throws UpdateException
*/
void deleteDeploymentId(String deploymentId) throws UpdateException;
/**
* 节点列表
*
@ -62,4 +78,5 @@ public interface INodeFieldDao extends IInitBaseTable {
*/
List<NodeFieldDTO> list(Map<String, Object> params) throws SearchException;
}

View File

@ -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<OaNodeManageVO> 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<OaNodeManageVO> getOaNodeManages() {
return oaNodeManages;
}
public void setOaNodeManages(List<OaNodeManageVO> oaNodeManages) {
this.oaNodeManages = oaNodeManages;
}
}

View File

@ -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<NodeFormFieldVO> 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<NodeFormFieldVO> getFormFields() {
return formFields;
}
public void setFormFields(List<NodeFormFieldVO> 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();
}
}

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -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);
/**
* 获取原生流程节点列表

View File

@ -29,13 +29,6 @@ public interface IActivitiService {
*/
String create(ActivitiVO activitiVO) throws UnsupportedEncodingException;
/**
* 删除模型
*
* @param modelId 模型ID
*/
void delete(String modelId);
/**
* 发布模型

View File

@ -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

View File

@ -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

View File

@ -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<FlowNode> 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<FlowNode> flowNodes) {
List<ActivitiFlowNodeDTO> 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<FormFieldPO> 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<NodeFieldVO> 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<ActivitiFlowNodeDTO> 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);

View File

@ -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);
}

View File

@ -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<NodeFormFieldVO> 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<NodeFormFieldVO> 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);
/**
* 节点列表
*

View File

@ -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);
}

View File

@ -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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> params = getHashMap(6);
params.put("modelId", modelId);
params.put("modelVersion", modelVersion);
params.put("nodeId", nodeId);
nodeAssigneeDao.delete(params);
}
}

View File

@ -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<NodeFormFieldVO> formFields) {
LOG.debug("新增字段配置");
formFields.forEach(nodeFormFieldVO -> {
Map<String, Object> 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<NodeFormFieldVO> formFields) {
delete(modelId, modelVersion, nodeId, formId);
save(modelId, modelVersion, nodeId, nodeIndex, formId, formFields);
}
@Override
public void updateDeploymentId(String modelId, Integer modelVersion, String deploymentId) {
Map<String, Object> 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<String, Object> params = getHashMap(4);
params.put("modelId", modelId);
params.put("modelVersion", modelVersion);
nodeFieldDao.delete(params);
}
@Override
public List<NodeFieldDTO> listNodeByDeploymentId(String deploymentId) {
Map<String, Object> 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<NodeFieldVO> formFields) {
formFields.forEach(nodeFieldVO -> {
Map<String, Object> params = HashMapUtil.beanToMap(nodeFieldVO);
params.put("nodeFieldId", UUIDUtil.getUUID());
params.put("deploymentId", deploymentId);
params.put("formId", formId);
params.put("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<String, Object> 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);
}

View File

@ -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<OaNodeManageVO> 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<NodeFormFieldVO> 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<NodeFormFieldVO> 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);
}
}

View File

@ -0,0 +1,125 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="ink.wgink.module.activiti.dao.oa.INodeAssigneeDao">
<update id="createTable">
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='节点代理人';
</update>
<!-- 新增 -->
<insert id="save" parameterType="map">
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}
)
</insert>
<!-- 删除 -->
<delete id="delete" parameterType="map">
DELETE FROM
oa_node_assignee
WHERE
model_id = #{modelId}
AND
model_version = #{modelVersion}
<if test="nodeId != null and nodeId != ''">
AND
node_id = #{nodeId}
</if>
</delete>
<!-- 更新部署ID -->
<update id="updateDeploymentId" parameterType="map">
UPDATE
oa_node_assignee
SET
deployment_id = #{deploymentId}
WHERE
model_id = #{modelId}
AND
model_version = #{modelVersion}
</update>
<!-- 删除部署ID -->
<update id="deleteDeploymentId" parameterType="java.lang.String">
UPDATE
oa_node_assignee
SET
deployment_id = NULL
WHERE
deployment_id = #{_parameter}
</update>
</mapper>

View File

@ -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 id="save" parameterType="map">
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}
<if test="formId != null and formId != ''">
AND
form_id = #{formId}
</if>
<if test="flowNodeId != null and flowNodeId != ''">
<if test="nodeId != null and nodeId != ''">
AND
flow_node_id = #{flowNodeId}
node_id = #{nodeId}
</if>
</delete>
@ -87,6 +96,28 @@
node_field_id = #{nodeFieldId}
</update>
<!-- 更新部署ID -->
<update id="updateDeploymentId" parameterType="map">
UPDATE
oa_node_field
SET
deployment_id = #{deploymentId}
WHERE
model_id = #{modelId}
AND
model_version = #{modelVersion}
</update>
<!-- 删除部署ID -->
<update id="deleteDeploymentId" parameterType="java.lang.String">
UPDATE
oa_node_field
SET
deployment_id = NULL
WHERE
deployment_id = #{_parameter}
</update>
<!-- 节点列表 -->
<select id="listNode" parameterType="map" resultMap="nodeFieldDTO">
SELECT

View File

@ -49,7 +49,7 @@ var KisBpmAssignmentPopupCtrl = ['$scope', function ($scope) {
$scope.assignment.candidateUsers = [{value: ''}];
}
$scope.selectUserId = function() {
$scope.selectUserId = function () {
top.dialog.dialogData.selectedUserIds = $scope.assignment.assignee;
top.dialog.open({
url: top.restAjax.path('route/department/user/select-user', []),
@ -57,11 +57,11 @@ var KisBpmAssignmentPopupCtrl = ['$scope', function ($scope) {
width: '500px',
height: '500px',
closeBtn: 0,
onClose: function() {
onClose: function () {
var selectedUsers = top.dialog.dialogData.selectedDepartmentUsers;
// 这里写处理逻辑
if(selectedUsers && selectedUsers.length > 0) {
if(selectedUsers.length > 1) {
if (selectedUsers && selectedUsers.length > 0) {
if (selectedUsers.length > 1) {
top.dialog.msg('处理人只能选择一位');
return;
}
@ -74,15 +74,15 @@ var KisBpmAssignmentPopupCtrl = ['$scope', function ($scope) {
})
}
$scope.selectCandidateUserId = function() {
$scope.selectCandidateUserId = function () {
var userIds = '';
var candidateUsers = $scope.assignment.candidateUsers;
if(candidateUsers && candidateUsers.length > 0) {
for(var i = 0, item; item = candidateUsers[i++];) {
if(item == '') {
if (candidateUsers && candidateUsers.length > 0) {
for (var i = 0, item; item = candidateUsers[i++];) {
if (item == '') {
continue;
}
if(userIds.length > 0) {
if (userIds.length > 0) {
userIds += '_';
}
userIds += item.value;
@ -95,12 +95,12 @@ var KisBpmAssignmentPopupCtrl = ['$scope', function ($scope) {
width: '500px',
height: '500px',
closeBtn: 0,
onClose: function() {
onClose: function () {
var selectedUsers = top.dialog.dialogData.selectedDepartmentUsers;
// 这里写处理逻辑
if(selectedUsers && selectedUsers.length > 0) {
if (selectedUsers && selectedUsers.length > 0) {
var candidateUserArray = [];
for(var i = 0, item; item = selectedUsers[i++];) {
for (var i = 0, item; item = selectedUsers[i++];) {
candidateUserArray.push({
value: item.userId
})

View File

@ -27,11 +27,15 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function($scope, $ti
assigneeType: '',
assigneeCount: 0,
assignee: '',
assigneeName: '',
autoAssignType: '',
departmentType: '',
departments: '',
departmentNames: '',
roles: '',
roleNames: '',
positions: '',
positionNames: '',
quickAssignee: '',
signType: '',
signUsers: '',
@ -131,6 +135,71 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function($scope, $ti
$scope.oaNodeManage.oaUserTaskListeners.splice(index, 1);
}
// 选择用户
$scope.selectUser = function() {
var assignee = $scope.oaNodeManage.assignee;
top.dialog.dialogData.selectedUserIds = assignee.assignee;
top.dialog.open({
url: top.restAjax.path('route/department/user/select-user', []),
title: '选择用户',
width: '500px',
height: '500px',
closeBtn: 0,
onClose: function () {
var selectedUsers = top.dialog.dialogData.selectedDepartmentUsers;
// 这里写处理逻辑
if (selectedUsers && selectedUsers.length > 0) {
if(selectedUsers.length > 1) {
top.dialog.msg('只能选择一位代理人');
return;
}
var userId = selectedUsers[0].userId;
var userName = selectedUsers[0].userName;
assignee.assignee = selectedUsers[0].userId;
assignee.assigneeName = selectedUsers[0].userName;
} else {
assignee.assignee = '';
assignee.assigneeName = '';
}
top.dialog.dialogData.selectedDepartmentUsers = [];
$scope.$apply();
}
})
}
$scope.selectDepartments = function() {
var assignee = $scope.oaNodeManage.assignee;
top.dialog.dialogData.checkedIds = !assignee.departments ? [] : assignee.departments.split(',');
top.dialog.open({
url: top.restAjax.path('route/department/list-tree-check', []),
title: '选择组织部门',
width: '400px',
height: '400px',
onClose: function() {
var checkedNodes = top.dialog.dialogData.checkedNodes;
if(checkedNodes && checkedNodes.length > 0) {
var departments = '';
var departmentNames = '';
for(var i = 0, item; item = checkedNodes[i++];) {
if(departments.length > 0) {
departments += ',';
departmentNames += ',';
}
departments += item.id;
departmentNames += item.name;
}
assignee.departments = departments;
assignee.departmentNames = departmentNames;
} else {
assignee.departments = '';
assignee.departmentNames = '';
}
top.dialog.dialogData.checkedNodes = [];
$scope.$apply();
}
});
}
// Click handler for save button
$scope.save = function () {
@ -177,14 +246,33 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function($scope, $ti
}
}
// 初始化oaUserTaskCompleteListener
function initOaUserTaskCompleteListener() {
if($scope.property.value) {
return;
}
var event = 'complete',
className = '',
expression = '',
delegateExpression = '${oaUserTaskCompleteListener}';
if (isListenerExist(event, className)) {
top.dialog.msg('监听器已经存在');
return;
}
addOaUserTaskListener(event, className, expression, delegateExpression);
}
// 初始化form表单ID
function initFormId() {
function initFormId(callback) {
$scope.oaNodeManage.formId = startNode.properties.formkeydefinition;
if(!$scope.oaNodeManage.formId) {
top.dialog.msg('开始节点未绑定表单无法设置OA节点');
$scope.close();
$timeout(function() {
$scope.close();
}, 10)
return;
}
callback();
}
// 初始化form表单
@ -216,29 +304,14 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function($scope, $ti
})
}
// 初始化oaUserTaskCompleteListener
function initOaUserTaskCompleteListener() {
if($scope.property.value) {
return;
}
var event = 'complete',
className = '',
expression = '',
delegateExpression = '${oaUserTaskCompleteListener}';
if (isListenerExist(event, className)) {
top.dialog.msg('监听器已经存在');
return;
}
addOaUserTaskListener(event, className, expression, delegateExpression);
}
// 初始化
(function() {
initOaNodeManage();
initStartNode();
initFormId();
initFormField();
initOaUserTaskCompleteListener();
initFormId(function() {
initFormField();
});
})();
}];

View File

@ -84,8 +84,9 @@
<tr ng-if="oaNodeManage.assignee.nodeType == 'normal' && oaNodeManage.assignee.assigneeType == 'appoint' && oaNodeManage.assignee.assigneeCount == 'single'">
<td>
<input ng-model="oaNodeManage.assignee.assignee" type="hidden" name="assignee">
<button type="button">选择</button>
<span>用户1</span>
<input ng-model="oaNodeManage.assignee.assigneeName" type="hidden" name="assigneeName">
<button type="button" ng-click="selectUser()">选择</button>
<span>{{oaNodeManage.assignee.assigneeName}}</span>
</td>
</tr>
<!-- 手动指定代理人 end -->
@ -134,8 +135,9 @@
<tr ng-if="oaNodeManage.assignee.nodeType == 'normal' && oaNodeManage.assignee.assigneeType == 'auto' && oaNodeManage.assignee.autoAssignType == 'scope' && oaNodeManage.assignee.departmentType == 'appoint'">
<td>
<input ng-model="oaNodeManage.assignee.departments" type="hidden" name="departments">
<button type="button">选择</button>
<span>部门</span>
<input ng-model="oaNodeManage.assignee.departmentNames" type="hidden" name="departmentNames">
<button type="button" ng-click="selectDepartments()">选择</button>
<span>{{oaNodeManage.assignee.departmentNames}}</span>
</td>
</tr>

View File

@ -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));

View File

@ -26,7 +26,7 @@
</div>
<div class="full">
<div class="row row-no-gutter">
<div id="paletteHelpWrapper" class="col-xs-3">
<div id="paletteHelpWrapper" class="col-xs-2">
<div class="stencils" id="paletteSection">
<div ng-if="stencilItemGroups.length > 1">
<div ng-repeat="group in stencilItemGroups">
@ -56,7 +56,7 @@
</div>
</div>
</div>
<div id="canvasHelpWrapper" class="col-xs-9">
<div id="canvasHelpWrapper" class="col-xs-10">
<div class="canvas-wrapper" id="canvasSection"
ng-model="droppedElement"
ng-model="droppedElement"
@ -92,7 +92,7 @@
</div>
</div>
</div>
<div id="propertiesHelpWrapper" class="col-xs-9">
<div id="propertiesHelpWrapper" class="col-xs-10">
<div class="propertySection" id="propertySection"
ng-class="{collapsed: propertyWindowState.collapsed}">
<div class="selected-item-section">
@ -130,6 +130,6 @@
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@ -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);
});
}
});
}
});
});

View File

@ -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 '<div class="layui-btn-group">' +
'<button class="layui-btn layui-btn-xs" lay-event="nodeEvent">节点管理</button>'+
'<button class="layui-btn layui-btn-xs layui-btn-danger" lay-event="deleteEvent">删除</button>'+
'</div>';
}
@ -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,