diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/ActivitiModelController.java b/module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/ActivitiModelController.java index f0b7431a..88764939 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/ActivitiModelController.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/ActivitiModelController.java @@ -44,15 +44,15 @@ public class ActivitiModelController extends DefaultBaseController { @ApiImplicitParam(name = "modelId", value = "模型ID", paramType = "path") }) @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) - @PutMapping("save/{modelId}") - public SuccessResult saveModel(@PathVariable String modelId, @RequestBody ActivitiModelVO activitiModelVO) throws Exception { + @PutMapping("save/{modelId}/version/{modelVersion}") + public SuccessResult saveModel(@PathVariable String modelId, @PathVariable("modelVersion") Integer modelVersion, @RequestBody ActivitiModelVO activitiModelVO) throws Exception { if (StringUtils.isBlank(activitiModelVO.getName())) { throw new ParamsException("流程名称不能为空"); } if(StringUtils.isBlank(activitiModelVO.getDescription())) { throw new ParamsException("流程描述不能为空"); } - activitiModelService.save(modelId, activitiModelVO); + activitiModelService.save(modelId, modelVersion, activitiModelVO); return new SuccessResult(); } diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/dao/oa/INodeButtonDao.java b/module-activiti/src/main/java/ink/wgink/module/activiti/dao/oa/INodeButtonDao.java new file mode 100644 index 00000000..10390791 --- /dev/null +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/dao/oa/INodeButtonDao.java @@ -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 params) throws SaveException; + + /** + * 删除配置 + * + * @param params + * @throws RemoveException + */ + void delete(Map params) throws RemoveException; + + /** + * 更新部署ID + * + * @param params + * @throws UpdateException + */ + void updateDeploymentId(Map params) throws UpdateException; + + /** + * 详情 + * + * @param params + * @return + * @throws SearchException + */ + NodeButtonDTO get(Map params) throws SearchException; + +} diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/dtos/oa/NodeButtonDTO.java b/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/dtos/oa/NodeButtonDTO.java new file mode 100644 index 00000000..c6077527 --- /dev/null +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/dtos/oa/NodeButtonDTO.java @@ -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; + } +} diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/dtos/oa/NodeFieldDTO.java b/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/dtos/oa/NodeFieldDTO.java index 622a70b1..da68f184 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/dtos/oa/NodeFieldDTO.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/dtos/oa/NodeFieldDTO.java @@ -30,6 +30,8 @@ public class NodeFieldDTO { private Integer isEditable; @ApiModelProperty(name = "editHistory", value = "编辑历史") private String editHistory; + @ApiModelProperty(name = "autoBackFill", value = "自动回填") + private String autoBackFill; public String getNodeFieldId() { return nodeFieldId; @@ -102,4 +104,12 @@ public class NodeFieldDTO { public void setEditHistory(String editHistory) { this.editHistory = editHistory; } + + public String getAutoBackFill() { + return autoBackFill == null ? "" : autoBackFill.trim(); + } + + public void setAutoBackFill(String autoBackFill) { + this.autoBackFill = autoBackFill; + } } diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/nodemanage/ConfigVO.java b/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/nodemanage/ConfigVO.java index f3d86473..b127bf5e 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/nodemanage/ConfigVO.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/nodemanage/ConfigVO.java @@ -1,6 +1,7 @@ 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.NodeFormButtonVO; import ink.wgink.module.activiti.pojo.vos.oa.nodemanage.config.NodeFormFieldVO; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -23,6 +24,8 @@ public class ConfigVO { private AssigneeVO assignee; @ApiModelProperty(name = "formFields", value = "表单字段列表") private List formFields; + @ApiModelProperty(name = "formButton", value = "表单按钮") + private NodeFormButtonVO formButton; public String getFormId() { return formId == null ? "" : formId.trim(); @@ -48,6 +51,14 @@ public class ConfigVO { this.formFields = formFields; } + public NodeFormButtonVO getFormButton() { + return formButton; + } + + public void setFormButton(NodeFormButtonVO formButton) { + this.formButton = formButton; + } + @Override public String toString() { final StringBuilder sb = new StringBuilder("{"); @@ -57,6 +68,8 @@ public class ConfigVO { .append(assignee); sb.append(",\"formFields\":") .append(formFields); + sb.append(",\"formButton\":") + .append(formButton); sb.append('}'); return sb.toString(); } diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/nodemanage/config/NodeFormButtonVO.java b/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/nodemanage/config/NodeFormButtonVO.java new file mode 100644 index 00000000..1ba0a45b --- /dev/null +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/nodemanage/config/NodeFormButtonVO.java @@ -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; + } +} \ No newline at end of file diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/nodemanage/config/NodeFormFieldVO.java b/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/nodemanage/config/NodeFormFieldVO.java index c813a537..847bebda 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/nodemanage/config/NodeFormFieldVO.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/nodemanage/config/NodeFormFieldVO.java @@ -29,6 +29,8 @@ public class NodeFormFieldVO { private Boolean isVisible; @ApiModelProperty(name = "editHistory", value = "编辑历史") private String editHistory; + @ApiModelProperty(name = "autoFillBack", value = "自动填充") + private String autoFillBack; public String getFieldId() { return fieldId == null ? "" : fieldId.trim(); @@ -94,6 +96,14 @@ public class NodeFormFieldVO { this.editHistory = editHistory; } + public String getAutoFillBack() { + return autoFillBack == null ? "" : autoFillBack.trim(); + } + + public void setAutoFillBack(String autoFillBack) { + this.autoFillBack = autoFillBack; + } + @Override public String toString() { final StringBuilder sb = new StringBuilder("{"); @@ -113,6 +123,8 @@ public class NodeFormFieldVO { .append(isVisible); sb.append(",\"editHistory\":\"") .append(editHistory).append('\"'); + sb.append(",\"autoFillBack\":\"") + .append(autoFillBack).append('\"'); sb.append('}'); return sb.toString(); } diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/page/FormButtonVO.java b/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/page/FormButtonVO.java new file mode 100644 index 00000000..9414c688 --- /dev/null +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/page/FormButtonVO.java @@ -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 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 getGoBackUserTasks() { + return goBackUserTasks == null ? new ArrayList() : goBackUserTasks; + } + + public void setGoBackUserTasks(List goBackUserTasks) { + this.goBackUserTasks = goBackUserTasks; + } +} diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/page/GoBackUserTaskVO.java b/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/page/GoBackUserTaskVO.java new file mode 100644 index 00000000..cb3886ed --- /dev/null +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/page/GoBackUserTaskVO.java @@ -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; + } +} diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/IActivitiModelService.java b/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/IActivitiModelService.java index c565a148..1514e617 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/IActivitiModelService.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/IActivitiModelService.java @@ -64,10 +64,11 @@ public interface IActivitiModelService { * 保存模型 * * @param modelId + * @param modelVersion * @param activitiModelVO * @throws Exception */ - void save(String modelId, ActivitiModelVO activitiModelVO) throws Exception; + void save(String modelId, Integer modelVersion, ActivitiModelVO activitiModelVO) throws Exception; /** * 删除模型 diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/impl/ActivitiModelServiceImpl.java b/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/impl/ActivitiModelServiceImpl.java index 3061ecd1..91636c3b 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/impl/ActivitiModelServiceImpl.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/impl/ActivitiModelServiceImpl.java @@ -60,19 +60,22 @@ public class ActivitiModelServiceImpl extends DefaultBaseService implements IAct private INodeManageService nodeManageService; @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); if (model == null) { throw new SearchException("模型不存在"); } - String deploymentId = model.getDeploymentId(); - Integer modelVersion; - if (!StringUtils.isBlank(deploymentId)) { - LOG.debug("已经部署,版本号递增"); - modelVersion = model.getVersion() + 1; + String deploymentId = null; + Integer existModelVersion = model.getVersion(); + Integer newModelVersion; + // 版本相同的模型,如果已经部署,创建新版本;如果没有部署,版本号不变 + if (modelVersion.equals(existModelVersion) && !StringUtils.isBlank(model.getDeploymentId())) { + LOG.debug("最新版本已经部署,版本号递增"); + newModelVersion = model.getVersion() + 1; + deploymentId = model.getDeploymentId(); } else { - LOG.debug("未部署,版本号不变"); - modelVersion = model.getVersion(); + LOG.debug("最新版本未部署,版本号不变"); + newModelVersion = model.getVersion(); } JSONObject modelObject = JSONObject.parseObject(model.getMetaInfo()); @@ -80,7 +83,7 @@ public class ActivitiModelServiceImpl extends DefaultBaseService implements IAct modelObject.put(MODEL_DESCRIPTION, activitiModelVO.getDescription()); model.setMetaInfo(modelObject.toString()); model.setName(activitiModelVO.getName()); - model.setVersion(modelVersion); + model.setVersion(newModelVersion); repositoryService.saveModel(model); repositoryService.addModelEditorSource(model.getId(), activitiModelVO.getJsonXml().getBytes(ISystemConstant.CHARSET_UTF8)); @@ -99,7 +102,7 @@ public class ActivitiModelServiceImpl extends DefaultBaseService implements IAct outStream.close(); LOG.debug("保存节点配置"); - nodeManageService.save(activitiModelVO, modelId, modelVersion, deploymentId); + nodeManageService.save(activitiModelVO, modelId, newModelVersion, deploymentId); } @Override @@ -322,6 +325,7 @@ public class ActivitiModelServiceImpl extends DefaultBaseService implements IAct result.put(MODEL_NAME, model.getName()); } result.put(MODEL_ID, model.getId()); + result.put("modelVersion", model.getVersion()); String readTree = new String(repositoryService.getModelEditorSource(model.getId()), ISystemConstant.CHARSET_UTF8); JSONObject editorJson = JSONObject.parseObject(readTree); result.put("model", editorJson); diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/impl/ActivitiServiceImpl.java b/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/impl/ActivitiServiceImpl.java index 488a442c..f5e4741a 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/impl/ActivitiServiceImpl.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/service/activiti/impl/ActivitiServiceImpl.java @@ -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.IActivitiService; 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.pojo.result.SuccessResultList; import ink.wgink.util.date.DateUtil; @@ -55,6 +56,8 @@ public class ActivitiServiceImpl extends DefaultBaseService implements IActiviti private INodeAssigneeService nodeAssigneeService; @Autowired private INodeFieldService nodeFieldService; + @Autowired + private INodeButtonService nodeButtonService; @Override public String create(ActivitiVO activitiVO) throws UnsupportedEncodingException { @@ -102,6 +105,8 @@ public class ActivitiServiceImpl extends DefaultBaseService implements IActiviti nodeAssigneeService.updateDeploymentId(modelId, model.getVersion(), deploymentId); LOG.debug("3.绑定节点表单字段"); nodeFieldService.updateDeploymentId(modelId, model.getVersion(), deploymentId); + LOG.debug("4.绑定节点按钮"); + nodeButtonService.updateDeploymentId(modelId, model.getVersion(), deploymentId); } else { LOG.debug("不存在自定义表单,不是OA流程,直接部署"); deploymentId = deployProcess(model, bpmnModel); diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/INodeButtonService.java b/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/INodeButtonService.java new file mode 100644 index 00000000..e115939b --- /dev/null +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/INodeButtonService.java @@ -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); + +} diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/IOaFormReportService.java b/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/IOaFormReportService.java index 379fd661..5318b0f7 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/IOaFormReportService.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/IOaFormReportService.java @@ -24,6 +24,7 @@ public interface IOaFormReportService { String KEY_SELECT_TYPE = "selectType"; String KEY_IS_NEXT_END_EVENT = "isNextEndEvent"; String KEY_RECORD_FIELDS = "recordFields"; + String KEY_ASSIGNEE_USER_NAME = "assigneeUserName"; /** * 编辑记录分隔符 */ diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/impl/NodeButtonServiceImpl.java b/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/impl/NodeButtonServiceImpl.java new file mode 100644 index 00000000..4755d733 --- /dev/null +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/impl/NodeButtonServiceImpl.java @@ -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 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 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 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 params = getHashMap(6); + params.put("modelId", modelId); + params.put("modelVersion", modelVersion); + params.put("nodeId", nodeId); + params.put("formId", formId); + nodeButtonDao.delete(params); + } +} diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/impl/NodeManageServiceImpl.java b/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/impl/NodeManageServiceImpl.java index ff2fe426..4732a26c 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/impl/NodeManageServiceImpl.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/impl/NodeManageServiceImpl.java @@ -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.NodeFormFieldVO; 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.INodeManageService; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -28,6 +29,8 @@ public class NodeManageServiceImpl extends DefaultBaseService implements INodeMa private INodeAssigneeService nodeAssigneeService; @Autowired private INodeFieldService nodeFieldService; + @Autowired + private INodeButtonService nodeButtonService; @Override 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); // 保存节点与表单字段配置 nodeFieldService.save(modelId, modelVersion, nodeId, i, formId, formFields); + // 保存节点按钮 + nodeButtonService.save(modelId, modelVersion, nodeId, i, formId, oaNodeManageVO.getConfig().getFormButton()); } } else { 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); // 保存节点与表单字段配置 nodeFieldService.update(modelId, modelVersion, nodeId, i, formId, formFields); + // 保存节点按钮 + nodeButtonService.update(modelId, modelVersion, nodeId, i, formId, oaNodeManageVO.getConfig().getFormButton()); } } } diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/impl/OaFormReportRouteServiceImpl.java b/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/impl/OaFormReportRouteServiceImpl.java index b1adebc2..64e7c974 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/impl/OaFormReportRouteServiceImpl.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/impl/OaFormReportRouteServiceImpl.java @@ -5,14 +5,15 @@ import com.alibaba.fastjson.JSONObject; import ink.wgink.common.base.DefaultBaseService; import ink.wgink.exceptions.SearchException; 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.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.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.oa.INodeAssigneeService; -import ink.wgink.module.activiti.service.oa.INodeFieldService; -import ink.wgink.module.activiti.service.oa.IOaFormReportRouteService; +import ink.wgink.module.activiti.service.oa.*; import ink.wgink.module.form.enums.design.FormTypeEnum; import ink.wgink.module.form.service.design.IFormFieldService; 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.SequenceFlow; import org.activiti.bpmn.model.UserTask; +import org.activiti.engine.HistoryService; import org.activiti.engine.RepositoryService; import org.activiti.engine.TaskService; +import org.activiti.engine.history.HistoricTaskInstance; import org.activiti.engine.repository.ProcessDefinition; import org.activiti.engine.task.Task; import org.apache.commons.lang3.StringUtils; @@ -52,6 +55,8 @@ public class OaFormReportRouteServiceImpl extends DefaultBaseService implements @Autowired private RepositoryService repositoryService; @Autowired + private HistoryService historyService; + @Autowired private IFormReportRouteService formReportRouteService; @Autowired private IUserBaseService userBaseService; @@ -63,6 +68,8 @@ public class OaFormReportRouteServiceImpl extends DefaultBaseService implements private IFormFieldService formFieldService; @Autowired private INodeFieldService nodeFieldService; + @Autowired + private INodeButtonService nodeButtonService; @Override 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)); setPageFields(deploymentId, firstUserTask, model); + setPageFormButtonsAndHistoryUserTasks(deploymentId, null, firstUserTask, model); formReportRouteService.save(formCode, formVersion, httpSession, httpServletRequest, httpServletResponse, model); } + @Override public void update(String taskId, String formCode, Integer formVersion, Integer isNeedClaim, HttpSession httpSession, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) { Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); @@ -109,6 +118,7 @@ public class OaFormReportRouteServiceImpl extends DefaultBaseService implements model.put("confirmAssignees", JSON.toJSONString(confirmAssigneeVOs)); setPageFields(deploymentId, currentUserTask, model); + setPageFormButtonsAndHistoryUserTasks(deploymentId, null, currentUserTask, 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)); } + /** + * 设置页面按钮与历史任务,如果没有回退按钮,不设置回退 + * + * @param deploymentId + * @param userTask + * @param model + */ + private void setPageFormButtonsAndHistoryUserTasks(String deploymentId, String currentTaskId, UserTask userTask, Map 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 historicTaskInstances = historyService.createHistoricTaskInstanceQuery() + .includeTaskLocalVariables() + .taskId(currentTaskId) + .finished() + .orderByHistoricTaskInstanceEndTime() + .asc() + .list(); + List goBackUserTaskVOs = historicTaskInstances.stream().map(historicTaskInstance -> { + String assigneeUserId = historicTaskInstance.getAssignee(); + Map 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)); + } + /** * 确认代理人列表 * diff --git a/module-activiti/src/main/resources/mybatis/mapper/oa/node-button-mapper.xml b/module-activiti/src/main/resources/mybatis/mapper/oa/node-button-mapper.xml new file mode 100644 index 00000000..a4100438 --- /dev/null +++ b/module-activiti/src/main/resources/mybatis/mapper/oa/node-button-mapper.xml @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + 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='节点按钮'; + + + + + 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} + ) + + + + + DELETE FROM + oa_node_button + WHERE + model_id = #{modelId} + AND + model_version = #{modelVersion} + + AND + form_id = #{formId} + + + AND + node_id = #{nodeId} + + + + + + UPDATE + oa_node_button + SET + + btn_attachment = #{btnAttachment}, + + node_button_id = #{nodeButtonId} + WHERE + node_button_id = #{nodeButtonId} + + + + + UPDATE + oa_node_button + SET + deployment_id = #{deploymentId} + WHERE + model_id = #{modelId} + AND + model_version = #{modelVersion} + + + + + UPDATE + oa_node_button + SET + deployment_id = NULL + WHERE + deployment_id = #{_parameter} + + + + + + + \ No newline at end of file diff --git a/module-activiti/src/main/resources/mybatis/mapper/oa/node-field-mapper.xml b/module-activiti/src/main/resources/mybatis/mapper/oa/node-field-mapper.xml index c920bae2..5e088b5a 100644 --- a/module-activiti/src/main/resources/mybatis/mapper/oa/node-field-mapper.xml +++ b/module-activiti/src/main/resources/mybatis/mapper/oa/node-field-mapper.xml @@ -12,6 +12,7 @@ + @@ -30,7 +31,14 @@ `is_visible` int(1) DEFAULT '1' COMMENT '是否可见', `is_editable` int(1) DEFAULT '1' 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='节点字段绑定'; @@ -48,7 +56,8 @@ field_explain, is_visible, is_editable, - edit_history + edit_history, + auto_back_fill ) VALUES( #{nodeFieldId}, #{modelId}, @@ -61,7 +70,8 @@ #{fieldExplain}, #{isVisible}, #{isEditable}, - #{editHistory} + #{editHistory}, + #{autoBackFill} ) @@ -165,7 +175,8 @@ field_name, is_visible, is_editable, - edit_history + edit_history, + auto_back_fill FROM oa_node_field diff --git a/module-activiti/src/main/resources/static/editor-app/configuration/properties-oa-node-manage-controller.js b/module-activiti/src/main/resources/static/editor-app/configuration/properties-oa-node-manage-controller.js index 7c40a3fc..2e839f41 100644 --- a/module-activiti/src/main/resources/static/editor-app/configuration/properties-oa-node-manage-controller.js +++ b/module-activiti/src/main/resources/static/editor-app/configuration/properties-oa-node-manage-controller.js @@ -64,6 +64,10 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t }, formId: '', formFields: [], + formButton: { + btnAttachment: 0, + btnGoBack: 0 + }, oaUserTaskListeners: [] } @@ -399,6 +403,7 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t } $scope.updatePropertyInModel(assigneeProperty); } + // 更新手动指定单选代理人 function updateAssignee() { assigneeProperty.value = {}; @@ -438,13 +443,13 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t multiInstanceVariable.value = MULTI_INSTANCE_VARIABLE; 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') { // 单人通过 - multiInstanceCondition.value = '${'+ NR_OF_COMPLETED_INSTANCES +' >= 1}' + multiInstanceCondition.value = '${' + NR_OF_COMPLETED_INSTANCES + ' >= 1}' } else if (assignee.completeCondition === 'customPass') { // 通过多少人 - multiInstanceCondition.value = '${'+ NR_OF_COMPLETED_INSTANCES +' >= ' + assignee.completeCount + '}' + multiInstanceCondition.value = '${' + NR_OF_COMPLETED_INSTANCES + ' >= ' + assignee.completeCount + '}' } else { top.dialog.msg('多实例(完成)通过条件错误'); return; @@ -484,7 +489,7 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t } var assignee = $scope.oaNodeManage.assignee; - if($scope.isFirstUserTask) { + if ($scope.isFirstUserTask) { updateStartAssignee(); return; } @@ -508,7 +513,7 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t } // 自动获取 if (assignee.assigneeType === 'auto') { - if(assignee.quickAssignee === 'starter') { + if (assignee.quickAssignee === 'starter') { updateAssignee(); return; } @@ -630,9 +635,9 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t }; // function initOaNodeManage() { - if ($scope.property.value) { - $scope.oaNodeManage = EDITOR.UTIL.deepClone($scope.property.value); - } + if ($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(); return; } - if(startNode.outgoing.length != 1) { + if (startNode.outgoing.length != 1) { top.dialog.msg('流程绘制错误,开始节点后只能有一个UserTask'); $scope.close(); return; @@ -659,15 +664,15 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t function initOaNodeManage() { var firstUserTaskResourceId; for (var i = 0, node; node = childShapes[i++];) { - if(node.stencil.id != 'SequenceFlow') { + if (node.stencil.id != 'SequenceFlow') { continue; } - if(startNode.outgoing[0].resourceId == node.resourceId) { + if (startNode.outgoing[0].resourceId == node.resourceId) { firstUserTaskResourceId = node.outgoing[0].resourceId; break; } } - if(!firstUserTaskResourceId) { + if (!firstUserTaskResourceId) { top.dialog.msg('流程绘制错误,开始节点后没有连线的UserTask'); $scope.close(); return; @@ -677,7 +682,7 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t $scope.oaNodeManage = EDITOR.UTIL.deepClone($scope.property.value); } $scope.isFirstUserTask = firstUserTaskResourceId == selection.resourceId; - if($scope.isFirstUserTask) { + if ($scope.isFirstUserTask) { $scope.oaNodeManage.assignee.nodeType = 'normal'; $scope.oaNodeManage.assignee.assigneeType = 'auto'; $scope.oaNodeManage.assignee.autoAssignType = 'quick'; @@ -707,11 +712,13 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t var isVisible = true; var isEditable = true; var editHistory = 'noRecord'; + var autoBackFill = 'noBackFill'; for (var j = 0, item; item = $scope.oaNodeManage.formFields[j++];) { if (formField.fieldId === item.fieldId) { isVisible = item.isVisible; isEditable = item.isEditable; editHistory = item.editHistory; + autoBackFill = item.autoBackFill; } } formFields.push({ @@ -722,7 +729,8 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t fieldType: formField.fieldType, isVisible: isVisible, isEditable: isEditable, - editHistory: editHistory + editHistory: editHistory, + autoBackFill: autoBackFill }) } $scope.oaNodeManage.formFields = formFields; diff --git a/module-activiti/src/main/resources/static/editor-app/configuration/properties/oa-node-manage-popup.html b/module-activiti/src/main/resources/static/editor-app/configuration/properties/oa-node-manage-popup.html index f6c09195..29c03e44 100644 --- a/module-activiti/src/main/resources/static/editor-app/configuration/properties/oa-node-manage-popup.html +++ b/module-activiti/src/main/resources/static/editor-app/configuration/properties/oa-node-manage-popup.html @@ -11,15 +11,15 @@
  • 代理人配置
  • - - -
  • 表单字段配置
  • 监听器配置
  • +
  • +
    按钮配置
    +
  • @@ -301,7 +301,6 @@
    -
    @@ -312,7 +311,8 @@ - + + @@ -324,6 +324,7 @@ + @@ -340,15 +341,17 @@ + @@ -399,6 +402,48 @@
    可见 可操作 编辑历史自动填充
    - - - + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    序号按钮操作
    1附件 + + +
    2回退 + + +
    +
    diff --git a/module-activiti/src/main/resources/static/editor-app/configuration/toolbar-default-actions.js b/module-activiti/src/main/resources/static/editor-app/configuration/toolbar-default-actions.js index 23d40714..edbad9c3 100644 --- a/module-activiti/src/main/resources/static/editor-app/configuration/toolbar-default-actions.js +++ b/module-activiti/src/main/resources/static/editor-app/configuration/toolbar-default-actions.js @@ -87,7 +87,7 @@ KISBPM.TOOLBAR = { oaNodeManages: oaNodeManages } 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)); top.dialog.msg('保存成功'); }, function (code, data) { @@ -98,12 +98,6 @@ KISBPM.TOOLBAR = { 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) { diff --git a/module-activiti/src/main/resources/static/editor-app/configuration/url-config.js b/module-activiti/src/main/resources/static/editor-app/configuration/url-config.js index cb81193a..66ed87bc 100644 --- a/module-activiti/src/main/resources/static/editor-app/configuration/url-config.js +++ b/module-activiti/src/main/resources/static/editor-app/configuration/url-config.js @@ -28,7 +28,7 @@ KISBPM.URL = { return ACTIVITI.CONFIG.contextRoot + '/model/editor/stencilset?version=' + Date.now(); }, - putModel: function(modelId) { - return ACTIVITI.CONFIG.contextRoot + '/model/save/' + modelId; + putModel: function(modelId, modelVersion) { + return ACTIVITI.CONFIG.contextRoot + '/model/save/' + modelId +'/version/'+ modelVersion; } }; \ No newline at end of file diff --git a/module-activiti/src/main/resources/static/editor-app/css/style-common.css b/module-activiti/src/main/resources/static/editor-app/css/style-common.css index 6b3b549e..c6cc7a12 100644 --- a/module-activiti/src/main/resources/static/editor-app/css/style-common.css +++ b/module-activiti/src/main/resources/static/editor-app/css/style-common.css @@ -1515,4 +1515,14 @@ button.selection:active, button.selection:focus { .fullscreen .modal-header h3 .summary { font-size: 13px; -} \ No newline at end of file +} + +table tbody tr td { + vertical-align: middle !important; +} + +select.input-sm { + height: 21px; + line-height: 20px; + padding: 0; +} diff --git a/module-form/src/main/resources/static/form-design/modules/formDesigner.js b/module-form/src/main/resources/static/form-design/modules/formDesigner.js index 694bcddb..49b361f9 100644 --- a/module-form/src/main/resources/static/form-design/modules/formDesigner.js +++ b/module-form/src/main/resources/static/form-design/modules/formDesigner.js @@ -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 $(document).off('blur', '#columnProperty .layui-input').on('blur', '#columnProperty .layui-input', function () { if ($(this).attr("name") !== undefined) { diff --git a/module-form/src/main/resources/static/form/js/form-util.js b/module-form/src/main/resources/static/form/js/form-util.js index 963181e9..9142bfdd 100644 --- a/module-form/src/main/resources/static/form/js/form-util.js +++ b/module-form/src/main/resources/static/form/js/form-util.js @@ -243,7 +243,7 @@ function FormUtil(layui, viewer) { var fileName = idNameArray[1]; html += [ '', - ' ' + fileName + '', + ' ' + fileName + '', ' ', ' ', ' ', @@ -309,7 +309,7 @@ function FormUtil(layui, viewer) { if (files.length > 0) { files += ','; } - files += res.data.fileId + ':' + res.data.fileName; + files += res.data.fileId + ':' + res.data.fileName.replace(/\,/g, ','); $('#' + name).val(files); init(); }, @@ -317,14 +317,7 @@ function FormUtil(layui, viewer) { layer.close(layerLoadingIndex); layer.msg('文件上传失败'); }, - 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 + '%'); - } + progress: function (n, elem, res, index) {} }); $(document).on('click', deleteBtnClass, function () { var id = this.dataset.id; @@ -496,7 +489,7 @@ function FormUtil(layui, viewer) { if (files.length > 0) { files += ','; } - files += res.data.fileId + ':' + res.data.fileName; + files += res.data.fileId + ':' + res.data.fileName.replace(/\,/g, ','); $('#' + name).val(files); init(); }, @@ -504,14 +497,7 @@ function FormUtil(layui, viewer) { layer.close(layerLoadingIndex); layer.msg('文件上传失败'); }, - 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 + '%'); - } + progress: function (n, elem, res, index) {} }); $(document).on('click', deleteBtnClass, function () { var name = this.dataset.name; @@ -681,7 +667,7 @@ function FormUtil(layui, viewer) { if (files.length > 0) { files += ','; } - files += res.data.fileId + ':' + res.data.fileName; + files += res.data.fileId + ':' + res.data.fileName.replace(/\,/g, ','); $('#' + name).val(files); init(); }, @@ -689,14 +675,7 @@ function FormUtil(layui, viewer) { layer.close(layerLoadingIndex); layer.msg('文件上传失败'); }, - 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 + '%'); - } + progress: function (n, elem, res, index) {} }); $(document).on('click', deleteBtnClass, function () { var name = this.dataset.name; diff --git a/module-form/src/main/resources/static/form/js/oa-form-util.js b/module-form/src/main/resources/static/form/js/oa-form-util.js index a9071c3d..893d1e29 100644 --- a/module-form/src/main/resources/static/form/js/oa-form-util.js +++ b/module-form/src/main/resources/static/form/js/oa-form-util.js @@ -2,6 +2,7 @@ function OaFormUtil(layui) { var $ = layui.$; var win = $(window); var layer = layui.layer; + var upload = layui.upload; var restAjax = layui.restajax; var processImageEnlargeScale = 0; @@ -65,7 +66,7 @@ function OaFormUtil(layui) { var signList = formData[key]; var signListText = ''; 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; 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 += '
    ' + if (formButton.btnAttachment) { + buttons += ''; + } + buttons += ''; + buttons += ''; + buttons += '
    '; + if (formButton.btnGoBack) { + buttons += ''; + } + $('#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 = [ + '
    ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ].join(''); + for (var i = 0, file; file = attachmentArray[i++];) { + var idNameArray = file.split(':'); + var fileId = idNameArray[0]; + var fileName = idNameArray[1]; + html += [ + '', + ' ', + ' ', + '', + ].join(''); + } + html += [ + ' ', + '
    文件名操作
    ' + fileName + '', + formButton.btnAttachment ? '' : '', + '
    ', + '
    ' + ].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(); + } + } \ No newline at end of file