完善动态表单与OA的功能

This commit is contained in:
wanggeng 2022-04-20 16:00:34 +08:00
parent f5754acd8a
commit ac362230d5
23 changed files with 763 additions and 98 deletions

View File

@ -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<NodeFieldDTO> listByDeploymentIdAndFlowNodeId(@PathVariable("deploymentId") String deploymentId, @PathVariable("flowNodeId") String flowNodeId) {
return nodeFieldService.listByDeploymentIdAndFlowNodeId(deploymentId, flowNodeId);
return nodeFieldService.listByDeploymentIdAndNodeId(deploymentId, flowNodeId);
}
}

View File

@ -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<String> assignees = (List<String>) assigneesObj;
if (!isNextEndEvent && assignees.isEmpty()) {
throw new ParamsException("未选择下节点代理人");
}
for (Map.Entry<String, Object> kv : body.entrySet()) {
String key = kv.getKey();
Object value = kv.getValue();
}
}
}

View File

@ -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() {

View File

@ -14,6 +14,8 @@ public class ConfirmAssigneeVO {
private String nodeType;
private String btnText;
private String btnExc;
private Boolean isNextEndEvent;
private List<AssigneeVO> 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<AssigneeVO> getAssignees() {
return assignees = assignees == null ? new ArrayList<>() : assignees;
}

View File

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

View File

@ -117,6 +117,14 @@ public interface IActivitiModelService {
*/
List<SequenceFlow> listNextUserTasksIncomingSequenceFlow(UserTask userTask);
/**
* 获取指向后续不是网关的的前节点的输出序列流
*
* @param userTask
* @return
*/
List<SequenceFlow> listOutgoingSequenceFlowToNotGateway(UserTask userTask);
/**
* 下一个用户任务列表
*

View File

@ -151,6 +151,25 @@ public class ActivitiModelServiceImpl extends DefaultBaseService implements IAct
return incomingFlows;
}
@Override
public List<SequenceFlow> listOutgoingSequenceFlowToNotGateway(UserTask userTask) {
List<SequenceFlow> sequenceFlows = new ArrayList<>();
setOutgoingSequenceFlowsNotGateway(userTask, sequenceFlows);
return sequenceFlows;
}
private void setOutgoingSequenceFlowsNotGateway(FlowNode flowNode, List<SequenceFlow> sequenceFlows) {
List<SequenceFlow> 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<UserTask> listNextUserTasksByUserTask(UserTask userTask) {
List<SequenceFlow> 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;

View File

@ -90,9 +90,9 @@ public interface INodeFieldService {
* 节点字段列表
*
* @param deploymentId
* @param flowNodeId
* @param nodeId
* @return
*/
List<NodeFieldDTO> listByDeploymentIdAndFlowNodeId(String deploymentId, String flowNodeId);
List<NodeFieldDTO> listByDeploymentIdAndNodeId(String deploymentId, String nodeId);
}

View File

@ -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";
/**
* 保存表单

View File

@ -94,10 +94,10 @@ public class NodeFieldServiceImpl extends DefaultBaseService implements INodeFie
}
@Override
public List<NodeFieldDTO> listByDeploymentIdAndFlowNodeId(String deploymentId, String flowNodeId) {
public List<NodeFieldDTO> listByDeploymentIdAndNodeId(String deploymentId, String nodeId) {
Map<String, Object> params = getHashMap(2);
params.put("deploymentId", deploymentId);
params.put("flowNodeId", flowNodeId);
params.put("nodeId", nodeId);
return nodeFieldDao.list(params);
}

View File

@ -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<String, Object> 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<ConfirmAssigneeVO> confirmAssigneeVOs = listConfirmAssignee(deploymentId, firstUserTask);
model.put("confirmAssignees", JSON.toJSONString(confirmAssigneeVOs));
LOG.debug("查询节点字段信息");
List<NodeFieldDTO> nodeFieldDTOs = nodeFieldService.listByDeploymentIdAndNodeId(deploymentId, firstUserTask.getId());
List<FieldVO> 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<String, Object> 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<ConfirmAssigneeVO> listConfirmAssignee(String deploymentId, UserTask currentUserTask) {
LOG.debug("1.获取后续任务节点");
List<UserTask> nextUserTasks = activitiModelService.listNextUserTasksByUserTask(currentUserTask);
clearUserTask(nextUserTasks);
LOG.debug("发起流程,查询第一个用户任务后直连用户任务列表的流入序列流");
LOG.debug("2.发起流程,查询第一个用户任务后直连用户任务列表的流入序列流");
// 序列流的数量决定了提交按钮的数量名字决定了提交按钮的名称没有名称默认
List<SequenceFlow> sequenceFlows = activitiModelService.listNextUserTasksIncomingSequenceFlow(currentUserTask);
List<SequenceFlow> sequenceFlows = activitiModelService.listOutgoingSequenceFlowToNotGateway(currentUserTask);
LOG.debug("遍历后续的用户列表");
// 当下个用户任务节点列表为空并且指向用户任务的输出流为空时表示下个节点为结束节点
// if(nextUserTasks.isEmpty() && sequenceFlows.isEmpty()) {
// ConfirmAssigneeVO confirmAssigneeVO = new ConfirmAssigneeVO();
// confirmAssigneeVO.setNextEndEvent(true);
// return;
// }
LOG.debug("3.遍历后续的用户列表");
// 按照流入序列流进行区分页面上体现出为按钮中对应的不同的代理人列表
List<ConfirmAssigneeVO> 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
}
}
}
}

View File

@ -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<String, Object> params) {
List<String> assignees = (List<String>) 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<String, Object> params) {
List<String> assignees = (List<String>) 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<String> assignees, Map<String, Object> 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<String, Object> get(String formCode, Integer formVersion, String uid) {
return formReportService.get(formCode, formVersion, uid);

View File

@ -6,9 +6,8 @@
<id column="node_field_id" property="nodeFieldId"/>
<result column="deployment_id" property="deploymentId"/>
<result column="form_id" property="formId"/>
<result column="flow_node_index" property="flowNodeIndex"/>
<result column="flow_node_id" property="flowNodeId"/>
<result column="flow_node_name" property="flowNodeName"/>
<result column="node_index" property="nodeIndex"/>
<result column="node_id" property="nodeId"/>
<result column="field_name" property="fieldName"/>
<result column="is_visible" property="isVisible"/>
<result column="is_editable" property="isEditable"/>
@ -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}
</if>
<if test="flowNodeId != null and flowNodeId != ''">
<if test="nodeId != null and nodeId != ''">
AND
flow_node_id = #{flowNodeId}
node_id = #{nodeId}
</if>
</where>
ORDER BY
flow_node_index
node_index
</select>
</mapper>

View File

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

View File

@ -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("表单类型错误");
}

View File

@ -1,3 +1,6 @@
.form-report-foot {
padding: 0 !important;
}
/* 上传图片 */
.form-upload-image {
position: relative;

View File

@ -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 += '<div class="item' + (isActive ? ' active' : '') + '" data-user-id="' + user.userId + '" data-user-username="' + user.userUsername + '" data-userName="' + user.userName + '">';
itemHtml += '<div class="item' + (isActive ? ' active' : '') + '" data-user-id="' + user.userId + '" data-user-username="' + user.userUsername + '" data-user-name="' + user.userName + '">';
itemHtml += '<div class="avatar">';
if (user.avatar) {
itemHtml += '<img src="route/file/download/true/' + user.avatar + '"/>';
@ -603,11 +613,39 @@ function FormUtil(layui, viewer) {
'</div>' +
'</div>',
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('<div style="width: 100%; height: 100%; background-color: #fff0; position: absolute; top: 0; left: 0; cursor: not-allowed;"></div>');
}
}
}
/**
* @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();
}
}
}
}

View File

@ -24,10 +24,17 @@
</#list>
<div class="layui-form-item layui-layout-admin">
<div class="layui-input-block">
<#if formType == "oa">
<div class="layui-footer form-report-foot">
<div id="submitBtnGroup" class="layui-btn-group"></div>
<button type="button" class="layui-btn layui-btn-sm layui-btn-primary close">返回</button>
</div>
<#else>
<div class="layui-footer" style="left: 0;">
<button type="button" id="submitFormBtn" class="layui-btn" lay-submit lay-filter="submitForm">提交</button>
<button type="button" class="layui-btn layui-btn-primary close">返回</button>
</div>
</#if>
</div>
</div>
</form>
@ -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>
<#if formType == "oa">
function initSubmitBtns() {
var btnColor = ['', 'layui-btn-normal', 'layui-btn-warm'];
var btns = '';
for(var i = 0, item; item = confirmAssignees[i++];) {
btns += '<button type="button" id="submitFormBtn'+ i +'" class="layui-btn layui-btn-sm '+ btnColor[(i - 1) % 3] +' confirm-btn" lay-submit lay-filter="submit'+ i +'" data-select-type="'+ item.nodeType +'" data-index="'+ (i - 1) +'" data-next-end-event="'+ item.nextEndEvent +'" data-btn-exc="'+ item.btnExc +'">'+ item.btnText +'</button>'
}
$('#submitBtnGroup').append(btns);
}
</#if>
// 初始化
function initData() {
@ -77,6 +100,11 @@
});
</#if>
</#list>
<#if formType == "oa">
initSubmitBtns();
formUtil.hideFields(fields);
formUtil.disableFields(fields);
</#if>
}
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(),
</#list>
]), 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;
});
</#if>
});
</script>
</body>

View File

@ -24,9 +24,15 @@
</#list>
<div class="layui-form-item layui-layout-admin">
<div class="layui-input-block">
<#if formType == "oa">
<div class="layui-footer form-report-foot">
<button type="button" class="layui-btn layui-btn-sm layui-btn-primary close">返回</button>
</div>
<#else>
<div class="layui-footer" style="left: 0;">
<button type="button" class="layui-btn layui-btn-primary close">返回</button>
</div>
</#if>
</div>
</div>
</form>

View File

@ -24,10 +24,17 @@
</#list>
<div class="layui-form-item layui-layout-admin">
<div class="layui-input-block">
<#if formType == "oa">
<div class="layui-footer form-report-foot">
<div id="submitBtnGroup" class="layui-btn-group"></div>
<button type="button" class="layui-btn layui-btn-sm layui-btn-primary close">返回</button>
</div>
<#else>
<div class="layui-footer" style="left: 0;">
<button type="button" id="submitFormBtn" class="layui-btn" lay-submit lay-filter="submitForm">提交</button>
<button type="button" class="layui-btn layui-btn-primary close">返回</button>
</div>
</#if>
</div>
</div>
</form>
@ -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>
<#if formType == "oa">
function initSubmitBtns() {
var btnColor = ['', 'layui-btn-normal', 'layui-btn-warm'];
var btns = '';
for(var i = 0, item; item = confirmAssignees[i++];) {
btns += '<button type="button" id="submitFormBtn'+ i +'" class="layui-btn layui-btn-sm '+ btnColor[(i - 1) % 3] +' confirm-btn" lay-submit lay-filter="submit'+ i +'" data-select-type="'+ item.nodeType +'" data-index="'+ (i - 1) +'" data-next-end-event="'+ item.nextEndEvent +'" data-btn-exc="'+ item.btnExc +'">'+ item.btnText +'</button>'
}
$('#submitBtnGroup').append(btns);
}
</#if>
// 初始化
function initData() {
@ -100,6 +123,11 @@
</#list>
form.render(null, 'dataForm');
<#if formType == "oa">
initSubmitBtns();
formUtil.hideFields(fields);
formUtil.disableFields(fields);
</#if>
}, 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(),
</#list>
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(),
</#list>
</#list>,
uid
]), formData.field, {
headers: {
token: token
@ -154,6 +261,7 @@
});
return false;
});
</#if>
});
</script>
</body>

View File

@ -24,10 +24,17 @@
</#list>
<div class="layui-form-item layui-layout-admin">
<div class="layui-input-block">
<#if formType == "oa">
<div class="layui-footer form-report-foot">
<div id="submitBtnGroup" class="layui-btn-group"></div>
<button type="button" class="layui-btn layui-btn-sm layui-btn-primary close">返回</button>
</div>
<#else>
<div class="layui-footer" style="left: 0;">
<button type="button" id="submitFormBtn" class="layui-btn" lay-submit lay-filter="submitForm">提交</button>
<button type="button" class="layui-btn layui-btn-primary close">返回</button>
</div>
</#if>
</div>
</div>
</form>
@ -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>
<#if formType == "oa">
function initSubmitBtns() {
var btnColor = ['', 'layui-btn-normal', 'layui-btn-warm'];
var btns = '';
for(var i = 0, item; item = confirmAssignees[i++];) {
btns += '<button type="button" id="submitFormBtn'+ i +'" class="layui-btn layui-btn-sm '+ btnColor[(i - 1) % 3] +' confirm-btn" lay-submit lay-filter="submit'+ i +'" data-select-type="'+ item.nodeType +'" data-index="'+ (i - 1) +'" data-next-end-event="'+ item.nextEndEvent +'" data-btn-exc="'+ item.btnExc +'">'+ item.btnText +'</button>'
}
$('#submitBtnGroup').append(btns);
}
</#if>
// 初始化
function initData() {
@ -75,6 +98,11 @@
});
</#if>
</#list>
<#if formType == "oa">
initSubmitBtns();
formUtil.hideFields(fields);
formUtil.disableFields(fields);
</#if>
}
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(),
</#list>
]), 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;
});
</#if>
});
</script>
</body>

View File

@ -24,9 +24,15 @@
</#list>
<div class="layui-form-item layui-layout-admin">
<div class="layui-input-block">
<#if formType == "oa">
<div class="layui-footer form-report-foot">
<button type="button" class="layui-btn layui-btn-sm layui-btn-primary close">返回</button>
</div>
<#else>
<div class="layui-footer" style="left: 0;">
<button type="button" class="layui-btn layui-btn-primary close">返回</button>
</div>
</#if>
</div>
</div>
</form>

View File

@ -24,10 +24,17 @@
</#list>
<div class="layui-form-item layui-layout-admin">
<div class="layui-input-block">
<#if formType == "oa">
<div class="layui-footer form-report-foot">
<div id="submitBtnGroup" class="layui-btn-group"></div>
<button type="button" class="layui-btn layui-btn-sm layui-btn-primary close">返回</button>
</div>
<#else>
<div class="layui-footer" style="left: 0;">
<button type="button" id="submitFormBtn" class="layui-btn" lay-submit lay-filter="submitForm">提交</button>
<button type="button" class="layui-btn layui-btn-primary close">返回</button>
</div>
</#if>
</div>
</div>
</form>
@ -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>
<#if formType == "oa">
function initSubmitBtns() {
var btnColor = ['', 'layui-btn-normal', 'layui-btn-warm'];
var btns = '';
for(var i = 0, item; item = confirmAssignees[i++];) {
btns += '<button type="button" id="submitFormBtn'+ i +'" class="layui-btn layui-btn-sm '+ btnColor[(i - 1) % 3] +' confirm-btn" lay-submit lay-filter="submit'+ i +'" data-select-type="'+ item.nodeType +'" data-index="'+ (i - 1) +'" data-next-end-event="'+ item.nextEndEvent +'" data-btn-exc="'+ item.btnExc +'">'+ item.btnText +'</button>'
}
$('#submitBtnGroup').append(btns);
}
</#if>
// 初始化
function initData() {
@ -95,6 +118,11 @@
</#list>
form.render(null, 'dataForm');
<#if formType == "oa">
initSubmitBtns();
formUtil.hideFields(fields);
formUtil.disableFields(fields);
</#if>
}, 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(),
</#list>
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(),
</#list>
uid
]), formData.field, null, function (code, data) {
// 这里手动添加操作成功后的操作',
}, function (code, data) {
@ -145,6 +249,7 @@
});
return false;
});
</#if>
});
</script>
</body>