OA增加节点按钮管理

This commit is contained in:
wanggeng 2022-04-27 22:55:53 +08:00
parent b972e6d172
commit 9b948b4b5a
27 changed files with 941 additions and 90 deletions

View File

@ -44,15 +44,15 @@ public class ActivitiModelController extends DefaultBaseController {
@ApiImplicitParam(name = "modelId", value = "模型ID", paramType = "path") @ApiImplicitParam(name = "modelId", value = "模型ID", paramType = "path")
}) })
@ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
@PutMapping("save/{modelId}") @PutMapping("save/{modelId}/version/{modelVersion}")
public SuccessResult saveModel(@PathVariable String modelId, @RequestBody ActivitiModelVO activitiModelVO) throws Exception { public SuccessResult saveModel(@PathVariable String modelId, @PathVariable("modelVersion") Integer modelVersion, @RequestBody ActivitiModelVO activitiModelVO) throws Exception {
if (StringUtils.isBlank(activitiModelVO.getName())) { if (StringUtils.isBlank(activitiModelVO.getName())) {
throw new ParamsException("流程名称不能为空"); throw new ParamsException("流程名称不能为空");
} }
if(StringUtils.isBlank(activitiModelVO.getDescription())) { if(StringUtils.isBlank(activitiModelVO.getDescription())) {
throw new ParamsException("流程描述不能为空"); throw new ParamsException("流程描述不能为空");
} }
activitiModelService.save(modelId, activitiModelVO); activitiModelService.save(modelId, modelVersion, activitiModelVO);
return new SuccessResult(); return new SuccessResult();
} }

View File

@ -0,0 +1,56 @@
package ink.wgink.module.activiti.dao.oa;
import ink.wgink.exceptions.RemoveException;
import ink.wgink.exceptions.SaveException;
import ink.wgink.exceptions.SearchException;
import ink.wgink.exceptions.UpdateException;
import ink.wgink.interfaces.init.IInitBaseTable;
import ink.wgink.module.activiti.pojo.dtos.oa.NodeButtonDTO;
import org.springframework.stereotype.Repository;
import java.util.Map;
/**
* @ClassName: INodeButtonDao
* @Description: 节点按钮
* @Author: wanggeng
* @Date: 2022/4/27 11:00
* @Version: 1.0
*/
@Repository
public interface INodeButtonDao extends IInitBaseTable {
/**
* 新增配置
*
* @param params
* @throws SaveException
*/
void save(Map<String, Object> params) throws SaveException;
/**
* 删除配置
*
* @param params
* @throws RemoveException
*/
void delete(Map<String, Object> params) throws RemoveException;
/**
* 更新部署ID
*
* @param params
* @throws UpdateException
*/
void updateDeploymentId(Map<String, Object> params) throws UpdateException;
/**
* 详情
*
* @param params
* @return
* @throws SearchException
*/
NodeButtonDTO get(Map<String, Object> params) throws SearchException;
}

View File

@ -0,0 +1,85 @@
package ink.wgink.module.activiti.pojo.dtos.oa;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
/**
* @Description: 节点字段
* @Author: WenG
* @Date: 2022/3/19 11:05
* @Version: 1.0
**/
@ApiModel
public class NodeButtonDTO {
@ApiModelProperty(name = "nodeButtonId", value = "主键")
private String nodeButtonId;
@ApiModelProperty(name = "formId", value = "表单ID")
private String formId;
@ApiModelProperty(name = "deploymentId", value = "部署ID")
private String deploymentId;
@ApiModelProperty(name = "nodeIndex", value = "节点下标")
private String nodeIndex;
@ApiModelProperty(name = "nodeId", value = "节点ID")
private String nodeId;
@ApiModelProperty(name = "btnAttachment", value = "上传附件")
private Integer btnAttachment;
@ApiModelProperty(name = "btnGoBack", value = "回退")
private Integer btnGoBack;
public String getNodeButtonId() {
return nodeButtonId == null ? "" : nodeButtonId.trim();
}
public void setNodeButtonId(String nodeButtonId) {
this.nodeButtonId = nodeButtonId;
}
public String getFormId() {
return formId == null ? "" : formId.trim();
}
public void setFormId(String formId) {
this.formId = formId;
}
public String getDeploymentId() {
return deploymentId == null ? "" : deploymentId.trim();
}
public void setDeploymentId(String deploymentId) {
this.deploymentId = deploymentId;
}
public String getNodeIndex() {
return nodeIndex == null ? "" : nodeIndex.trim();
}
public void setNodeIndex(String nodeIndex) {
this.nodeIndex = nodeIndex;
}
public String getNodeId() {
return nodeId == null ? "" : nodeId.trim();
}
public void setNodeId(String nodeId) {
this.nodeId = nodeId;
}
public Integer getBtnAttachment() {
return btnAttachment == null ? 0 : btnAttachment;
}
public void setBtnAttachment(Integer btnAttachment) {
this.btnAttachment = btnAttachment;
}
public Integer getBtnGoBack() {
return btnGoBack == null ? 0 : btnGoBack;
}
public void setBtnGoBack(Integer btnGoBack) {
this.btnGoBack = btnGoBack;
}
}

View File

@ -30,6 +30,8 @@ public class NodeFieldDTO {
private Integer isEditable; private Integer isEditable;
@ApiModelProperty(name = "editHistory", value = "编辑历史") @ApiModelProperty(name = "editHistory", value = "编辑历史")
private String editHistory; private String editHistory;
@ApiModelProperty(name = "autoBackFill", value = "自动回填")
private String autoBackFill;
public String getNodeFieldId() { public String getNodeFieldId() {
return nodeFieldId; return nodeFieldId;
@ -102,4 +104,12 @@ public class NodeFieldDTO {
public void setEditHistory(String editHistory) { public void setEditHistory(String editHistory) {
this.editHistory = editHistory; this.editHistory = editHistory;
} }
public String getAutoBackFill() {
return autoBackFill == null ? "" : autoBackFill.trim();
}
public void setAutoBackFill(String autoBackFill) {
this.autoBackFill = autoBackFill;
}
} }

View File

@ -1,6 +1,7 @@
package ink.wgink.module.activiti.pojo.vos.oa.nodemanage; 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.AssigneeVO;
import ink.wgink.module.activiti.pojo.vos.oa.nodemanage.config.NodeFormButtonVO;
import ink.wgink.module.activiti.pojo.vos.oa.nodemanage.config.NodeFormFieldVO; import ink.wgink.module.activiti.pojo.vos.oa.nodemanage.config.NodeFormFieldVO;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
@ -23,6 +24,8 @@ public class ConfigVO {
private AssigneeVO assignee; private AssigneeVO assignee;
@ApiModelProperty(name = "formFields", value = "表单字段列表") @ApiModelProperty(name = "formFields", value = "表单字段列表")
private List<NodeFormFieldVO> formFields; private List<NodeFormFieldVO> formFields;
@ApiModelProperty(name = "formButton", value = "表单按钮")
private NodeFormButtonVO formButton;
public String getFormId() { public String getFormId() {
return formId == null ? "" : formId.trim(); return formId == null ? "" : formId.trim();
@ -48,6 +51,14 @@ public class ConfigVO {
this.formFields = formFields; this.formFields = formFields;
} }
public NodeFormButtonVO getFormButton() {
return formButton;
}
public void setFormButton(NodeFormButtonVO formButton) {
this.formButton = formButton;
}
@Override @Override
public String toString() { public String toString() {
final StringBuilder sb = new StringBuilder("{"); final StringBuilder sb = new StringBuilder("{");
@ -57,6 +68,8 @@ public class ConfigVO {
.append(assignee); .append(assignee);
sb.append(",\"formFields\":") sb.append(",\"formFields\":")
.append(formFields); .append(formFields);
sb.append(",\"formButton\":")
.append(formButton);
sb.append('}'); sb.append('}');
return sb.toString(); return sb.toString();
} }

View File

@ -0,0 +1,35 @@
package ink.wgink.module.activiti.pojo.vos.oa.nodemanage.config;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
/**
* @Description: 按钮与流程节点
* @Author: WenG
* @Date: 2022/3/17 19:51
* @Version: 1.0
**/
@ApiModel
public class NodeFormButtonVO {
@ApiModelProperty(name = "btnAttachment", value = "附件上传按钮")
private Integer btnAttachment;
@ApiModelProperty(name = "btnGoBack", value = "回退按钮")
private Integer btnGoBack;
public Integer getBtnAttachment() {
return btnAttachment == null ? 0 : btnAttachment;
}
public void setBtnAttachment(Integer btnAttachment) {
this.btnAttachment = btnAttachment;
}
public Integer getBtnGoBack() {
return btnGoBack == null ? 0 : btnGoBack;
}
public void setBtnGoBack(Integer btnGoBack) {
this.btnGoBack = btnGoBack;
}
}

View File

@ -29,6 +29,8 @@ public class NodeFormFieldVO {
private Boolean isVisible; private Boolean isVisible;
@ApiModelProperty(name = "editHistory", value = "编辑历史") @ApiModelProperty(name = "editHistory", value = "编辑历史")
private String editHistory; private String editHistory;
@ApiModelProperty(name = "autoFillBack", value = "自动填充")
private String autoFillBack;
public String getFieldId() { public String getFieldId() {
return fieldId == null ? "" : fieldId.trim(); return fieldId == null ? "" : fieldId.trim();
@ -94,6 +96,14 @@ public class NodeFormFieldVO {
this.editHistory = editHistory; this.editHistory = editHistory;
} }
public String getAutoFillBack() {
return autoFillBack == null ? "" : autoFillBack.trim();
}
public void setAutoFillBack(String autoFillBack) {
this.autoFillBack = autoFillBack;
}
@Override @Override
public String toString() { public String toString() {
final StringBuilder sb = new StringBuilder("{"); final StringBuilder sb = new StringBuilder("{");
@ -113,6 +123,8 @@ public class NodeFormFieldVO {
.append(isVisible); .append(isVisible);
sb.append(",\"editHistory\":\"") sb.append(",\"editHistory\":\"")
.append(editHistory).append('\"'); .append(editHistory).append('\"');
sb.append(",\"autoFillBack\":\"")
.append(autoFillBack).append('\"');
sb.append('}'); sb.append('}');
return sb.toString(); return sb.toString();
} }

View File

@ -0,0 +1,42 @@
package ink.wgink.module.activiti.pojo.vos.oa.page;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName: FieldControlVO
* @Description: 字段
* @Author: wanggeng
* @Date: 2022/4/20 14:59
* @Version: 1.0
*/
public class FormButtonVO {
private Integer btnAttachment;
private Integer btnGoBack;
private List<GoBackUserTaskVO> goBackUserTasks;
public Integer getBtnAttachment() {
return btnAttachment == null ? 0 : btnAttachment;
}
public void setBtnAttachment(Integer btnAttachment) {
this.btnAttachment = btnAttachment;
}
public Integer getBtnGoBack() {
return btnGoBack == null ? 0 : btnGoBack;
}
public void setBtnGoBack(Integer btnGoBack) {
this.btnGoBack = btnGoBack;
}
public List<GoBackUserTaskVO> getGoBackUserTasks() {
return goBackUserTasks == null ? new ArrayList() : goBackUserTasks;
}
public void setGoBackUserTasks(List<GoBackUserTaskVO> goBackUserTasks) {
this.goBackUserTasks = goBackUserTasks;
}
}

View File

@ -0,0 +1,57 @@
package ink.wgink.module.activiti.pojo.vos.oa.page;
/**
* @ClassName: GoBackUserTaskVO
* @Description: 回退用户任务
* @Author: wanggeng
* @Date: 2022/4/27 17:21
* @Version: 1.0
*/
public class GoBackUserTaskVO {
private String taskId;
private String nodeId;
private String taskName;
private String userId;
private String userName;
public String getTaskId() {
return taskId == null ? "" : taskId.trim();
}
public void setTaskId(String taskId) {
this.taskId = taskId;
}
public String getNodeId() {
return nodeId == null ? "" : nodeId.trim();
}
public void setNodeId(String nodeId) {
this.nodeId = nodeId;
}
public String getTaskName() {
return taskName == null ? "" : taskName.trim();
}
public void setTaskName(String taskName) {
this.taskName = taskName;
}
public String getUserId() {
return userId == null ? "" : userId.trim();
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName == null ? "" : userName.trim();
}
public void setUserName(String userName) {
this.userName = userName;
}
}

View File

@ -64,10 +64,11 @@ public interface IActivitiModelService {
* 保存模型 * 保存模型
* *
* @param modelId * @param modelId
* @param modelVersion
* @param activitiModelVO * @param activitiModelVO
* @throws Exception * @throws Exception
*/ */
void save(String modelId, ActivitiModelVO activitiModelVO) throws Exception; void save(String modelId, Integer modelVersion, ActivitiModelVO activitiModelVO) throws Exception;
/** /**
* 删除模型 * 删除模型

View File

@ -60,19 +60,22 @@ public class ActivitiModelServiceImpl extends DefaultBaseService implements IAct
private INodeManageService nodeManageService; private INodeManageService nodeManageService;
@Override @Override
public void save(String modelId, ActivitiModelVO activitiModelVO) throws Exception { public void save(String modelId, Integer modelVersion, ActivitiModelVO activitiModelVO) throws Exception {
Model model = repositoryService.getModel(modelId); Model model = repositoryService.getModel(modelId);
if (model == null) { if (model == null) {
throw new SearchException("模型不存在"); throw new SearchException("模型不存在");
} }
String deploymentId = model.getDeploymentId(); String deploymentId = null;
Integer modelVersion; Integer existModelVersion = model.getVersion();
if (!StringUtils.isBlank(deploymentId)) { Integer newModelVersion;
LOG.debug("已经部署,版本号递增"); // 版本相同的模型如果已经部署创建新版本如果没有部署版本号不变
modelVersion = model.getVersion() + 1; if (modelVersion.equals(existModelVersion) && !StringUtils.isBlank(model.getDeploymentId())) {
LOG.debug("最新版本已经部署,版本号递增");
newModelVersion = model.getVersion() + 1;
deploymentId = model.getDeploymentId();
} else { } else {
LOG.debug("未部署,版本号不变"); LOG.debug("最新版本未部署,版本号不变");
modelVersion = model.getVersion(); newModelVersion = model.getVersion();
} }
JSONObject modelObject = JSONObject.parseObject(model.getMetaInfo()); JSONObject modelObject = JSONObject.parseObject(model.getMetaInfo());
@ -80,7 +83,7 @@ public class ActivitiModelServiceImpl extends DefaultBaseService implements IAct
modelObject.put(MODEL_DESCRIPTION, activitiModelVO.getDescription()); modelObject.put(MODEL_DESCRIPTION, activitiModelVO.getDescription());
model.setMetaInfo(modelObject.toString()); model.setMetaInfo(modelObject.toString());
model.setName(activitiModelVO.getName()); model.setName(activitiModelVO.getName());
model.setVersion(modelVersion); model.setVersion(newModelVersion);
repositoryService.saveModel(model); repositoryService.saveModel(model);
repositoryService.addModelEditorSource(model.getId(), activitiModelVO.getJsonXml().getBytes(ISystemConstant.CHARSET_UTF8)); repositoryService.addModelEditorSource(model.getId(), activitiModelVO.getJsonXml().getBytes(ISystemConstant.CHARSET_UTF8));
@ -99,7 +102,7 @@ public class ActivitiModelServiceImpl extends DefaultBaseService implements IAct
outStream.close(); outStream.close();
LOG.debug("保存节点配置"); LOG.debug("保存节点配置");
nodeManageService.save(activitiModelVO, modelId, modelVersion, deploymentId); nodeManageService.save(activitiModelVO, modelId, newModelVersion, deploymentId);
} }
@Override @Override
@ -322,6 +325,7 @@ public class ActivitiModelServiceImpl extends DefaultBaseService implements IAct
result.put(MODEL_NAME, model.getName()); result.put(MODEL_NAME, model.getName());
} }
result.put(MODEL_ID, model.getId()); result.put(MODEL_ID, model.getId());
result.put("modelVersion", model.getVersion());
String readTree = new String(repositoryService.getModelEditorSource(model.getId()), ISystemConstant.CHARSET_UTF8); String readTree = new String(repositoryService.getModelEditorSource(model.getId()), ISystemConstant.CHARSET_UTF8);
JSONObject editorJson = JSONObject.parseObject(readTree); JSONObject editorJson = JSONObject.parseObject(readTree);
result.put("model", editorJson); result.put("model", editorJson);

View File

@ -12,6 +12,7 @@ import ink.wgink.module.activiti.pojo.vos.ActivitiVO;
import ink.wgink.module.activiti.service.activiti.IActivitiModelService; import ink.wgink.module.activiti.service.activiti.IActivitiModelService;
import ink.wgink.module.activiti.service.activiti.IActivitiService; import ink.wgink.module.activiti.service.activiti.IActivitiService;
import ink.wgink.module.activiti.service.oa.INodeAssigneeService; import ink.wgink.module.activiti.service.oa.INodeAssigneeService;
import ink.wgink.module.activiti.service.oa.INodeButtonService;
import ink.wgink.module.activiti.service.oa.INodeFieldService; import ink.wgink.module.activiti.service.oa.INodeFieldService;
import ink.wgink.pojo.result.SuccessResultList; import ink.wgink.pojo.result.SuccessResultList;
import ink.wgink.util.date.DateUtil; import ink.wgink.util.date.DateUtil;
@ -55,6 +56,8 @@ public class ActivitiServiceImpl extends DefaultBaseService implements IActiviti
private INodeAssigneeService nodeAssigneeService; private INodeAssigneeService nodeAssigneeService;
@Autowired @Autowired
private INodeFieldService nodeFieldService; private INodeFieldService nodeFieldService;
@Autowired
private INodeButtonService nodeButtonService;
@Override @Override
public String create(ActivitiVO activitiVO) throws UnsupportedEncodingException { public String create(ActivitiVO activitiVO) throws UnsupportedEncodingException {
@ -102,6 +105,8 @@ public class ActivitiServiceImpl extends DefaultBaseService implements IActiviti
nodeAssigneeService.updateDeploymentId(modelId, model.getVersion(), deploymentId); nodeAssigneeService.updateDeploymentId(modelId, model.getVersion(), deploymentId);
LOG.debug("3.绑定节点表单字段"); LOG.debug("3.绑定节点表单字段");
nodeFieldService.updateDeploymentId(modelId, model.getVersion(), deploymentId); nodeFieldService.updateDeploymentId(modelId, model.getVersion(), deploymentId);
LOG.debug("4.绑定节点按钮");
nodeButtonService.updateDeploymentId(modelId, model.getVersion(), deploymentId);
} else { } else {
LOG.debug("不存在自定义表单不是OA流程直接部署"); LOG.debug("不存在自定义表单不是OA流程直接部署");
deploymentId = deployProcess(model, bpmnModel); deploymentId = deployProcess(model, bpmnModel);

View File

@ -0,0 +1,55 @@
package ink.wgink.module.activiti.service.oa;
import ink.wgink.module.activiti.pojo.dtos.oa.NodeButtonDTO;
import ink.wgink.module.activiti.pojo.vos.oa.nodemanage.config.NodeFormButtonVO;
/**
* @ClassName: INodeButtonService
* @Description: 节点按钮
* @Author: wanggeng
* @Date: 2022/4/27 11:38
* @Version: 1.0
*/
public interface INodeButtonService {
/**
* 保存节点按钮
*
* @param modelId
* @param modelVersion
* @param nodeId
* @param nodeIndex
* @param formId
* @param nodeButton
*/
void save(String modelId, Integer modelVersion, String nodeId, int nodeIndex, String formId, NodeFormButtonVO nodeButton);
/**
* 更新节点按钮
*
* @param modelId
* @param modelVersion
* @param nodeId
* @param nodeIndex
* @param formId
* @param nodeButton
*/
void update(String modelId, Integer modelVersion, String nodeId, int nodeIndex, String formId, NodeFormButtonVO nodeButton);
/**
* 更新部署ID
*
* @param modelId
* @param modelVersion
* @param deploymentId
*/
void updateDeploymentId(String modelId, Integer modelVersion, String deploymentId);
/**
* @param deploymentId
* @param nodeId
* @return
*/
NodeButtonDTO getByDeploymentIdAndNodeId(String deploymentId, String nodeId);
}

View File

@ -24,6 +24,7 @@ public interface IOaFormReportService {
String KEY_SELECT_TYPE = "selectType"; String KEY_SELECT_TYPE = "selectType";
String KEY_IS_NEXT_END_EVENT = "isNextEndEvent"; String KEY_IS_NEXT_END_EVENT = "isNextEndEvent";
String KEY_RECORD_FIELDS = "recordFields"; String KEY_RECORD_FIELDS = "recordFields";
String KEY_ASSIGNEE_USER_NAME = "assigneeUserName";
/** /**
* 编辑记录分隔符 * 编辑记录分隔符
*/ */

View File

@ -0,0 +1,80 @@
package ink.wgink.module.activiti.service.oa.impl;
import ink.wgink.common.base.DefaultBaseService;
import ink.wgink.module.activiti.dao.oa.INodeButtonDao;
import ink.wgink.module.activiti.pojo.dtos.oa.NodeButtonDTO;
import ink.wgink.module.activiti.pojo.vos.oa.nodemanage.config.NodeFormButtonVO;
import ink.wgink.module.activiti.service.oa.INodeButtonService;
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: NodeButtonServiceImpl
* @Description: 节点按钮
* @Author: wanggeng
* @Date: 2022/4/27 11:39
* @Version: 1.0
*/
@Service
public class NodeButtonServiceImpl extends DefaultBaseService implements INodeButtonService {
@Autowired
private INodeButtonDao nodeButtonDao;
@Override
public void save(String modelId, Integer modelVersion, String nodeId, int nodeIndex, String formId, NodeFormButtonVO nodeButton) {
Map<String, Object> params = HashMapUtil.beanToMap(nodeButton);
params.put("nodeButtonId", UUIDUtil.getUUID());
params.put("modelId", modelId);
params.put("modelVersion", modelVersion);
params.put("nodeId", nodeId);
params.put("nodeIndex", nodeIndex);
params.put("formId", formId);
nodeButtonDao.save(params);
}
@Override
public void update(String modelId, Integer modelVersion, String nodeId, int nodeIndex, String formId, NodeFormButtonVO nodeButton) {
delete(modelId, modelVersion, nodeId, formId);
save(modelId, modelVersion, nodeId, nodeIndex, formId, nodeButton);
}
@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);
nodeButtonDao.updateDeploymentId(params);
}
@Override
public NodeButtonDTO getByDeploymentIdAndNodeId(String deploymentId, String nodeId) {
Map<String, Object> params = getHashMap(4);
params.put("deploymentId", deploymentId);
params.put("nodeId", nodeId);
return nodeButtonDao.get(params);
}
/**
* 删除
*
* @param modelId 模型ID
* @param modelVersion 模型版本
* @param nodeId 节点ID
* @param formId 表单ID
*/
private void delete(String modelId, Integer modelVersion, String nodeId, String formId) {
LOG.debug("删除原有按钮配置");
Map<String, Object> params = getHashMap(6);
params.put("modelId", modelId);
params.put("modelVersion", modelVersion);
params.put("nodeId", nodeId);
params.put("formId", formId);
nodeButtonDao.delete(params);
}
}

View File

@ -6,8 +6,9 @@ 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.AssigneeVO;
import ink.wgink.module.activiti.pojo.vos.oa.nodemanage.config.NodeFormFieldVO; 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.INodeAssigneeService;
import ink.wgink.module.activiti.service.oa.INodeManageService; import ink.wgink.module.activiti.service.oa.INodeButtonService;
import ink.wgink.module.activiti.service.oa.INodeFieldService; import ink.wgink.module.activiti.service.oa.INodeFieldService;
import ink.wgink.module.activiti.service.oa.INodeManageService;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -28,6 +29,8 @@ public class NodeManageServiceImpl extends DefaultBaseService implements INodeMa
private INodeAssigneeService nodeAssigneeService; private INodeAssigneeService nodeAssigneeService;
@Autowired @Autowired
private INodeFieldService nodeFieldService; private INodeFieldService nodeFieldService;
@Autowired
private INodeButtonService nodeButtonService;
@Override @Override
public void save(ActivitiModelVO activitiModelVO, String modelId, Integer modelVersion, String deploymentId) { public void save(ActivitiModelVO activitiModelVO, String modelId, Integer modelVersion, String deploymentId) {
@ -47,6 +50,8 @@ public class NodeManageServiceImpl extends DefaultBaseService implements INodeMa
nodeAssigneeService.save(modelId, modelVersion, nodeId, i, assignee); nodeAssigneeService.save(modelId, modelVersion, nodeId, i, assignee);
// 保存节点与表单字段配置 // 保存节点与表单字段配置
nodeFieldService.save(modelId, modelVersion, nodeId, i, formId, formFields); nodeFieldService.save(modelId, modelVersion, nodeId, i, formId, formFields);
// 保存节点按钮
nodeButtonService.save(modelId, modelVersion, nodeId, i, formId, oaNodeManageVO.getConfig().getFormButton());
} }
} else { } else {
for (int i = 0; i < oaNodeManages.size(); i++) { for (int i = 0; i < oaNodeManages.size(); i++) {
@ -59,6 +64,8 @@ public class NodeManageServiceImpl extends DefaultBaseService implements INodeMa
nodeAssigneeService.update(modelId, modelVersion, nodeId, i, assignee); nodeAssigneeService.update(modelId, modelVersion, nodeId, i, assignee);
// 保存节点与表单字段配置 // 保存节点与表单字段配置
nodeFieldService.update(modelId, modelVersion, nodeId, i, formId, formFields); nodeFieldService.update(modelId, modelVersion, nodeId, i, formId, formFields);
// 保存节点按钮
nodeButtonService.update(modelId, modelVersion, nodeId, i, formId, oaNodeManageVO.getConfig().getFormButton());
} }
} }
} }

View File

@ -5,14 +5,15 @@ import com.alibaba.fastjson.JSONObject;
import ink.wgink.common.base.DefaultBaseService; import ink.wgink.common.base.DefaultBaseService;
import ink.wgink.exceptions.SearchException; import ink.wgink.exceptions.SearchException;
import ink.wgink.interfaces.user.IUserBaseService; import ink.wgink.interfaces.user.IUserBaseService;
import ink.wgink.module.activiti.pojo.dtos.oa.NodeButtonDTO;
import ink.wgink.module.activiti.pojo.dtos.oa.NodeFieldDTO; import ink.wgink.module.activiti.pojo.dtos.oa.NodeFieldDTO;
import ink.wgink.module.activiti.pojo.pos.oa.OaNodeAssigneePO; import ink.wgink.module.activiti.pojo.pos.oa.OaNodeAssigneePO;
import ink.wgink.module.activiti.pojo.vos.oa.page.FormButtonVO;
import ink.wgink.module.activiti.pojo.vos.oa.page.ConfirmAssigneeVO; import ink.wgink.module.activiti.pojo.vos.oa.page.ConfirmAssigneeVO;
import ink.wgink.module.activiti.pojo.vos.oa.page.FieldVO; import ink.wgink.module.activiti.pojo.vos.oa.page.FieldVO;
import ink.wgink.module.activiti.pojo.vos.oa.page.GoBackUserTaskVO;
import ink.wgink.module.activiti.service.activiti.IActivitiModelService; import ink.wgink.module.activiti.service.activiti.IActivitiModelService;
import ink.wgink.module.activiti.service.oa.INodeAssigneeService; import ink.wgink.module.activiti.service.oa.*;
import ink.wgink.module.activiti.service.oa.INodeFieldService;
import ink.wgink.module.activiti.service.oa.IOaFormReportRouteService;
import ink.wgink.module.form.enums.design.FormTypeEnum; import ink.wgink.module.form.enums.design.FormTypeEnum;
import ink.wgink.module.form.service.design.IFormFieldService; import ink.wgink.module.form.service.design.IFormFieldService;
import ink.wgink.module.form.service.report.IFormReportRouteService; import ink.wgink.module.form.service.report.IFormReportRouteService;
@ -20,8 +21,10 @@ import ink.wgink.pojo.dtos.user.UserDTO;
import org.activiti.bpmn.model.FlowNode; import org.activiti.bpmn.model.FlowNode;
import org.activiti.bpmn.model.SequenceFlow; import org.activiti.bpmn.model.SequenceFlow;
import org.activiti.bpmn.model.UserTask; import org.activiti.bpmn.model.UserTask;
import org.activiti.engine.HistoryService;
import org.activiti.engine.RepositoryService; import org.activiti.engine.RepositoryService;
import org.activiti.engine.TaskService; import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.repository.ProcessDefinition; import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.task.Task; import org.activiti.engine.task.Task;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -52,6 +55,8 @@ public class OaFormReportRouteServiceImpl extends DefaultBaseService implements
@Autowired @Autowired
private RepositoryService repositoryService; private RepositoryService repositoryService;
@Autowired @Autowired
private HistoryService historyService;
@Autowired
private IFormReportRouteService formReportRouteService; private IFormReportRouteService formReportRouteService;
@Autowired @Autowired
private IUserBaseService userBaseService; private IUserBaseService userBaseService;
@ -63,6 +68,8 @@ public class OaFormReportRouteServiceImpl extends DefaultBaseService implements
private IFormFieldService formFieldService; private IFormFieldService formFieldService;
@Autowired @Autowired
private INodeFieldService nodeFieldService; private INodeFieldService nodeFieldService;
@Autowired
private INodeButtonService nodeButtonService;
@Override @Override
public void save(String processDefinitionId, String formCode, Integer formVersion, HttpSession httpSession, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) { public void save(String processDefinitionId, String formCode, Integer formVersion, HttpSession httpSession, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
@ -81,9 +88,11 @@ public class OaFormReportRouteServiceImpl extends DefaultBaseService implements
model.put("confirmAssignees", JSON.toJSONString(confirmAssigneeVOs)); model.put("confirmAssignees", JSON.toJSONString(confirmAssigneeVOs));
setPageFields(deploymentId, firstUserTask, model); setPageFields(deploymentId, firstUserTask, model);
setPageFormButtonsAndHistoryUserTasks(deploymentId, null, firstUserTask, model);
formReportRouteService.save(formCode, formVersion, httpSession, httpServletRequest, httpServletResponse, model); formReportRouteService.save(formCode, formVersion, httpSession, httpServletRequest, httpServletResponse, model);
} }
@Override @Override
public void update(String taskId, String formCode, Integer formVersion, Integer isNeedClaim, HttpSession httpSession, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) { public void update(String taskId, String formCode, Integer formVersion, Integer isNeedClaim, HttpSession httpSession, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
@ -109,6 +118,7 @@ public class OaFormReportRouteServiceImpl extends DefaultBaseService implements
model.put("confirmAssignees", JSON.toJSONString(confirmAssigneeVOs)); model.put("confirmAssignees", JSON.toJSONString(confirmAssigneeVOs));
setPageFields(deploymentId, currentUserTask, model); setPageFields(deploymentId, currentUserTask, model);
setPageFormButtonsAndHistoryUserTasks(deploymentId, null, currentUserTask, model);
// 设置代理人 // 设置代理人
formReportRouteService.update(formCode, formVersion, httpSession, httpServletRequest, httpServletResponse, model); formReportRouteService.update(formCode, formVersion, httpSession, httpServletRequest, httpServletResponse, model);
} }
@ -161,6 +171,60 @@ public class OaFormReportRouteServiceImpl extends DefaultBaseService implements
model.put("fields", JSONObject.toJSONString(fieldVOs)); model.put("fields", JSONObject.toJSONString(fieldVOs));
} }
/**
* 设置页面按钮与历史任务如果没有回退按钮不设置回退
*
* @param deploymentId
* @param userTask
* @param model
*/
private void setPageFormButtonsAndHistoryUserTasks(String deploymentId, String currentTaskId, UserTask userTask, Map<String, Object> model) {
NodeButtonDTO nodeButtonDTO = nodeButtonService.getByDeploymentIdAndNodeId(deploymentId, userTask.getId());
FormButtonVO formButtonVO = new FormButtonVO();
if (nodeButtonDTO == null) {
model.put("formButton", JSONObject.toJSONString(formButtonVO));
return;
}
formButtonVO.setBtnAttachment(nodeButtonDTO.getBtnAttachment());
if (StringUtils.isBlank(currentTaskId)) {
formButtonVO.setBtnGoBack(0);
} else {
formButtonVO.setBtnGoBack(nodeButtonDTO.getBtnGoBack());
}
if (nodeButtonDTO.getBtnGoBack() == 1) {
LOG.debug("存在回退按钮,查询历史节点");
List<HistoricTaskInstance> historicTaskInstances = historyService.createHistoricTaskInstanceQuery()
.includeTaskLocalVariables()
.taskId(currentTaskId)
.finished()
.orderByHistoricTaskInstanceEndTime()
.asc()
.list();
List<GoBackUserTaskVO> goBackUserTaskVOs = historicTaskInstances.stream().map(historicTaskInstance -> {
String assigneeUserId = historicTaskInstance.getAssignee();
Map<String, Object> localVariables = historicTaskInstance.getTaskLocalVariables();
Object assigneeUserNameObject = localVariables.get(IOaFormReportService.KEY_ASSIGNEE_USER_NAME);
String assigneeUserName = localVariables.get(IOaFormReportService.KEY_ASSIGNEE_USER_NAME).toString();
if (assigneeUserNameObject != null) {
assigneeUserName = assigneeUserNameObject.toString();
}
String nodeId = historicTaskInstance.getTaskDefinitionKey();
String taskId = historicTaskInstance.getId();
String taskName = historicTaskInstance.getName();
GoBackUserTaskVO goBackUserTaskVO = new GoBackUserTaskVO();
goBackUserTaskVO.setTaskId(taskId);
goBackUserTaskVO.setNodeId(nodeId);
goBackUserTaskVO.setTaskName(taskName);
goBackUserTaskVO.setUserId(assigneeUserId);
goBackUserTaskVO.setUserName(assigneeUserName);
return goBackUserTaskVO;
}).collect(Collectors.toList());
formButtonVO.setGoBackUserTasks(goBackUserTaskVOs);
}
model.put("formButton", JSONObject.toJSONString(formButtonVO));
}
/** /**
* 确认代理人列表 * 确认代理人列表
* *

View File

@ -0,0 +1,133 @@
<?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.INodeButtonDao">
<resultMap id="nodeButtonDTO" type="ink.wgink.module.activiti.pojo.dtos.oa.NodeButtonDTO">
<id column="node_button_id" property="nodeButtonId"/>
<result column="deployment_id" property="deploymentId"/>
<result column="form_id" property="formId"/>
<result column="node_index" property="nodeIndex"/>
<result column="node_id" property="nodeId"/>
<result column="btn_attachment" property="btnAttachment"/>
<result column="btn_go_back" property="btnGoBack"/>
</resultMap>
<!-- 建表 -->
<update id="createTable">
CREATE TABLE IF NOT EXISTS `oa_node_button` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`node_button_id` char(36) DEFAULT NULL COMMENT '主键',
`model_id` char(36) DEFAULT NULL COMMENT '模型ID',
`model_version` int(1) DEFAULT NULL COMMENT '模型版本',
`deployment_id` char(36) DEFAULT NULL COMMENT '部署ID',
`form_id` char(36) DEFAULT NULL COMMENT '表单ID',
`node_id` char(60) DEFAULT NULL COMMENT '节点ID',
`node_index` int(11) DEFAULT NULL COMMENT '节点下标',
`btn_attachment` varchar(255) DEFAULT NULL COMMENT '附件上传',
`btn_go_back` varchar(255) DEFAULT NULL COMMENT '回退',
PRIMARY KEY (`id`),
UNIQUE KEY `node_button_id` (`node_button_id`),
KEY `model_id` (`model_id`,`model_version`),
KEY `deployment_id` (`deployment_id`),
KEY `form_id` (`form_id`),
KEY `node_id` (`node_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节点按钮';
</update>
<!-- 新增 -->
<insert id="save" parameterType="map">
INSERT INTO oa_node_button(
node_button_id,
model_id,
model_version,
form_id,
node_id,
node_index,
btn_attachment,
btn_go_back
) VALUES(
#{nodeButtonId},
#{modelId},
#{modelVersion},
#{formId},
#{nodeId},
#{nodeIndex},
#{btnAttachment},
#{btnGoBack}
)
</insert>
<!-- 删除 -->
<delete id="delete" parameterType="map">
DELETE FROM
oa_node_button
WHERE
model_id = #{modelId}
AND
model_version = #{modelVersion}
<if test="formId != null and formId != ''">
AND
form_id = #{formId}
</if>
<if test="nodeId != null and nodeId != ''">
AND
node_id = #{nodeId}
</if>
</delete>
<!-- 更新 -->
<update id="update" parameterType="map">
UPDATE
oa_node_button
SET
<if test="btnAttachment != null">
btn_attachment = #{btnAttachment},
</if>
node_button_id = #{nodeButtonId}
WHERE
node_button_id = #{nodeButtonId}
</update>
<!-- 更新部署ID -->
<update id="updateDeploymentId" parameterType="map">
UPDATE
oa_node_button
SET
deployment_id = #{deploymentId}
WHERE
model_id = #{modelId}
AND
model_version = #{modelVersion}
</update>
<!-- 删除部署ID -->
<update id="deleteDeploymentId" parameterType="java.lang.String">
UPDATE
oa_node_button
SET
deployment_id = NULL
WHERE
deployment_id = #{_parameter}
</update>
<!-- 详情 -->
<select id="get" parameterType="map" resultMap="nodeButtonDTO">
SELECT
node_button_id,
model_id,
model_version,
form_id,
node_id,
node_index,
btn_attachment,
btn_go_back
FROM
oa_node_button
WHERE
deployment_id = #{deploymentId}
AND
node_id = #{nodeId}
</select>
</mapper>

View File

@ -12,6 +12,7 @@
<result column="is_visible" property="isVisible"/> <result column="is_visible" property="isVisible"/>
<result column="is_editable" property="isEditable"/> <result column="is_editable" property="isEditable"/>
<result column="edit_history" property="editHistory"/> <result column="edit_history" property="editHistory"/>
<result column="auto_back_fill" property="autoBackFill"/>
</resultMap> </resultMap>
<update id="createTable"> <update id="createTable">
@ -30,7 +31,14 @@
`is_visible` int(1) DEFAULT '1' COMMENT '是否可见', `is_visible` int(1) DEFAULT '1' COMMENT '是否可见',
`is_editable` int(1) DEFAULT '1' COMMENT '是否可编辑', `is_editable` int(1) DEFAULT '1' COMMENT '是否可编辑',
`editHistory` varchar(255) DEFAULT NULL COMMENT '编辑历史', `editHistory` varchar(255) DEFAULT NULL COMMENT '编辑历史',
PRIMARY KEY (`id`) `auto_back_fill` varchar(255) DEFAULT NULL COMMENT '自动回填',
PRIMARY KEY (`id`),
UNIQUE KEY `node_field_id` (`node_field_id`),
KEY `deployment_id` (`deployment_id`),
KEY `deployment_id_2` (`deployment_id`),
KEY `form_id` (`form_id`),
KEY `node_id` (`node_id`),
KEY `model_id` (`model_id`,`model_version`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='节点字段绑定'; ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='节点字段绑定';
</update> </update>
@ -48,7 +56,8 @@
field_explain, field_explain,
is_visible, is_visible,
is_editable, is_editable,
edit_history edit_history,
auto_back_fill
) VALUES( ) VALUES(
#{nodeFieldId}, #{nodeFieldId},
#{modelId}, #{modelId},
@ -61,7 +70,8 @@
#{fieldExplain}, #{fieldExplain},
#{isVisible}, #{isVisible},
#{isEditable}, #{isEditable},
#{editHistory} #{editHistory},
#{autoBackFill}
) )
</insert> </insert>
@ -165,7 +175,8 @@
field_name, field_name,
is_visible, is_visible,
is_editable, is_editable,
edit_history edit_history,
auto_back_fill
FROM FROM
oa_node_field oa_node_field
<where> <where>

View File

@ -64,6 +64,10 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t
}, },
formId: '', formId: '',
formFields: [], formFields: [],
formButton: {
btnAttachment: 0,
btnGoBack: 0
},
oaUserTaskListeners: [] oaUserTaskListeners: []
} }
@ -399,6 +403,7 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t
} }
$scope.updatePropertyInModel(assigneeProperty); $scope.updatePropertyInModel(assigneeProperty);
} }
// 更新手动指定单选代理人 // 更新手动指定单选代理人
function updateAssignee() { function updateAssignee() {
assigneeProperty.value = {}; assigneeProperty.value = {};
@ -438,13 +443,13 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t
multiInstanceVariable.value = MULTI_INSTANCE_VARIABLE; multiInstanceVariable.value = MULTI_INSTANCE_VARIABLE;
if (assignee.completeCondition === 'allPass') { if (assignee.completeCondition === 'allPass') {
// 全部通过 // 全部通过
multiInstanceCondition.value = '${'+ NR_OF_COMPLETED_INSTANCES +' == '+ NR_OF_INSTANCES +'}' multiInstanceCondition.value = '${' + NR_OF_COMPLETED_INSTANCES + ' == ' + NR_OF_INSTANCES + '}'
} else if (assignee.completeCondition === 'singlePass') { } else if (assignee.completeCondition === 'singlePass') {
// 单人通过 // 单人通过
multiInstanceCondition.value = '${'+ NR_OF_COMPLETED_INSTANCES +' >= 1}' multiInstanceCondition.value = '${' + NR_OF_COMPLETED_INSTANCES + ' >= 1}'
} else if (assignee.completeCondition === 'customPass') { } else if (assignee.completeCondition === 'customPass') {
// 通过多少人 // 通过多少人
multiInstanceCondition.value = '${'+ NR_OF_COMPLETED_INSTANCES +' >= ' + assignee.completeCount + '}' multiInstanceCondition.value = '${' + NR_OF_COMPLETED_INSTANCES + ' >= ' + assignee.completeCount + '}'
} else { } else {
top.dialog.msg('多实例(完成)通过条件错误'); top.dialog.msg('多实例(完成)通过条件错误');
return; return;
@ -484,7 +489,7 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t
} }
var assignee = $scope.oaNodeManage.assignee; var assignee = $scope.oaNodeManage.assignee;
if($scope.isFirstUserTask) { if ($scope.isFirstUserTask) {
updateStartAssignee(); updateStartAssignee();
return; return;
} }
@ -508,7 +513,7 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t
} }
// 自动获取 // 自动获取
if (assignee.assigneeType === 'auto') { if (assignee.assigneeType === 'auto') {
if(assignee.quickAssignee === 'starter') { if (assignee.quickAssignee === 'starter') {
updateAssignee(); updateAssignee();
return; return;
} }
@ -630,9 +635,9 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t
}; };
// function initOaNodeManage() { // function initOaNodeManage() {
if ($scope.property.value) { if ($scope.property.value) {
$scope.oaNodeManage = EDITOR.UTIL.deepClone($scope.property.value); $scope.oaNodeManage = EDITOR.UTIL.deepClone($scope.property.value);
} }
// } // }
// 初始化开始节点 // 初始化开始节点
@ -648,7 +653,7 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t
$scope.close(); $scope.close();
return; return;
} }
if(startNode.outgoing.length != 1) { if (startNode.outgoing.length != 1) {
top.dialog.msg('流程绘制错误开始节点后只能有一个UserTask'); top.dialog.msg('流程绘制错误开始节点后只能有一个UserTask');
$scope.close(); $scope.close();
return; return;
@ -659,15 +664,15 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t
function initOaNodeManage() { function initOaNodeManage() {
var firstUserTaskResourceId; var firstUserTaskResourceId;
for (var i = 0, node; node = childShapes[i++];) { for (var i = 0, node; node = childShapes[i++];) {
if(node.stencil.id != 'SequenceFlow') { if (node.stencil.id != 'SequenceFlow') {
continue; continue;
} }
if(startNode.outgoing[0].resourceId == node.resourceId) { if (startNode.outgoing[0].resourceId == node.resourceId) {
firstUserTaskResourceId = node.outgoing[0].resourceId; firstUserTaskResourceId = node.outgoing[0].resourceId;
break; break;
} }
} }
if(!firstUserTaskResourceId) { if (!firstUserTaskResourceId) {
top.dialog.msg('流程绘制错误开始节点后没有连线的UserTask'); top.dialog.msg('流程绘制错误开始节点后没有连线的UserTask');
$scope.close(); $scope.close();
return; return;
@ -677,7 +682,7 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t
$scope.oaNodeManage = EDITOR.UTIL.deepClone($scope.property.value); $scope.oaNodeManage = EDITOR.UTIL.deepClone($scope.property.value);
} }
$scope.isFirstUserTask = firstUserTaskResourceId == selection.resourceId; $scope.isFirstUserTask = firstUserTaskResourceId == selection.resourceId;
if($scope.isFirstUserTask) { if ($scope.isFirstUserTask) {
$scope.oaNodeManage.assignee.nodeType = 'normal'; $scope.oaNodeManage.assignee.nodeType = 'normal';
$scope.oaNodeManage.assignee.assigneeType = 'auto'; $scope.oaNodeManage.assignee.assigneeType = 'auto';
$scope.oaNodeManage.assignee.autoAssignType = 'quick'; $scope.oaNodeManage.assignee.autoAssignType = 'quick';
@ -707,11 +712,13 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t
var isVisible = true; var isVisible = true;
var isEditable = true; var isEditable = true;
var editHistory = 'noRecord'; var editHistory = 'noRecord';
var autoBackFill = 'noBackFill';
for (var j = 0, item; item = $scope.oaNodeManage.formFields[j++];) { for (var j = 0, item; item = $scope.oaNodeManage.formFields[j++];) {
if (formField.fieldId === item.fieldId) { if (formField.fieldId === item.fieldId) {
isVisible = item.isVisible; isVisible = item.isVisible;
isEditable = item.isEditable; isEditable = item.isEditable;
editHistory = item.editHistory; editHistory = item.editHistory;
autoBackFill = item.autoBackFill;
} }
} }
formFields.push({ formFields.push({
@ -722,7 +729,8 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t
fieldType: formField.fieldType, fieldType: formField.fieldType,
isVisible: isVisible, isVisible: isVisible,
isEditable: isEditable, isEditable: isEditable,
editHistory: editHistory editHistory: editHistory,
autoBackFill: autoBackFill
}) })
} }
$scope.oaNodeManage.formFields = formFields; $scope.oaNodeManage.formFields = formFields;

View File

@ -11,15 +11,15 @@
<li class="active"> <li class="active">
<a href="#nodeConfig" aria-controls="home" role="tab" data-toggle="tab"><h5>代理人配置</h5></a> <a href="#nodeConfig" aria-controls="home" role="tab" data-toggle="tab"><h5>代理人配置</h5></a>
</li> </li>
<!-- <li>-->
<!-- <a href="#buttonConfig" aria-controls="profile" role="tab" data-toggle="tab"><h5>按钮配置</h5></a>-->
<!-- </li>-->
<li> <li>
<a href="#formFieldConfig" aria-controls="profile" role="tab" data-toggle="tab"><h5>表单字段配置</h5></a> <a href="#formFieldConfig" aria-controls="profile" role="tab" data-toggle="tab"><h5>表单字段配置</h5></a>
</li> </li>
<li> <li>
<a href="#listenerConfig" aria-controls="profile" role="tab" data-toggle="tab"><h5>监听器配置</h5></a> <a href="#listenerConfig" aria-controls="profile" role="tab" data-toggle="tab"><h5>监听器配置</h5></a>
</li> </li>
<li>
<a href="#buttonConfig" aria-controls="profile" role="tab" data-toggle="tab"><h5>按钮配置</h5></a>
</li>
</ul> </ul>
<div class="tab-content"> <div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="nodeConfig" style="padding: 15px 0;"> <div role="tabpanel" class="tab-pane active" id="nodeConfig" style="padding: 15px 0;">
@ -301,7 +301,6 @@
</tbody> </tbody>
</table> </table>
</div> </div>
<!-- <div role="tabpanel" class="tab-pane" id="buttonConfig" style="padding: 15px 0;"></div>-->
<div role="tabpanel" class="tab-pane" id="formFieldConfig" style="padding: 15px 0;"> <div role="tabpanel" class="tab-pane" id="formFieldConfig" style="padding: 15px 0;">
<table class="table table-bordered table-hover"> <table class="table table-bordered table-hover">
<colgroup> <colgroup>
@ -312,7 +311,8 @@
<col> <col>
<col width="60"> <col width="60">
<col width="60"> <col width="60">
<col width="250"> <col width="100">
<col width="100">
</colgroup> </colgroup>
<thead> <thead>
<tr> <tr>
@ -324,6 +324,7 @@
<th class="text-center">可见</th> <th class="text-center">可见</th>
<th class="text-center">可操作</th> <th class="text-center">可操作</th>
<th class="text-center">编辑历史</th> <th class="text-center">编辑历史</th>
<th class="text-center">自动填充</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -340,15 +341,17 @@
<input type="checkbox" ng-model="formField.isEditable"> <input type="checkbox" ng-model="formField.isEditable">
</td> </td>
<td class="text-center"> <td class="text-center">
<label class="radio-inline"> <select class="form-control input-sm" ng-model="formField.editHistory" >
<input ng-model="formField.editHistory" type="radio" value="noRecord"> 不记录 <option value="noRecord">不记录</option>
</label> <option value="latest" ng-if="formField.fieldTag == 'input' || formField.fieldTag == 'textarea'">最新</option>
<label class="radio-inline"> <option value="all" ng-if="formField.fieldTag == 'textarea'">全部</option>
<input ng-model="formField.editHistory" type="radio" value="latest"> 最新 </select>
</label> </td>
<label class="radio-inline"> <td>
<input ng-model="formField.editHistory" type="radio" value="all"> 全部 <select class="form-control input-sm" ng-model="formField.autoBackFill">
</label> <option value="noBackFill">不回填</option>
<option value="currentUser">当前用户</option>
</select>
</td> </td>
</tr> </tr>
</tbody> </tbody>
@ -399,6 +402,48 @@
</tbody> </tbody>
</table> </table>
</div> </div>
<div role="tabpanel" class="tab-pane" id="buttonConfig" style="padding: 15px 0;">
<table class="table table-bordered table-hover">
<colgroup>
<col width="60">
<col>
<col width="160">
</colgroup>
<thead>
<tr>
<th>序号</th>
<th>按钮</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr>
<td class="text-center">1</td>
<td>附件</td>
<td>
<label class="radio-inline">
<input ng-model="oaNodeManage.formButton.btnAttachment" type="radio" value="0"> 关闭
</label>
<label class="radio-inline">
<input ng-model="oaNodeManage.formButton.btnAttachment" type="radio" value="1"> 开启
</label>
</td>
</tr>
<tr>
<td class="text-center">2</td>
<td>回退</td>
<td>
<label class="radio-inline">
<input ng-model="oaNodeManage.formButton.btnGoBack" type="radio" value="0"> 关闭
</label>
<label class="radio-inline">
<input ng-model="oaNodeManage.formButton.btnGoBack" type="radio" value="1"> 开启
</label>
</td>
</tr>
</tbody>
</table>
</div>
</div> </div>
</div> </div>

View File

@ -87,7 +87,7 @@ KISBPM.TOOLBAR = {
oaNodeManages: oaNodeManages oaNodeManages: oaNodeManages
} }
var loadLayerIndex; var loadLayerIndex;
top.restAjax.put(KISBPM.URL.putModel(modelMetaData.modelId), params, null, function (code, data) { top.restAjax.put(KISBPM.URL.putModel(modelMetaData.modelId, modelMetaData.modelVersion), params, null, function (code, data) {
parent.layer.close(parent.layer.getFrameIndex(window.name)); parent.layer.close(parent.layer.getFrameIndex(window.name));
top.dialog.msg('保存成功'); top.dialog.msg('保存成功');
}, function (code, data) { }, function (code, data) {
@ -98,12 +98,6 @@ KISBPM.TOOLBAR = {
top.dialog.close(loadLayerIndex); top.dialog.close(loadLayerIndex);
}); });
}) })
// var modal = services.$modal({
// backdrop: true,
// keyboard: true,
// template: 'editor-app/popups/save-model.html?version=' + Date.now(),
// scope: services.$scope
// });
}, },
undo: function (services) { undo: function (services) {

View File

@ -28,7 +28,7 @@ KISBPM.URL = {
return ACTIVITI.CONFIG.contextRoot + '/model/editor/stencilset?version=' + Date.now(); return ACTIVITI.CONFIG.contextRoot + '/model/editor/stencilset?version=' + Date.now();
}, },
putModel: function(modelId) { putModel: function(modelId, modelVersion) {
return ACTIVITI.CONFIG.contextRoot + '/model/save/' + modelId; return ACTIVITI.CONFIG.contextRoot + '/model/save/' + modelId +'/version/'+ modelVersion;
} }
}; };

View File

@ -1516,3 +1516,13 @@ button.selection:active, button.selection:focus {
.fullscreen .modal-header h3 .summary { .fullscreen .modal-header h3 .summary {
font-size: 13px; font-size: 13px;
} }
table tbody tr td {
vertical-align: middle !important;
}
select.input-sm {
height: 21px;
line-height: 20px;
padding: 0;
}

View File

@ -932,7 +932,7 @@ layui.config({
} }
} }
}); });
var SYSTEM_KEY_ARRAY = ['id', 'uid', 'gmt_create', 'creator', 'gmt_modified', 'modifier', 'is_delete', 'MAIN_TITLE']; var SYSTEM_KEY_ARRAY = ['id', 'uid', 'gmt_create', 'creator', 'gmt_modified', 'modifier', 'is_delete', 'MAIN_TITLE', 'attachments', 'attachmentBtn', 'showAttachmentBtn', 'goBackBtn'];
// 更新 option json // 更新 option json
$(document).off('blur', '#columnProperty .layui-input').on('blur', '#columnProperty .layui-input', function () { $(document).off('blur', '#columnProperty .layui-input').on('blur', '#columnProperty .layui-input', function () {
if ($(this).attr("name") !== undefined) { if ($(this).attr("name") !== undefined) {

View File

@ -243,7 +243,7 @@ function FormUtil(layui, viewer) {
var fileName = idNameArray[1]; var fileName = idNameArray[1];
html += [ html += [
'<tr>', '<tr>',
' <td>' + fileName + '</td>', ' <td><a href="route/file/download/false/'+ fileId +'" target="_blank">' + fileName + '</a></td>',
' <td class="operation">', ' <td class="operation">',
' <button type="button" class="layui-btn layui-btn-xs layui-btn-danger delete-btn delete-' + fieldName + '-btn" data-id="' + fileId + '" data-name="' + fileName + '" data-field-name="' + fieldName + '">删除</button>', ' <button type="button" class="layui-btn layui-btn-xs layui-btn-danger delete-btn delete-' + fieldName + '-btn" data-id="' + fileId + '" data-name="' + fileName + '" data-field-name="' + fieldName + '">删除</button>',
' </td>', ' </td>',
@ -309,7 +309,7 @@ function FormUtil(layui, viewer) {
if (files.length > 0) { if (files.length > 0) {
files += ','; files += ',';
} }
files += res.data.fileId + ':' + res.data.fileName; files += res.data.fileId + ':' + res.data.fileName.replace(/\,/g, '');
$('#' + name).val(files); $('#' + name).val(files);
init(); init();
}, },
@ -317,14 +317,7 @@ function FormUtil(layui, viewer) {
layer.close(layerLoadingIndex); layer.close(layerLoadingIndex);
layer.msg('文件上传失败'); layer.msg('文件上传失败');
}, },
progress: function (n, elem, res, index) { progress: function (n, elem, res, index) {}
var percent = n + '%'
console.log(percent);
console.log(elem);
console.log(res);
console.log(index);
element.progress('demo-' + index, n + '%');
}
}); });
$(document).on('click', deleteBtnClass, function () { $(document).on('click', deleteBtnClass, function () {
var id = this.dataset.id; var id = this.dataset.id;
@ -496,7 +489,7 @@ function FormUtil(layui, viewer) {
if (files.length > 0) { if (files.length > 0) {
files += ','; files += ',';
} }
files += res.data.fileId + ':' + res.data.fileName; files += res.data.fileId + ':' + res.data.fileName.replace(/\,/g, '');
$('#' + name).val(files); $('#' + name).val(files);
init(); init();
}, },
@ -504,14 +497,7 @@ function FormUtil(layui, viewer) {
layer.close(layerLoadingIndex); layer.close(layerLoadingIndex);
layer.msg('文件上传失败'); layer.msg('文件上传失败');
}, },
progress: function (n, elem, res, index) { progress: function (n, elem, res, index) {}
var percent = n + '%'
console.log(percent);
console.log(elem);
console.log(res);
console.log(index);
element.progress('demo-' + index, n + '%');
}
}); });
$(document).on('click', deleteBtnClass, function () { $(document).on('click', deleteBtnClass, function () {
var name = this.dataset.name; var name = this.dataset.name;
@ -681,7 +667,7 @@ function FormUtil(layui, viewer) {
if (files.length > 0) { if (files.length > 0) {
files += ','; files += ',';
} }
files += res.data.fileId + ':' + res.data.fileName; files += res.data.fileId + ':' + res.data.fileName.replace(/\,/g, '');
$('#' + name).val(files); $('#' + name).val(files);
init(); init();
}, },
@ -689,14 +675,7 @@ function FormUtil(layui, viewer) {
layer.close(layerLoadingIndex); layer.close(layerLoadingIndex);
layer.msg('文件上传失败'); layer.msg('文件上传失败');
}, },
progress: function (n, elem, res, index) { progress: function (n, elem, res, index) {}
var percent = n + '%'
console.log(percent);
console.log(elem);
console.log(res);
console.log(index);
element.progress('demo-' + index, n + '%');
}
}); });
$(document).on('click', deleteBtnClass, function () { $(document).on('click', deleteBtnClass, function () {
var name = this.dataset.name; var name = this.dataset.name;

View File

@ -2,6 +2,7 @@ function OaFormUtil(layui) {
var $ = layui.$; var $ = layui.$;
var win = $(window); var win = $(window);
var layer = layui.layer; var layer = layui.layer;
var upload = layui.upload;
var restAjax = layui.restajax; var restAjax = layui.restajax;
var processImageEnlargeScale = 0; var processImageEnlargeScale = 0;
@ -65,7 +66,7 @@ function OaFormUtil(layui) {
var signList = formData[key]; var signList = formData[key];
var signListText = ''; var signListText = '';
for (var i = 0, item; item = signList[i++];) { for (var i = 0, item; item = signList[i++];) {
signListText += item.userName + '' + item.content + ' - ' + item.time +'\n'; signListText += item.userName + '' + item.content + ' - ' + item.time + '\n';
} }
formData[signPreDomKey] = signListText; formData[signPreDomKey] = signListText;
delete formData[key]; delete formData[key];
@ -236,4 +237,147 @@ function OaFormUtil(layui) {
} }
} }
/**
* 初始化表单按钮
* @param formButton
*/
this.initFormButtons = function (formButton, opt) {
var headers = opt.headers;
headers = headers ? headers : {};
var isApp = opt.isApp;
var isShow = opt.isShow;
function initButton() {
var buttons = '';
buttons += '<div class="layui-btn-group">'
if (formButton.btnAttachment) {
buttons += '<button id="attachmentBtn" type="button" class="layui-btn layui-btn-sm layui-btn-default">上传附件</button>';
}
buttons += '<button id="showAttachmentBtn" type="button" class="layui-btn layui-btn-sm layui-btn-primary" title="附件列表"><i class="fa fa-list-ul" aria-hidden="true"></i></button>';
buttons += '<input type="hidden" name="attachments" id="attachments"/>';
buttons += '</div>';
if (formButton.btnGoBack) {
buttons += '<button id="goBackBtn" type="button" class="layui-btn layui-btn-sm layui-btn-danger">回退</button>';
}
$('#formButtonGroup').append(buttons);
}
function addClick() {
if(formButton.btnAttachment) {
var layerLoadingIndex;
var url = 'api/file/v2/upload-file';
if (isApp) {
url = 'app/file/v2/upload-file'
}
upload.render({
elem: '#attachmentBtn',
url: url,
accept: 'file',
acceptMime: [
'application/pdf',
'application/msword',
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'application/vnd.ms-excel',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'application/vnd.ms-powerpoint',
'application/vnd.openxmlformats-officedocument.presentationml.presentation',
'application/vnd.ms-works',
'text/plain',
'application/x-rar',
'application/x-zip-compressed'
].join(''),
field: 'file',
exts: 'pdf|doc|docx|xls|xlsx|ppt|pptx|wps|txt|rar|zip',
headers: headers,
before: function (obj) {
layerLoadingIndex = layer.msg('上传中...', {icon: 16, time: 0, shade: 0.3})
},
done: function (res, index, upload) {
layer.close(layerLoadingIndex);
var attachments = $('#attachments').val();
var data = res.data;
if(attachments.length > 0) {
attachments += ',';
}
attachments += data.fileId +':'+ data.fileName.replace(/\,/g, '');
$('#attachments').val(attachments);
},
error: function (index, upload) {
layer.close(layerLoadingIndex);
layer.msg('文件上传失败');
},
progress: function (n, elem, res, index) {}
});
}
$(document.body).on('click', '#showAttachmentBtn', function() {
var attachments = $('#attachments').val();
var attachmentArray = attachments.split(',');
var html = [
'<div class="form-upload-file" style="margin: 0 10px;">',
' <table class="layui-table" lay-size="sm">',
' <colgroup>',
' <col>',
' <col width="60">',
' </colgroup>',
' <thead>',
' <tr>',
' <th>文件名</th>',
' <th class="operation">操作</th>',
' </tr>',
' </thead>',
' <tbody>',
].join('');
for (var i = 0, file; file = attachmentArray[i++];) {
var idNameArray = file.split(':');
var fileId = idNameArray[0];
var fileName = idNameArray[1];
html += [
'<tr>',
' <td><a href="route/file/download/false/'+ fileId +'" target="_blank">' + fileName + '</a></td>',
' <td class="operation">',
formButton.btnAttachment ? '<button type="button" class="layui-btn layui-btn-xs layui-btn-danger delete-btn delete-attachment-btn" data-id="' + fileId + '" data-name="' + fileName + '">删除</button>' : '',
' </td>',
'</tr>',
].join('');
}
html += [
' </tbody>',
' </table>',
'</div>'
].join('');
layer.open({
type: 1,
title: false,
area: ['80%'],
maxHeight: '60%',
closeBtn: 0,
shadeClose: true,
content: html
});
});
$(document.body).on('click', '.delete-attachment-btn', function() {
var id = this.dataset.id;
var name = this.dataset.name;
var files = $('#attachments').val().replace(id + ':' + name, '');
files = files.replace(/\,+/g, ',');
if (files.charAt(0) == ',') {
files = files.substring(1);
}
if (files.charAt(files.length - 1) == ',') {
files = files.substring(0, files.length - 1);
}
$('#attachments').val(files);
$(this).parent().parent().remove();
});
$(document.body).on('click', '#goBackBtn', function() {
});
}
initButton();
addClick();
}
} }