diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/oa/NodeFieldController.java b/module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/oa/NodeFieldController.java index c7c4234c..b1dde0d5 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/oa/NodeFieldController.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/oa/NodeFieldController.java @@ -69,7 +69,7 @@ public class NodeFieldController extends DefaultBaseController { @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) @GetMapping("list/deployment-id/{deploymentId}/flow-node-id/{flowNodeId}") public List listByDeploymentIdAndFlowNodeId(@PathVariable("deploymentId") String deploymentId, @PathVariable("flowNodeId") String flowNodeId) { - return nodeFieldService.listByDeploymentIdAndFlowNodeId(deploymentId, flowNodeId); + return nodeFieldService.listByDeploymentIdAndNodeId(deploymentId, flowNodeId); } } diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/oa/OaFormReportController.java b/module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/oa/OaFormReportController.java index 948cfffc..d4917f78 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/oa/OaFormReportController.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/controller/api/oa/OaFormReportController.java @@ -11,6 +11,7 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -92,8 +93,29 @@ public class OaFormReportController extends DefaultBaseController { if (body.isEmpty()) { throw new ParamsException("提交内容不能为空"); } + Object isNextEndEventObj = body.get(IOaFormReportService.KEY_IS_NEXT_END_EVENT); + if (isNextEndEventObj == null) { + throw new ParamsException("是否结束节点不能为空"); + } + Boolean isNextEndEvent = Boolean.parseBoolean(isNextEndEventObj.toString()); + Object selectTypeObj = body.get(IOaFormReportService.KEY_SELECT_TYPE); + if (selectTypeObj == null) { + throw new ParamsException("选择类型不能为空"); + } + if (StringUtils.isBlank(selectTypeObj.toString())) { + throw new ParamsException("选择类型不能为空"); + } + Object assigneesObj = body.get(IOaFormReportService.KEY_ASSIGNEES); + if (assigneesObj == null) { + throw new ParamsException("未选择下节点代理人"); + } + List assignees = (List) assigneesObj; + if (!isNextEndEvent && assignees.isEmpty()) { + throw new ParamsException("未选择下节点代理人"); + } for (Map.Entry kv : body.entrySet()) { String key = kv.getKey(); + Object value = kv.getValue(); } } } 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 2479ab9c..6b00b5f0 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 @@ -18,12 +18,10 @@ public class NodeFieldDTO { private String formId; @ApiModelProperty(name = "deploymentId", value = "部署ID") private String deploymentId; - @ApiModelProperty(name = "flowNodeIndex", value = "节点下标") - private String flowNodeIndex; - @ApiModelProperty(name = "flowNodeId", value = "节点ID") - private String flowNodeId; - @ApiModelProperty(name = "flowNodeName", value = "节点名称") - private String flowNodeName; + @ApiModelProperty(name = "nodeIndex", value = "节点下标") + private String nodeIndex; + @ApiModelProperty(name = "nodeId", value = "节点ID") + private String nodeId; @ApiModelProperty(name = "fieldName", value = "字段名") private String fieldName; @ApiModelProperty(name = "isVisible", value = "是否可见") @@ -55,28 +53,20 @@ public class NodeFieldDTO { this.deploymentId = deploymentId; } - public String getFlowNodeIndex() { - return flowNodeIndex == null ? "" : flowNodeIndex.trim(); + public String getNodeIndex() { + return nodeIndex == null ? "" : nodeIndex.trim(); } - public void setFlowNodeIndex(String flowNodeIndex) { - this.flowNodeIndex = flowNodeIndex; + public void setNodeIndex(String nodeIndex) { + this.nodeIndex = nodeIndex; } - public String getFlowNodeId() { - return flowNodeId == null ? "" : flowNodeId.trim(); + public String getNodeId() { + return nodeId == null ? "" : nodeId.trim(); } - public void setFlowNodeId(String flowNodeId) { - this.flowNodeId = flowNodeId; - } - - public String getFlowNodeName() { - return flowNodeName == null ? "" : flowNodeName.trim(); - } - - public void setFlowNodeName(String flowNodeName) { - this.flowNodeName = flowNodeName; + public void setNodeId(String nodeId) { + this.nodeId = nodeId; } public String getFieldName() { diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/page/ConfirmAssigneeVO.java b/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/page/ConfirmAssigneeVO.java index 938bb24e..3675f875 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/page/ConfirmAssigneeVO.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/page/ConfirmAssigneeVO.java @@ -14,6 +14,8 @@ public class ConfirmAssigneeVO { private String nodeType; private String btnText; + private String btnExc; + private Boolean isNextEndEvent; private List assignees; public String getNodeType() { @@ -32,6 +34,22 @@ public class ConfirmAssigneeVO { this.btnText = btnText; } + public String getBtnExc() { + return btnExc == null ? "" : btnExc.trim(); + } + + public void setBtnExc(String btnExc) { + this.btnExc = btnExc; + } + + public Boolean getNextEndEvent() { + return isNextEndEvent; + } + + public void setNextEndEvent(Boolean nextEndEvent) { + isNextEndEvent = nextEndEvent; + } + public List getAssignees() { return assignees = assignees == null ? new ArrayList<>() : assignees; } diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/page/FieldVO.java b/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/page/FieldVO.java new file mode 100644 index 00000000..dfaaf48d --- /dev/null +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/pojo/vos/oa/page/FieldVO.java @@ -0,0 +1,39 @@ +package ink.wgink.module.activiti.pojo.vos.oa.page; + +/** + * @ClassName: FieldControlVO + * @Description: 字段 + * @Author: wanggeng + * @Date: 2022/4/20 14:59 + * @Version: 1.0 + */ +public class FieldVO { + + private String fieldName; + private Integer isEditable; + private Integer isVisible; + + public String getFieldName() { + return fieldName == null ? "" : fieldName.trim(); + } + + public void setFieldName(String fieldName) { + this.fieldName = fieldName; + } + + public Integer getIsEditable() { + return isEditable == null ? 0 : isEditable; + } + + public void setIsEditable(Integer isEditable) { + this.isEditable = isEditable; + } + + public Integer getIsVisible() { + return isVisible == null ? 0 : isVisible; + } + + public void setIsVisible(Integer isVisible) { + this.isVisible = isVisible; + } +} 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 485ecbc6..c565a148 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 @@ -117,6 +117,14 @@ public interface IActivitiModelService { */ List listNextUserTasksIncomingSequenceFlow(UserTask userTask); + /** + * 获取指向后续不是网关的的前节点的输出序列流 + * + * @param userTask + * @return + */ + List listOutgoingSequenceFlowToNotGateway(UserTask userTask); + /** * 下一个用户任务列表 * 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 c18a71eb..3061ecd1 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 @@ -151,6 +151,25 @@ public class ActivitiModelServiceImpl extends DefaultBaseService implements IAct return incomingFlows; } + @Override + public List listOutgoingSequenceFlowToNotGateway(UserTask userTask) { + List sequenceFlows = new ArrayList<>(); + setOutgoingSequenceFlowsNotGateway(userTask, sequenceFlows); + return sequenceFlows; + } + + private void setOutgoingSequenceFlowsNotGateway(FlowNode flowNode, List sequenceFlows) { + List outgoingFlows = flowNode.getOutgoingFlows(); + for (SequenceFlow outgoingFlow : outgoingFlows) { + FlowElement targetFlowElement = outgoingFlow.getTargetFlowElement(); + if (targetFlowElement instanceof ExclusiveGateway) { + setOutgoingSequenceFlowsNotGateway((FlowNode) targetFlowElement, sequenceFlows); + } else { + sequenceFlows.add(outgoingFlow); + } + } + } + @Override public List listNextUserTasksByUserTask(UserTask userTask) { List outgoingFlows = userTask.getOutgoingFlows(); @@ -423,7 +442,7 @@ public class ActivitiModelServiceImpl extends DefaultBaseService implements IAct if (currentFlowNode instanceof UserTask) { LOG.debug("当前节点为用户任务"); if (outgoingFlows.size() > 1) { - throw new SearchException("流程错误。用户任务流出序列流不存在"); + throw new SearchException("流程错误。用户任务流出序列流数量大于1"); } setNextUserTasks(outgoingFlows.get(0), nextUserTasks); return; diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/INodeFieldService.java b/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/INodeFieldService.java index 2f5b06d2..6a9490be 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/INodeFieldService.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/INodeFieldService.java @@ -90,9 +90,9 @@ public interface INodeFieldService { * 节点字段列表 * * @param deploymentId - * @param flowNodeId + * @param nodeId * @return */ - List listByDeploymentIdAndFlowNodeId(String deploymentId, String flowNodeId); + List listByDeploymentIdAndNodeId(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 0cdc2d27..d3a223df 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 @@ -18,7 +18,10 @@ public interface IOaFormReportService { String KEY_FORM_CODE = "formCode"; String KEY_FORM_VERSION = "formVersion"; String KEY_REPORT_UID = "reportUid"; - String KEY_START_ASSIGNEE = "startAssignee"; + String KEY_ASSIGNEE_USER = "assigneeUser"; + String KEY_ASSIGNEES = "assignees"; + String KEY_SELECT_TYPE = "selectType"; + String KEY_IS_NEXT_END_EVENT = "isNextEndEvent"; /** * 保存表单 diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/impl/NodeFieldServiceImpl.java b/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/impl/NodeFieldServiceImpl.java index f5e592c9..a301fb39 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/impl/NodeFieldServiceImpl.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/impl/NodeFieldServiceImpl.java @@ -94,10 +94,10 @@ public class NodeFieldServiceImpl extends DefaultBaseService implements INodeFie } @Override - public List listByDeploymentIdAndFlowNodeId(String deploymentId, String flowNodeId) { + public List listByDeploymentIdAndNodeId(String deploymentId, String nodeId) { Map params = getHashMap(2); params.put("deploymentId", deploymentId); - params.put("flowNodeId", flowNodeId); + params.put("nodeId", nodeId); return nodeFieldDao.list(params); } 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 9bc4e826..e64d116f 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 @@ -1,14 +1,20 @@ package ink.wgink.module.activiti.service.oa.impl; import com.alibaba.fastjson.JSON; +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.NodeFieldDTO; import ink.wgink.module.activiti.pojo.pos.oa.OaNodeAssigneePO; 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.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.form.enums.design.FormTypeEnum; +import ink.wgink.module.form.service.design.IFormFieldService; import ink.wgink.module.form.service.report.IFormReportRouteService; import ink.wgink.pojo.dtos.user.UserDTO; import org.activiti.bpmn.model.FlowNode; @@ -53,11 +59,16 @@ public class OaFormReportRouteServiceImpl extends DefaultBaseService implements private IActivitiModelService activitiModelService; @Autowired private INodeAssigneeService nodeAssigneeService; + @Autowired + private IFormFieldService formFieldService; + @Autowired + private INodeFieldService nodeFieldService; @Override public void save(String processDefinitionId, String formCode, Integer formVersion, HttpSession httpSession, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) { Map model = getHashMap(10); model.put("processDefinitionId", processDefinitionId); + model.put("formType", FormTypeEnum.OA.getValue()); LOG.debug("查询流程部署ID"); ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(processDefinitionId).singleResult(); @@ -69,6 +80,17 @@ public class OaFormReportRouteServiceImpl extends DefaultBaseService implements List confirmAssigneeVOs = listConfirmAssignee(deploymentId, firstUserTask); model.put("confirmAssignees", JSON.toJSONString(confirmAssigneeVOs)); + LOG.debug("查询节点字段信息"); + List nodeFieldDTOs = nodeFieldService.listByDeploymentIdAndNodeId(deploymentId, firstUserTask.getId()); + List fieldVOs = nodeFieldDTOs.stream().map(nodeFieldDTO -> { + FieldVO fieldVO = new FieldVO(); + fieldVO.setFieldName(nodeFieldDTO.getFieldName()); + fieldVO.setIsEditable(nodeFieldDTO.getIsEditable()); + fieldVO.setIsVisible(nodeFieldDTO.getIsVisible()); + return fieldVO; + }).collect(Collectors.toList()); + model.put("fields", JSONObject.toJSONString(fieldVOs)); + formReportRouteService.save(formCode, formVersion, httpSession, httpServletRequest, httpServletResponse, model); } @@ -88,6 +110,7 @@ public class OaFormReportRouteServiceImpl extends DefaultBaseService implements UserTask currentUserTask = (UserTask) flowNode; Map model = getHashMap(10); + model.put("formType", FormTypeEnum.OA.getValue()); model.put("taskId", taskId); model.put("isNeedClaim", isNeedClaim); LOG.debug("查询下一个用户任务后直连用户任务列表"); @@ -134,21 +157,32 @@ public class OaFormReportRouteServiceImpl extends DefaultBaseService implements * @return */ private List listConfirmAssignee(String deploymentId, UserTask currentUserTask) { + LOG.debug("1.获取后续任务节点"); List nextUserTasks = activitiModelService.listNextUserTasksByUserTask(currentUserTask); clearUserTask(nextUserTasks); - LOG.debug("发起流程,查询第一个用户任务后直连用户任务列表的流入序列流"); + LOG.debug("2.发起流程,查询第一个用户任务后直连用户任务列表的流入序列流"); // 序列流的数量决定了提交按钮的数量,名字决定了提交按钮的名称,没有名称默认 - List sequenceFlows = activitiModelService.listNextUserTasksIncomingSequenceFlow(currentUserTask); + List sequenceFlows = activitiModelService.listOutgoingSequenceFlowToNotGateway(currentUserTask); - LOG.debug("遍历后续的用户列表"); + // 当下个用户任务节点列表为空并且指向用户任务的输出流为空时,表示下个节点为结束节点 +// if(nextUserTasks.isEmpty() && sequenceFlows.isEmpty()) { +// ConfirmAssigneeVO confirmAssigneeVO = new ConfirmAssigneeVO(); +// confirmAssigneeVO.setNextEndEvent(true); +// return; +// } + + LOG.debug("3.遍历后续的用户列表"); // 按照流入序列流进行区分,页面上体现出为按钮中对应的不同的代理人列表 List confirmAssigneeVOs = new CopyOnWriteArrayList<>(); for (int i = 0; i < sequenceFlows.size(); i++) { SequenceFlow sequenceFlow = sequenceFlows.get(i); String name = sequenceFlow.getName(); ConfirmAssigneeVO confirmAssigneeVO = new ConfirmAssigneeVO(); + // 当有输出流 + confirmAssigneeVO.setNextEndEvent(nextUserTasks.isEmpty() ? true : false); + confirmAssigneeVO.setBtnExc(getSequenceFlowExcCondition(sequenceFlow.getConditionExpression())); if (StringUtils.isBlank(name)) { - confirmAssigneeVO.setBtnText("确认" + (i + 1)); + confirmAssigneeVO.setBtnText("提交" + (i + 1)); } else { confirmAssigneeVO.setBtnText(name); } @@ -174,6 +208,34 @@ public class OaFormReportRouteServiceImpl extends DefaultBaseService implements return confirmAssigneeVOs; } + /** + * 获取序列流上的exc条件 + * + * @param conditionExpression + * @return + */ + private String getSequenceFlowExcCondition(String conditionExpression) { + if (StringUtils.isBlank(conditionExpression)) { + return null; + } + String[] expressionArray = conditionExpression.split("[{}$&|]"); + String excCondition = null; + for (String expression : expressionArray) { + if (!expression.contains("==")) { + continue; + } + if (!expression.contains("exc")) { + continue; + } + String[] conditionArray = expression.split("=="); + String condition = conditionArray[1]; + condition = condition.replaceAll("'", ""); + condition = condition.replaceAll("\"", ""); + excCondition = condition; + } + return excCondition; + } + /** * 清除相同的序列流(目标相同) * @@ -195,4 +257,5 @@ public class OaFormReportRouteServiceImpl extends DefaultBaseService implements } } } + } diff --git a/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/impl/OaFormReportServiceImpl.java b/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/impl/OaFormReportServiceImpl.java index 4b53568d..a5aa83ea 100644 --- a/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/impl/OaFormReportServiceImpl.java +++ b/module-activiti/src/main/java/ink/wgink/module/activiti/service/oa/impl/OaFormReportServiceImpl.java @@ -2,6 +2,8 @@ package ink.wgink.module.activiti.service.oa.impl; import ink.wgink.common.base.DefaultBaseService; import ink.wgink.exceptions.SearchException; +import ink.wgink.module.activiti.enums.oa.assignee.NodeTypeEnum; +import ink.wgink.module.activiti.service.activiti.IActivitiModelService; import ink.wgink.module.activiti.service.oa.IOaFormReportService; import ink.wgink.module.form.service.report.IFormReportService; import ink.wgink.pojo.ListPage; @@ -10,6 +12,7 @@ import org.activiti.engine.RuntimeService; import org.activiti.engine.TaskService; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Task; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -47,6 +50,16 @@ public class OaFormReportServiceImpl extends DefaultBaseService implements IOaFo @Override public void saveByUserId(String userId, String processDefinitionId, String formCode, Integer formVersion, Map params) { + List assignees = (List) params.get(IOaFormReportService.KEY_ASSIGNEES); + String selectType = params.get(IOaFormReportService.KEY_SELECT_TYPE).toString(); + Boolean isNextEndEvent = Boolean.parseBoolean(params.get(IOaFormReportService.KEY_IS_NEXT_END_EVENT).toString()); + Object excObj = params.get(IActivitiModelService.EXCLUSIVE_GATEWAY_CONDITION_KEY); + // 移除无效的内容 + params.remove(IOaFormReportService.KEY_ASSIGNEES); + params.remove(IOaFormReportService.KEY_SELECT_TYPE); + params.remove(IOaFormReportService.KEY_IS_NEXT_END_EVENT); + params.remove(IActivitiModelService.EXCLUSIVE_GATEWAY_CONDITION_KEY); + LOG.debug("保存表单"); String uid = formReportService.saveAndReturnId(formCode, formVersion, params); LOG.debug("定义流程发起人"); @@ -54,7 +67,7 @@ public class OaFormReportServiceImpl extends DefaultBaseService implements IOaFo variables.put(KEY_FORM_CODE, formCode); variables.put(KEY_FORM_VERSION, formVersion); variables.put(KEY_REPORT_UID, uid); - variables.put(KEY_START_ASSIGNEE, userId); + variables.put(KEY_ASSIGNEE_USER, userId); LOG.debug("发起流程"); ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinitionId, variables); LOG.debug("更新表单数据的流程实例ID"); @@ -64,6 +77,13 @@ public class OaFormReportServiceImpl extends DefaultBaseService implements IOaFo if (task == null) { throw new SearchException("任务不存在"); } + // 网关条件 + if (excObj != null && !StringUtils.isBlank(excObj.toString())) { + params.put(IActivitiModelService.EXCLUSIVE_GATEWAY_CONDITION_KEY, excObj); + } + if (!isNextEndEvent) { + setFormReportAssignee(selectType, assignees, params); + } taskService.complete(task.getId(), params, true); } @@ -81,14 +101,46 @@ public class OaFormReportServiceImpl extends DefaultBaseService implements IOaFo @Override public void updateByUserId(String userId, String taskId, String formCode, Integer formVersion, Integer isNeedClaim, String uid, Map params) { + List assignees = (List) params.get(IOaFormReportService.KEY_ASSIGNEES); + String selectType = params.get(IOaFormReportService.KEY_SELECT_TYPE).toString(); + Boolean isNextEndEvent = Boolean.parseBoolean(params.get(IOaFormReportService.KEY_IS_NEXT_END_EVENT).toString()); + Object excObj = params.get(IActivitiModelService.EXCLUSIVE_GATEWAY_CONDITION_KEY); + // 移除无效的内容 + params.remove(IOaFormReportService.KEY_ASSIGNEES); + params.remove(IOaFormReportService.KEY_SELECT_TYPE); + params.remove(IOaFormReportService.KEY_IS_NEXT_END_EVENT); + params.remove(IActivitiModelService.EXCLUSIVE_GATEWAY_CONDITION_KEY); + formReportService.update(formCode, formVersion, uid, params); if (isNeedClaim == 1) { LOG.debug("认领任务"); taskService.claim(taskId, userId); } + // 网关条件 + if (excObj != null && !StringUtils.isBlank(excObj.toString())) { + params.put(IActivitiModelService.EXCLUSIVE_GATEWAY_CONDITION_KEY, excObj); + } + if (!isNextEndEvent) { + setFormReportAssignee(selectType, assignees, params); + } taskService.complete(taskId, params, true); } + /** + * 设置表单提交代理人 + * + * @param selectType 选择类型 + * @param assignees 代理人列表 + * @param formReportParams 表单参数 + */ + private void setFormReportAssignee(String selectType, List assignees, Map formReportParams) { + if (StringUtils.equals(selectType, NodeTypeEnum.MULTIPLE.getValue())) { + formReportParams.put(IActivitiModelService.ASSIGNEE_LIST, assignees); + } else { + formReportParams.put(IOaFormReportService.KEY_ASSIGNEE_USER, assignees.get(0)); + } + } + @Override public Map get(String formCode, Integer formVersion, String uid) { return formReportService.get(formCode, formVersion, uid); 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 b11215dd..3ff60b96 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 @@ -6,9 +6,8 @@ - - - + + @@ -154,9 +153,8 @@ node_field_id, deployment_id, form_id, - flow_node_index, - flow_node_id, - flow_node_name, + node_index, + node_id, field_name, is_visible, is_editable @@ -171,13 +169,13 @@ AND form_id = #{formId} - + AND - flow_node_id = #{flowNodeId} + node_id = #{nodeId} ORDER BY - flow_node_index + node_index \ No newline at end of file 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 7ee4cc85..a2a66217 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 @@ -9,13 +9,13 @@ var OaNodeManageCtrl = ['$scope', '$modal', '$timeout', '$translate', function ( }]; var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $timeout, $http) { - console.log($scope.editor); + // console.log($scope.editor); // console.log($scope.editor.modelMetaData.model.childShapes); // console.log($scope.stencilItemGroups) // 获取流程中的配置 var selection = $scope.editor.selection[0]; var modelJson = $scope.editor.getJSON(); - console.log(modelJson); + // console.log(modelJson); var childShapes = modelJson.childShapes; // 关联到的属性 @@ -33,7 +33,8 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t var MULTI_INSTANCE_VARIABLE = 'assignee'; var NR_OF_COMPLETED_INSTANCES = 'nrOfCompletedInstances'; var NR_OF_INSTANCES = 'nrOfInstances'; - var START_ASSIGNEE = "${startAssignee}" + var START_ASSIGNEE = '${startAssignee}'; + var ASSIGNEE_USER = '${assigneeUser}'; $scope.oaNodeManage = { assignee: { @@ -381,47 +382,12 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t function updateAssignee() { assigneeProperty.value = {}; assigneeProperty.value.assignment = { - assignee: $scope.oaNodeManage.assignee.assignee, + assignee: ASSIGNEE_USER, candidateUsers: [] } $scope.updatePropertyInModel(assigneeProperty); } - function updateStartAssignee() { - assigneeProperty.value = {}; - assigneeProperty.value.assignment = { - assignee: START_ASSIGNEE, - candidateUsers: [] - } - $scope.updatePropertyInModel(assigneeProperty); - } - - // 更新手动指定多选候选人 - function updateCandidate() { - assigneeProperty.value = {}; - assigneeProperty.value.assignment = { - candidateUsers: [] - }; - var candidates = $scope.oaNodeManage.assignee.candidates.split(','); - for (var i = 0, item; item = candidates[i++];) { - if (!item) { - continue; - } - assigneeProperty.value.assignment.candidateUsers.push({ - value: item - }) - } - $scope.updatePropertyInModel(assigneeProperty); - } - - // 更新手动指定多个候选人 - function updateCandidates() { - assigneeProperty.value = {}; - assigneeProperty.value.assignment = { - candidateUsers: [{value: CANDIDATES_COLLECTION}] - }; - } - /** * 更新多实例 */ @@ -500,7 +466,7 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t } // 多选 if (assignee.assigneeCount === 'candidate') { - updateCandidate(); + updateAssignee(); return; } return; @@ -508,10 +474,10 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t // 自动获取 if (assignee.assigneeType === 'auto') { if(assignee.quickAssignee === 'starter') { - updateStartAssignee(); + updateAssignee(); return; } - updateCandidates(); + updateAssignee(); return; } return; diff --git a/module-form/src/main/java/ink/wgink/module/form/service/design/impl/FormDesignServiceImpl.java b/module-form/src/main/java/ink/wgink/module/form/service/design/impl/FormDesignServiceImpl.java index b0a85799..05e733e4 100644 --- a/module-form/src/main/java/ink/wgink/module/form/service/design/impl/FormDesignServiceImpl.java +++ b/module-form/src/main/java/ink/wgink/module/form/service/design/impl/FormDesignServiceImpl.java @@ -134,10 +134,12 @@ public class FormDesignServiceImpl extends DefaultBaseService implements IFormDe model.put(ISystemConstant.FORM_COMMIT_URL, "api/form-report/save/code/{formCode}/version/{formVersion}"); model.put(ISystemConstant.FORM_HIDDEN_INPUT_LIST, Arrays.asList(new String[]{"formCode", "formVersion"})); model.put(ISystemConstant.FORM_COMMIT_PARAM_LIST, Arrays.asList(new String[]{"formCode", "formVersion"})); + model.put(ISystemConstant.FORM_TYPE, formType); } else if (StringUtils.equals(FormTypeEnum.OA.getValue(), formType)) { model.put(ISystemConstant.FORM_COMMIT_URL, "api/oa-form-report/save/definition-id/{processDefinitionId}/code/{formCode}/version/{formVersion}"); model.put(ISystemConstant.FORM_HIDDEN_INPUT_LIST, Arrays.asList(new String[]{"processDefinitionId", "formCode", "formVersion"})); model.put(ISystemConstant.FORM_COMMIT_PARAM_LIST, Arrays.asList(new String[]{"processDefinitionId", "formCode", "formVersion"})); + model.put(ISystemConstant.FORM_TYPE, formType); } else { throw new ParamsException("表单类型错误"); } @@ -159,12 +161,14 @@ public class FormDesignServiceImpl extends DefaultBaseService implements IFormDe model.put(ISystemConstant.FORM_INIT_PARAM_LIST, Arrays.asList(new String[]{"formCode", "formVersion"})); model.put(ISystemConstant.FORM_COMMIT_URL, "api/form-report/save/code/{formCode}/version/{formVersion}"); model.put(ISystemConstant.FORM_COMMIT_PARAM_LIST, Arrays.asList(new String[]{"formCode", "formVersion"})); + model.put(ISystemConstant.FORM_TYPE, formType); } else if (StringUtils.equals(FormTypeEnum.OA.getValue(), formType)) { model.put(ISystemConstant.FORM_HIDDEN_INPUT_LIST, Arrays.asList(new String[]{"taskId", "formCode", "formVersion", "isNeedClaim"})); model.put(ISystemConstant.FORM_INIT_URL, "api/oa-form-report/get/code/{formCode}/version/{formVersion}/uid/{uid}"); model.put(ISystemConstant.FORM_INIT_PARAM_LIST, Arrays.asList(new String[]{"formCode", "formVersion"})); model.put(ISystemConstant.FORM_COMMIT_URL, "api/oa-form-report/update/task-id/{taskId}/code/{formCode}/version/{formVersion}/is-need-claim/{isNeedClaim}/uid/{uid}"); model.put(ISystemConstant.FORM_COMMIT_PARAM_LIST, Arrays.asList(new String[]{"taskId", "formCode", "formVersion", "isNeedClaim"})); + model.put(ISystemConstant.FORM_TYPE, formType); } else { throw new ParamsException("表单类型错误"); } @@ -184,10 +188,12 @@ public class FormDesignServiceImpl extends DefaultBaseService implements IFormDe model.put(ISystemConstant.FORM_HIDDEN_INPUT_LIST, Arrays.asList(new String[]{"formCode", "formVersion"})); model.put(ISystemConstant.FORM_INIT_URL, "api/form-report/get/code/{formCode}/version/{formVersion}/uid/{uid}"); model.put(ISystemConstant.FORM_INIT_PARAM_LIST, Arrays.asList(new String[]{"formCode", "formVersion"})); + model.put(ISystemConstant.FORM_TYPE, formType); } else if (StringUtils.equals(FormTypeEnum.OA.getValue(), formType)) { model.put(ISystemConstant.FORM_HIDDEN_INPUT_LIST, Arrays.asList(new String[]{"formCode", "formVersion"})); model.put(ISystemConstant.FORM_INIT_URL, "api/oa-form-report/get/code/{formCode}/version/{formVersion}/uid/{uid}"); model.put(ISystemConstant.FORM_INIT_PARAM_LIST, Arrays.asList(new String[]{"formCode", "formVersion"})); + model.put(ISystemConstant.FORM_TYPE, formType); } else { throw new ParamsException("表单类型错误"); } @@ -206,10 +212,12 @@ public class FormDesignServiceImpl extends DefaultBaseService implements IFormDe model.put(ISystemConstant.FORM_COMMIT_URL, "app/form-report/save/code/{formCode}/version/{formVersion}"); model.put(ISystemConstant.FORM_HIDDEN_INPUT_LIST, Arrays.asList(new String[]{"formCode", "formVersion"})); model.put(ISystemConstant.FORM_COMMIT_PARAM_LIST, Arrays.asList(new String[]{"formCode", "formVersion"})); + model.put(ISystemConstant.FORM_TYPE, formType); } else if (StringUtils.equals(FormTypeEnum.OA.getValue(), formType)) { model.put(ISystemConstant.FORM_COMMIT_URL, "app/oa-form-report/save/definition-id/{processDefinitionId}/code/{formCode}/version/{formVersion}"); model.put(ISystemConstant.FORM_HIDDEN_INPUT_LIST, Arrays.asList(new String[]{"processDefinitionId", "formCode", "formVersion"})); model.put(ISystemConstant.FORM_COMMIT_PARAM_LIST, Arrays.asList(new String[]{"processDefinitionId", "formCode", "formVersion"})); + model.put(ISystemConstant.FORM_TYPE, formType); } else { throw new ParamsException("表单类型错误"); } @@ -231,12 +239,14 @@ public class FormDesignServiceImpl extends DefaultBaseService implements IFormDe model.put(ISystemConstant.FORM_INIT_PARAM_LIST, Arrays.asList(new String[]{"formCode", "formVersion"})); model.put(ISystemConstant.FORM_COMMIT_URL, "app/form-report/save/code/{formCode}/version/{formVersion}"); model.put(ISystemConstant.FORM_COMMIT_PARAM_LIST, Arrays.asList(new String[]{"formCode", "formVersion"})); + model.put(ISystemConstant.FORM_TYPE, formType); } else if (StringUtils.equals(FormTypeEnum.OA.getValue(), formType)) { model.put(ISystemConstant.FORM_HIDDEN_INPUT_LIST, Arrays.asList(new String[]{"taskId", "formCode", "formVersion", "isNeedClaim"})); model.put(ISystemConstant.FORM_INIT_URL, "app/oa-form-report/get/code/{formCode}/version/{formVersion}/uid/{uid}"); model.put(ISystemConstant.FORM_INIT_PARAM_LIST, Arrays.asList(new String[]{"formCode", "formVersion"})); model.put(ISystemConstant.FORM_COMMIT_URL, "app/oa-form-report/update/task-id/{taskId}/code/{formCode}/version/{formVersion}/is-need-claim/{isNeedClaim}/uid/{uid}"); model.put(ISystemConstant.FORM_COMMIT_PARAM_LIST, Arrays.asList(new String[]{"taskId", "formCode", "formVersion", "isNeedClaim"})); + model.put(ISystemConstant.FORM_TYPE, formType); } else { throw new ParamsException("表单类型错误"); } @@ -257,9 +267,11 @@ public class FormDesignServiceImpl extends DefaultBaseService implements IFormDe model.put(ISystemConstant.FORM_INIT_URL, "app/form-report/get/code/{formCode}/version/{formVersion}/uid/{uid}"); model.put(ISystemConstant.FORM_INIT_PARAM_LIST, Arrays.asList(new String[]{"formCode", "formVersion"})); } else if (StringUtils.equals(FormTypeEnum.OA.getValue(), formType)) { + model.put(ISystemConstant.FORM_TYPE, formType); model.put(ISystemConstant.FORM_HIDDEN_INPUT_LIST, Arrays.asList(new String[]{"formCode", "formVersion"})); model.put(ISystemConstant.FORM_INIT_URL, "app/oa-form-report/get/code/{formCode}/version/{formVersion}/uid/{uid}"); model.put(ISystemConstant.FORM_INIT_PARAM_LIST, Arrays.asList(new String[]{"formCode", "formVersion"})); + model.put(ISystemConstant.FORM_TYPE, formType); } else { throw new ParamsException("表单类型错误"); } diff --git a/module-form/src/main/resources/static/form/css/form.css b/module-form/src/main/resources/static/form/css/form.css index c6574f05..78881872 100644 --- a/module-form/src/main/resources/static/form/css/form.css +++ b/module-form/src/main/resources/static/form/css/form.css @@ -1,3 +1,6 @@ +.form-report-foot { + padding: 0 !important; +} /* 上传图片 */ .form-upload-image { position: relative; 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 1ae1849a..7da593b2 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 @@ -492,19 +492,28 @@ function FormUtil(layui, viewer) { } /** - * 选择用户列表 - * @param selectType 类型:单选(radio)、多选(checkbox) - * @param callback 回调,参数: [{userId: '', userUsername: '', userName: ''}] - * @param users 要选择的用户数组,格式: [{userId: '', userUsername: '', userName: ''}] - * @param selectedUserIds 已经选择的用户ID数组,格式:['userId1', 'userId2'] + * @callback onConfirm + * @param selectedUsers {Array} [{userId: '', userName: '', userUsername: ''}] */ - this.selectUsers = function (selectType, callback, users, selectedUserIds) { - if(selectType != 'radio' && selectType != 'checkbox') { + /** + * @description 选择用户列表 + * @param opt {object} + * @param {String} opt.selectType 'radio|checkbox' 必传,2选1 + * @param {onConfirm} opt.onConfirm 确定按钮回调函数,必传 + * @param {Array} opt.users 参与选择的用户列表,必传,格式:[{userId: '', userUsername: '', userName: ''}] + * @param {Array} opt.selectedUserIds 默认选中的用户ID列表,非必传,如果selectType为 radio,默认选中[0]。格式:['userId1', 'userId2'] + */ + this.selectUsers = function (opt) { + var selectType = opt.selectType, + onConfirm = opt.onConfirm, + users = opt.users, + selectedUserIds = opt.selectedUserIds; + if (selectType != 'radio' && selectType != 'checkbox') { throw 'selectType(arg1): [radio|checkbox]'; return; } if (!users && !(users instanceof Array)) { - callback([]); + onConfirm([]); } selectedUserIds = selectedUserIds && (selectedUserIds instanceof Array) ? selectedUserIds : []; @@ -526,7 +535,7 @@ function FormUtil(layui, viewer) { $('.select-user .list .item').click(function () { var dataset = this.dataset; var userId = dataset.userId; - if(selectType === 'radio') { + if (selectType === 'radio') { $('.select-user .list .item').removeClass('active'); $(this).addClass('active'); selectedUserMap = {}; @@ -545,7 +554,7 @@ function FormUtil(layui, viewer) { for (var key in selectedUserMap) { selectedUsers.push(selectedUserMap[key]); } - if(selectedUsers.length == 0) { + if (selectedUsers.length == 0) { layer.msg('请选择人员'); return; } @@ -556,6 +565,7 @@ function FormUtil(layui, viewer) { layer.close(layIndex); }); } + // 添加用户到map for (var i = 0, user; user = users[i++];) { var isActive = false; @@ -566,7 +576,7 @@ function FormUtil(layui, viewer) { break; } } - itemHtml += '
'; + itemHtml += '
'; itemHtml += '
'; if (user.avatar) { itemHtml += ''; @@ -603,11 +613,39 @@ function FormUtil(layui, viewer) { '
' + '
', end: function () { - callback(selectedUsers); + onConfirm(selectedUsers); } }); addClick(); } + /** + * @description 禁止字段操作 + * @param fields {Array} [{fieldName:'', isEditable: 0|1}] + */ + this.disableFields = function (fields) { + for (var i = 0, item; item = fields[i++];) { + if (parseInt(item.isEditable) === 0) { + var boxId = '#' + item.fieldName + 'Box'; + $(boxId).css('position', 'relative'); + $(boxId).append('
'); + } + } + } + + /** + * @description 隐藏字段操作 + * @param fields {Array} [{fieldName:'', isVisible: 0|1}] + */ + this.hideFields = function (fields) { + for (var i = 0, item; item = fields[i++];) { + if (parseInt(item.isVisible) === 0) { + var boxId = '#' + item.fieldName + 'Box'; + $(boxId).hide(); + } + } + } + + } \ No newline at end of file diff --git a/module-form/src/main/resources/templates/ftl/page/app/app-form-save.ftl b/module-form/src/main/resources/templates/ftl/page/app/app-form-save.ftl index 70cc7950..6f75417c 100644 --- a/module-form/src/main/resources/templates/ftl/page/app/app-form-save.ftl +++ b/module-form/src/main/resources/templates/ftl/page/app/app-form-save.ftl @@ -24,10 +24,17 @@
+ <#if formType == "oa"> + + <#else> +
@@ -54,6 +61,22 @@ var queryParams = restAjax.params(window.location.href); var token = queryParams.token; var formUtil = new FormUtil(layui, Viewer); + <#if formType == "oa"> + // 调试可先设置为空对象 + var confirmAssignees = ${r"${confirmAssignees}"}; + var fields = ${r"${fields}"}; + + + <#if formType == "oa"> + function initSubmitBtns() { + var btnColor = ['', 'layui-btn-normal', 'layui-btn-warm']; + var btns = ''; + for(var i = 0, item; item = confirmAssignees[i++];) { + btns += '' + } + $('#submitBtnGroup').append(btns); + } + // 初始化 function initData() { @@ -77,6 +100,11 @@ }); + <#if formType == "oa"> + initSubmitBtns(); + formUtil.hideFields(fields); + formUtil.disableFields(fields); + } initData(); @@ -86,6 +114,83 @@ parent.layer.close(parent.layer.getFrameIndex(window.name)); }); + <#if formType == "oa"> + // 初始化按钮 + (function() { + function confirmForm(formData) { + layer.confirm('确定提交吗?', function(confirmLayerIndex) { + layer.close(confirmLayerIndex); + + // 提交前处理 + formUtil.clearUploadField(formData); + + var loadLayerIndex; + restAjax.post(restAjax.path('${commitUrl}', [ + <#list commitParams as commitParam> + $('#${commitParam}').val(), + + ]), formData.field, { + headers: { + token: token + } + }, function (code, data) { + // 这里手动添加操作成功后的操作', + }, function (code, data) { + $('.confirm-btn').show(); + layer.msg(data.msg); + }, function () { + $('.confirm-btn').hide(); + loadLayerIndex = layer.msg('提交中...', {icon: 16, time: 0, shade: 0.3}); + }, function () { + layer.close(loadLayerIndex); + }); + }); + } + + for(var i = 0, item; item = confirmAssignees[i++];) { + // 提交表单 + form.on('submit(submit'+ i +')', function (formData) { + var dataset = formData.elem.dataset; + var btnText = formData.elem.innerText; + var confirmMsg = '确定 '+ btnText +'?'; + var index = dataset.index; + var isNextEndEvent = dataset.nextEndEvent; + var selectType = dataset.selectType === 'normal' ? 'radio' : 'checkbox'; + var btnExc = dataset.btnExc ? dataset.btnExc : ''; + + formData.field.selectType = selectType; + formData.field.isNextEndEvent = isNextEndEvent; + formData.field.exc = btnExc; + // 代理人列表为空时,直接提交 + if(confirmAssignees[index].assignees.length == 0) { + formData.field.assignees = []; + confirmForm(formData, confirmMsg); + return false; + } + if(confirmAssignees[index].assignees.length == 1) { + formData.field.assignees = [confirmAssignees[index].assignees[0].userId]; + confirmForm(formData, confirmMsg); + return false; + } + + formUtil.selectUsers({ + selectType: selectType, + users: confirmAssignees[index].assignees, + selectedUserIds: [], + onConfirm: function(selectedUsers) { + var assignees = []; + for(var j = 0, jItem; jItem = selectedUsers[j++];) { + assignees.push(jItem.userId); + } + formData.field.assignees = assignees; + confirmForm(formData, confirmMsg); + } + }); + return false; + }); + } + })(); + <#else> // 提交表单 form.on('submit(submitForm)', function (formData) { layer.confirm('确定提交吗?', function(confirmLayerIndex) { @@ -124,6 +229,7 @@ }); return false; }); + }); diff --git a/module-form/src/main/resources/templates/ftl/page/app/app-form-show.ftl b/module-form/src/main/resources/templates/ftl/page/app/app-form-show.ftl index 0ba3d6a7..51bab481 100644 --- a/module-form/src/main/resources/templates/ftl/page/app/app-form-show.ftl +++ b/module-form/src/main/resources/templates/ftl/page/app/app-form-show.ftl @@ -24,9 +24,15 @@
+ <#if formType == "oa"> + + <#else> +
diff --git a/module-form/src/main/resources/templates/ftl/page/app/app-form-update.ftl b/module-form/src/main/resources/templates/ftl/page/app/app-form-update.ftl index 2a89196c..dd99a76b 100644 --- a/module-form/src/main/resources/templates/ftl/page/app/app-form-update.ftl +++ b/module-form/src/main/resources/templates/ftl/page/app/app-form-update.ftl @@ -24,10 +24,17 @@
+ <#if formType == "oa"> + + <#else> +
@@ -55,6 +62,22 @@ var token = queryParams.token; var uid = queryParams.uid; var formUtil = new FormUtil(layui, Viewer); + <#if formType == "oa"> + // 调试可先设置为空对象 + var confirmAssignees = ${r"${confirmAssignees}"}; + var fields = ${r"${fields}"}; + + + <#if formType == "oa"> + function initSubmitBtns() { + var btnColor = ['', 'layui-btn-normal', 'layui-btn-warm']; + var btns = ''; + for(var i = 0, item; item = confirmAssignees[i++];) { + btns += '' + } + $('#submitBtnGroup').append(btns); + } + // 初始化 function initData() { @@ -100,6 +123,11 @@ form.render(null, 'dataForm'); + <#if formType == "oa"> + initSubmitBtns(); + formUtil.hideFields(fields); + formUtil.disableFields(fields); + }, function(code, data) { top.dialog.msg(data.msg); }, function() { @@ -116,6 +144,84 @@ parent.layer.close(parent.layer.getFrameIndex(window.name)); }); + <#if formType == "oa"> + (function() { + function confirmForm(formData, confirmMsg) { + confirmMsg = confirmMsg ? confirmMsg : '确定提交吗'; + layer.confirm(confirmMsg, function(confirmLayerIndex) { + layer.close(confirmLayerIndex); + + // 提交前处理 + formUtil.clearUploadField(formData); + + var loadLayerIndex; + restAjax.put(restAjax.path('${commitUrl}', [ + <#list commitParams as commitParam> + $('#${commitParam}').val(), + + uid + ]), formData.field, { + headers: { + token: token + } + }, function (code, data) { + // 这里手动添加操作成功后的操作', + }, function (code, data) { + $('#confirm-btn').show(); + layer.msg(data.msg); + }, function () { + $('#confirm-btn').hide(); + loadLayerIndex = layer.msg('提交中...', {icon: 16, time: 0, shade: 0.3}); + }, function () { + layer.close(loadLayerIndex); + }); + }); + } + + for(var i = 0, item; item = confirmAssignees[i++];) { + // 提交表单 + form.on('submit(submit'+ i +')', function (formData) { + var dataset = formData.elem.dataset; + var btnText = formData.elem.innerText; + var confirmMsg = '确定 '+ btnText +'?'; + var index = dataset.index; + var isNextEndEvent = dataset.nextEndEvent; + var selectType = dataset.selectType === 'normal' ? 'radio' : 'checkbox'; + var btnExc = dataset.btnExc ? dataset.btnExc : ''; + + formData.field.selectType = selectType; + formData.field.isNextEndEvent = isNextEndEvent; + formData.field.exc = btnExc; + // 代理人列表为空时,直接提交 + if(confirmAssignees[index].assignees.length == 0) { + formData.field.assignees = []; + confirmForm(formData, confirmMsg); + return false; + } + if(confirmAssignees[index].assignees.length == 1) { + formData.field.assignees = [confirmAssignees[index].assignees[0].userId]; + confirmForm(formData, confirmMsg); + return false; + } + + formUtil.selectUsers({ + selectType: selectType, + users: confirmAssignees[index].assignees, + selectedUserIds: [], + onConfirm: function(selectedUsers) { + var assignees = []; + for(var j = 0, jItem; jItem = selectedUsers[j++];) { + assignees.push(jItem.userId); + } + formData.field.assignees = assignees; + confirmForm(formData, confirmMsg); + } + }); + return false; + }); + } + })(); + <#else> // 提交表单 form.on('submit(submitForm)', function (formData) { layer.confirm('确定提交吗?', function(confirmLayerIndex) { @@ -135,7 +241,8 @@ restAjax.put(restAjax.path('${commitUrl}', [ <#list commitParams as commitParam> $('#${commitParam}').val(), - + , + uid ]), formData.field, { headers: { token: token @@ -154,6 +261,7 @@ }); return false; }); + }); diff --git a/module-form/src/main/resources/templates/ftl/page/web/form-save.ftl b/module-form/src/main/resources/templates/ftl/page/web/form-save.ftl index bb130d6e..0663a6d7 100644 --- a/module-form/src/main/resources/templates/ftl/page/web/form-save.ftl +++ b/module-form/src/main/resources/templates/ftl/page/web/form-save.ftl @@ -24,10 +24,17 @@
+ <#if formType == "oa"> + + <#else> +
@@ -52,6 +59,22 @@ var laydate = layui.laydate; var restAjax = layui.restajax; var formUtil = new FormUtil(layui, Viewer); + <#if formType == "oa"> + // 调试可先设置为空对象 + var confirmAssignees = ${r"${confirmAssignees}"}; + var fields = ${r"${fields}"}; + + + <#if formType == "oa"> + function initSubmitBtns() { + var btnColor = ['', 'layui-btn-normal', 'layui-btn-warm']; + var btns = ''; + for(var i = 0, item; item = confirmAssignees[i++];) { + btns += '' + } + $('#submitBtnGroup').append(btns); + } + // 初始化 function initData() { @@ -75,6 +98,11 @@ }); + <#if formType == "oa"> + initSubmitBtns(); + formUtil.hideFields(fields); + formUtil.disableFields(fields); + } initData(); @@ -84,6 +112,79 @@ parent.layer.close(parent.layer.getFrameIndex(window.name)); }); + <#if formType == "oa"> + // 初始化按钮 + (function() { + function confirmForm(formData) { + layer.confirm('确定提交吗?', function(confirmLayerIndex) { + layer.close(confirmLayerIndex); + + // 提交前处理 + formUtil.clearUploadField(formData); + + var loadLayerIndex; + restAjax.post(restAjax.path('${commitUrl}', [ + <#list commitParams as commitParam> + $('#${commitParam}').val(), + + ]), formData.field, null, function (code, data) { + // 这里手动添加操作成功后的操作', + }, function (code, data) { + $('.confirm-btn').show(); + layer.msg(data.msg); + }, function () { + $('.confirm-btn').hide(); + loadLayerIndex = layer.msg('提交中...', {icon: 16, time: 0, shade: 0.3}); + }, function () { + layer.close(loadLayerIndex); + }); + }); + } + + for(var i = 0, item; item = confirmAssignees[i++];) { + // 提交表单 + form.on('submit(submit'+ i +')', function (formData) { + var dataset = formData.elem.dataset; + var btnText = formData.elem.innerText; + var confirmMsg = '确定 '+ btnText +'?'; + var index = dataset.index; + var isNextEndEvent = dataset.nextEndEvent; + var selectType = dataset.selectType === 'normal' ? 'radio' : 'checkbox'; + var btnExc = dataset.btnExc ? dataset.btnExc : ''; + + formData.field.selectType = selectType; + formData.field.isNextEndEvent = isNextEndEvent; + formData.field.exc = btnExc; + // 代理人列表为空时,直接提交 + if(confirmAssignees[index].assignees.length == 0) { + formData.field.assignees = []; + confirmForm(formData, confirmMsg); + return false; + } + if(confirmAssignees[index].assignees.length == 1) { + formData.field.assignees = [confirmAssignees[index].assignees[0].userId]; + confirmForm(formData, confirmMsg); + return false; + } + + formUtil.selectUsers({ + selectType: selectType, + users: confirmAssignees[index].assignees, + selectedUserIds: [], + onConfirm: function(selectedUsers) { + var assignees = []; + for(var j = 0, jItem; jItem = selectedUsers[j++];) { + assignees.push(jItem.userId); + } + formData.field.assignees = assignees; + confirmForm(formData, confirmMsg); + } + }); + return false; + }); + } + })(); + <#else> // 提交表单 form.on('submit(submitForm)', function (formData) { layer.confirm('确定提交吗?', function(confirmLayerIndex) { @@ -118,6 +219,8 @@ }); return false; }); + + }); diff --git a/module-form/src/main/resources/templates/ftl/page/web/form-show.ftl b/module-form/src/main/resources/templates/ftl/page/web/form-show.ftl index ff3ededc..35e0fe16 100644 --- a/module-form/src/main/resources/templates/ftl/page/web/form-show.ftl +++ b/module-form/src/main/resources/templates/ftl/page/web/form-show.ftl @@ -24,9 +24,15 @@
+ <#if formType == "oa"> + + <#else> +
diff --git a/module-form/src/main/resources/templates/ftl/page/web/form-update.ftl b/module-form/src/main/resources/templates/ftl/page/web/form-update.ftl index 75142909..37330d10 100644 --- a/module-form/src/main/resources/templates/ftl/page/web/form-update.ftl +++ b/module-form/src/main/resources/templates/ftl/page/web/form-update.ftl @@ -24,10 +24,17 @@
+ <#if formType == "oa"> + + <#else> +
@@ -54,6 +61,22 @@ var queryParams = restAjax.params(window.location.href); var uid = queryParams.uid; var formUtil = new FormUtil(layui, Viewer); + <#if formType == "oa"> + // 调试可先设置为空对象 + var confirmAssignees = ${r"${confirmAssignees}"}; + var fields = ${r"${fields}"}; + + + <#if formType == "oa"> + function initSubmitBtns() { + var btnColor = ['', 'layui-btn-normal', 'layui-btn-warm']; + var btns = ''; + for(var i = 0, item; item = confirmAssignees[i++];) { + btns += '' + } + $('#submitBtnGroup').append(btns); + } + // 初始化 function initData() { @@ -95,6 +118,11 @@ form.render(null, 'dataForm'); + <#if formType == "oa"> + initSubmitBtns(); + formUtil.hideFields(fields); + formUtil.disableFields(fields); + }, function(code, data) { top.dialog.msg(data.msg); }, function() { @@ -111,6 +139,81 @@ parent.layer.close(parent.layer.getFrameIndex(window.name)); }); + <#if formType == "oa"> + (function() { + function confirmForm(formData, confirmMsg) { + confirmMsg = confirmMsg ? confirmMsg : '确定提交吗'; + layer.confirm(confirmMsg, function(confirmLayerIndex) { + layer.close(confirmLayerIndex); + + // 提交前处理 + formUtil.clearUploadField(formData); + + var loadLayerIndex; + restAjax.put(restAjax.path('${commitUrl}', [ + <#list commitParams as commitParam> + $('#${commitParam}').val(), + + uid + ]), formData.field, null, function (code, data) { + // 这里手动添加操作成功后的操作', + }, function (code, data) { + $('#confirm-btn').show(); + layer.msg(data.msg); + }, function () { + $('#confirm-btn').hide(); + loadLayerIndex = layer.msg('提交中...', {icon: 16, time: 0, shade: 0.3}); + }, function () { + layer.close(loadLayerIndex); + }); + }); + } + + for(var i = 0, item; item = confirmAssignees[i++];) { + // 提交表单 + form.on('submit(submit'+ i +')', function (formData) { + var dataset = formData.elem.dataset; + var btnText = formData.elem.innerText; + var confirmMsg = '确定 '+ btnText +'?'; + var index = dataset.index; + var isNextEndEvent = dataset.nextEndEvent; + var selectType = dataset.selectType === 'normal' ? 'radio' : 'checkbox'; + var btnExc = dataset.btnExc ? dataset.btnExc : ''; + + // 代理人列表为空时,直接提交 + formData.field.selectType = selectType; + formData.field.isNextEndEvent = isNextEndEvent; + formData.field.exc = btnExc; + if(confirmAssignees[index].assignees.length == 0) { + formData.field.assignees = []; + confirmForm(formData, confirmMsg); + return false; + } + if(confirmAssignees[index].assignees.length == 1) { + formData.field.assignees = [confirmAssignees[index].assignees[0].userId]; + confirmForm(formData, confirmMsg); + return false; + } + + formUtil.selectUsers({ + selectType: selectType, + users: confirmAssignees[index].assignees, + selectedUserIds: [], + onConfirm: function(selectedUsers) { + console.log(selectedUsers); + var assignees = []; + for(var j = 0, jItem; jItem = selectedUsers[j++];) { + assignees.push(jItem.userId); + } + formData.field.assignees = assignees; + confirmForm(formData, confirmMsg); + } + }); + return false; + }); + } + })(); + <#else> // 提交表单 form.on('submit(submitForm)', function (formData) { layer.confirm('确定提交吗?', function(confirmLayerIndex) { @@ -131,6 +234,7 @@ <#list commitParams as commitParam> $('#${commitParam}').val(), + uid ]), formData.field, null, function (code, data) { // 这里手动添加操作成功后的操作', }, function (code, data) { @@ -145,6 +249,7 @@ }); return false; }); + });