diff --git a/.prettierignore b/.prettierignore index ca8cdec9..fd59638b 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,3 +1,4 @@ **/wangEditor/*.js **/nprogress/*.js **/assets/platform/plugins/** +**/views/*.js diff --git a/src/main/java/com/budwk/app/flow/controller/FlowCommonController.java b/src/main/java/com/budwk/app/flow/controller/FlowCommonController.java index 44464eff..1042d3d9 100644 --- a/src/main/java/com/budwk/app/flow/controller/FlowCommonController.java +++ b/src/main/java/com/budwk/app/flow/controller/FlowCommonController.java @@ -260,7 +260,6 @@ public class FlowCommonController { flowEngine.executeProcessTask(processTaskId, operator, args); } else if (ObjectUtil.equals(submitType, ProcessSubmitTypeEnum.RE_APPLY.getCode())) { // 重新提交 -// args.put(FlowConst.FORM_DATA, args.getStr(FlowConst.FORM_DATA)); flowEngine.executeProcessTask(processTaskId, operator, args); } else { // 默认执行 diff --git a/src/main/java/com/budwk/app/flow/engine/core/FlowEngineImpl.java b/src/main/java/com/budwk/app/flow/engine/core/FlowEngineImpl.java index a04a7213..324f0b74 100644 --- a/src/main/java/com/budwk/app/flow/engine/core/FlowEngineImpl.java +++ b/src/main/java/com/budwk/app/flow/engine/core/FlowEngineImpl.java @@ -89,6 +89,7 @@ public class FlowEngineImpl implements FlowEngine { } // 2. 将流程定义文件转成流程模型 ProcessModel processModel = processDefineService.processDefineToModel(processDefine); + // 3. 根据流程定义对象创建流程实例 ProcessInstance processInstance = processInstanceService.createProcessInstance(processDefine, businessKey, operator, args, parentId, parentNodeName); args.set(FlowConst.PROCESS_INSTANCE_ID_KEY, processInstance.getId()); diff --git a/src/main/java/com/budwk/app/flow/engine/handlers/impl/CountersignHandler.java b/src/main/java/com/budwk/app/flow/engine/handlers/impl/CountersignHandler.java index ee7a0b63..9b014e41 100644 --- a/src/main/java/com/budwk/app/flow/engine/handlers/impl/CountersignHandler.java +++ b/src/main/java/com/budwk/app/flow/engine/handlers/impl/CountersignHandler.java @@ -28,6 +28,7 @@ public class CountersignHandler implements IHandler { boolean isMerged = false; String countersignType = taskModel.getExt().get("countersignType","PARALLEL"); String countersignCompletionCondition = taskModel.getExt().get("countersignCompletionCondition",""); + countersignCompletionCondition = taskModel.getCountersignCompletionCondition(); String prefix = FlowConst.COUNTERSIGN_VARIABLE_PREFIX +taskModel.getName()+"_"; // 会签办理人列表 List operatorList = Convert.toList(String.class,execution.getArgs().get(prefix+FlowConst.COUNTERSIGN_OPERATOR_LIST)); diff --git a/src/main/java/com/budwk/app/flow/service/impl/ProcessInstanceServiceImpl.java b/src/main/java/com/budwk/app/flow/service/impl/ProcessInstanceServiceImpl.java index f00be8fd..cbb831c7 100644 --- a/src/main/java/com/budwk/app/flow/service/impl/ProcessInstanceServiceImpl.java +++ b/src/main/java/com/budwk/app/flow/service/impl/ProcessInstanceServiceImpl.java @@ -460,7 +460,7 @@ public class ProcessInstanceServiceImpl extends BaseServiceImpl addVariable.put(prefix + FlowConst.NR_OF_COMPLETED_INSTANCES, execution.getArgs().get(prefix + FlowConst.NR_OF_COMPLETED_INSTANCES)); // 更新会签操作人列表countersignOperatorList addVariable.put(prefix + FlowConst.COUNTERSIGN_OPERATOR_LIST, taskActors); - ProcessInstanceService processInstanceService = SpringUtil.getBean(ProcessInstanceService.class); + ProcessInstanceService processInstanceService = ServiceContext.find(ProcessInstanceService.class); processInstanceService.addVariable(processInstanceId, addVariable); } diff --git a/src/main/java/com/budwk/app/flow/service/impl/ProcessTaskServiceImpl.java b/src/main/java/com/budwk/app/flow/service/impl/ProcessTaskServiceImpl.java index 036b9807..6a37cc3c 100644 --- a/src/main/java/com/budwk/app/flow/service/impl/ProcessTaskServiceImpl.java +++ b/src/main/java/com/budwk/app/flow/service/impl/ProcessTaskServiceImpl.java @@ -7,7 +7,6 @@ import cn.hutool.core.lang.Dict; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.StrUtil; -import cn.hutool.extra.spring.SpringUtil; import cn.hutool.json.JSONUtil; import com.budwk.app.base.exception.BaseException; import com.budwk.app.base.service.impl.BaseServiceImpl; @@ -15,6 +14,7 @@ import com.budwk.app.base.vo.LabelValueVO; import com.budwk.app.flow.constant.FlowConst; import com.budwk.app.flow.engine.AssignmentHandler; import com.budwk.app.flow.engine.core.Execution; +import com.budwk.app.flow.engine.core.ServiceContext; import com.budwk.app.flow.engine.event.ProcessEvent; import com.budwk.app.flow.engine.event.ProcessPublisher; import com.budwk.app.flow.engine.model.CustomModel; @@ -179,13 +179,10 @@ public class ProcessTaskServiceImpl extends BaseServiceImpl impleme // 增加是否为第一个任务节点标识 execution.getArgs().put(FlowConst.IS_FIRST_TASK_NODE, FlowUtil.isFistTaskName(execution.getProcessModel(), taskModel.getName())); //过滤上个任务的表单数据 避免造成污染 每个任务只保存自己的表单数据 - Dict cleanArgs = Dict.create(); - execution.getArgs().forEach((k, v) -> { - if (!k.startsWith(FlowConst.TASK_FORM_DATA_PREFIX)) { - cleanArgs.set(k, v); - } - }); - execution.setArgs(cleanArgs); + List removeKeys = execution.getArgs().keySet().stream().filter(k -> k.startsWith(FlowConst.TASK_FORM_DATA_PREFIX) || k.equals(FlowConst.SUBMIT_TYPE) || k.startsWith(FlowConst.COUNTERSIGN_VARIABLE_PREFIX)).toList(); + for (String key : removeKeys) { + execution.getArgs().remove(key); + } processTask.setVariable(JSONUtil.toJsonStr(execution.getArgs())); processTask.setCreatedAt(now); @@ -367,6 +364,7 @@ public class ProcessTaskServiceImpl extends BaseServiceImpl impleme } @Override + @Aop(TransAop.READ_COMMITTED) public List createCountersignTask(TaskModel taskModel, Execution execution) { List processTaskList = new ArrayList<>(); List taskActors = getTaskActors(taskModel, execution); @@ -399,7 +397,15 @@ public class ProcessTaskServiceImpl extends BaseServiceImpl impleme processTask.setTaskState(ProcessTaskStateEnum.DOING.getCode()); processTask.setTaskType(taskModel.getTaskType().getCode()); processTask.setProcessInstanceId(execution.getProcessInstanceId()); + + // 增加是否为第一个任务节点标识 execution.getArgs().put(FlowConst.IS_FIRST_TASK_NODE, FlowUtil.isFistTaskName(execution.getProcessModel(), taskModel.getName())); + //过滤上个任务的表单数据 避免造成污染 每个任务只保存自己的表单数据 + List removeKeys = execution.getArgs().keySet().stream().filter(k -> k.startsWith(FlowConst.TASK_FORM_DATA_PREFIX) || k.equals(FlowConst.SUBMIT_TYPE) || k.startsWith(FlowConst.COUNTERSIGN_VARIABLE_PREFIX)).toList(); + for (String key : removeKeys) { + execution.getArgs().remove(key); + } + processTask.setVariable(JSONUtil.toJsonStr(execution.getArgs())); processTask.setCreatedAt(now); processTask.setUpdatedAt(now); @@ -414,7 +420,7 @@ public class ProcessTaskServiceImpl extends BaseServiceImpl impleme processTaskList.add(processTask); addTaskActor(processTask.getId(), CollectionUtil.newArrayList(taskActor)); }); - ProcessInstanceService processInstanceService = SpringUtil.getBean(ProcessInstanceService.class); + ProcessInstanceService processInstanceService = ServiceContext.find(ProcessInstanceService.class); // 更新会签变量到流程实例参数中 processInstanceService.updateCountersignVariable(taskModel, execution, taskActors); return processTaskList; diff --git a/src/main/java/com/budwk/app/snakerflow/SnakerHelper.java b/src/main/java/com/budwk/app/snakerflow/SnakerHelper.java deleted file mode 100644 index d2ae5f60..00000000 --- a/src/main/java/com/budwk/app/snakerflow/SnakerHelper.java +++ /dev/null @@ -1,247 +0,0 @@ -//package com.budwk.app.snakerflow; -// -//import cn.hutool.core.util.StrUtil; -//import org.apache.commons.beanutils.BeanUtils; -//import org.apache.commons.beanutils.PropertyUtils; -//import org.snaker.engine.entity.*; -//import org.snaker.engine.model.*; -// -//import java.beans.PropertyDescriptor; -//import java.util.ArrayList; -//import java.util.HashMap; -//import java.util.List; -//import java.util.Map; -// -//public class SnakerHelper { -// -// private static final Map, String> mapper = new HashMap, String>(); -// -// static { -// mapper.put(TaskModel.class, "task"); -// mapper.put(CustomModel.class, "custom"); -// mapper.put(DecisionModel.class, "decision"); -// mapper.put(EndModel.class, "end"); -// mapper.put(ForkModel.class, "fork"); -// mapper.put(JoinModel.class, "join"); -// mapper.put(StartModel.class, "start"); -// mapper.put(SubProcessModel.class, "subprocess"); -// } -// -// public static String getStateJson(ProcessModel model, List activeTasks, List historyTasks) { -// StringBuffer buffer = new StringBuffer(); -// buffer.append("{'activeRects':{'rects':["); -// if (activeTasks != null && activeTasks.size() > 0) { -// for (Task task : activeTasks) { -// buffer.append("{'paths':[],'name':'"); -// buffer.append(task.getTaskName()); -// buffer.append("'},"); -// } -// buffer.deleteCharAt(buffer.length() - 1); -// } -// buffer.append("]}, 'historyRects':{'rects':["); -// if (historyTasks != null && historyTasks.size() > 0) { -// for (HistoryTask historyTask : historyTasks) { -// NodeModel parentModel = model.getNode(historyTask.getTaskName()); -// if (parentModel == null) continue; -// buffer.append("{'name':'").append(parentModel.getName()).append("','paths':["); -// buffer.append("]},"); -// } -// buffer.deleteCharAt(buffer.length() - 1); -// } -// buffer.append("]}}"); -// return buffer.toString(); -// } -// -// public static String getModelJson(ProcessModel model) { -// StringBuffer buffer = new StringBuffer(); -// List tms = new ArrayList(); -// for (NodeModel node : model.getNodes()) { -// for (TransitionModel tm : node.getOutputs()) { -// tms.add(tm); -// } -// } -// buffer.append("{"); -// buffer.append(getNodeJson(model.getNodes())); -// buffer.append(getPathJson(tms)); -// buffer.append("props:{props:{name:{name:'name',value:'"); -// buffer.append(convert(model.getName())); -// buffer.append("'},displayName:{name:'displayName',value:'"); -// buffer.append(convert(model.getDisplayName())); -// buffer.append("'},expireTime:{name:'expireTime',value:'"); -// buffer.append(convert(model.getExpireTime())); -// buffer.append("'},instanceUrl:{name:'instanceUrl',value:'"); -// buffer.append(convert(model.getInstanceUrl())); -// buffer.append("'},instanceNoClass:{name:'instanceNoClass',value:'"); -// buffer.append(convert(model.getInstanceNoClass())); -// buffer.append("'}}}}"); -// return buffer.toString(); -// } -// -// public static String getNodeJson(List nodes) { -// StringBuffer buffer = new StringBuffer(); -// buffer.append("states: {"); -// for (NodeModel node : nodes) { -// buffer.append(node.getName()); -// buffer.append(getBase(node)); -// buffer.append(getLayout(node)); -// buffer.append(getProperty(node)); -// buffer.append(","); -// } -// buffer.deleteCharAt(buffer.length() - 1); -// buffer.append("},"); -// return buffer.toString(); -// } -// -// public static String getPathJson(List tms) { -// StringBuffer buffer = new StringBuffer(); -// buffer.append("paths:{"); -// for (TransitionModel tm : tms) { -// buffer.append(tm.getName()); -// buffer.append(":{from:'"); -// buffer.append(tm.getSource().getName()); -// buffer.append("',to:'"); -// buffer.append(tm.getTarget().getName()); -// buffer.append("', dots:["); -// if (StrUtil.isNotEmpty(tm.getG())) { -// String[] bendpoints = tm.getG().split(";"); -// for (String bendpoint : bendpoints) { -// buffer.append("{"); -// String[] xy = bendpoint.split(","); -// buffer.append("x:").append(getNumber(xy[0])); -// buffer.append(",y:").append(xy[1]); -// buffer.append("},"); -// } -// buffer.deleteCharAt(buffer.length() - 1); -// } -// buffer.append("],text:{text:'"); -// buffer.append(tm.getDisplayName()); -// buffer.append("'},textPos:{"); -// if (StrUtil.isNotEmpty(tm.getOffset())) { -// String[] values = tm.getOffset().split(","); -// buffer.append("x:").append(values[0]).append(","); -// buffer.append("y:").append(values[1]); -// } -// buffer.append("}, props:{name:{value:'" + tm.getName() + "'},expr:{value:'" + tm.getExpr() + "'}}}"); -// buffer.append(","); -// } -// buffer.deleteCharAt(buffer.length() - 1); -// buffer.append("},"); -// return buffer.toString(); -// } -// -// private static String getBase(NodeModel node) { -// String buffer = ":{type:'" + -// mapper.get(node.getClass()) + -// "',text:{text:'" + -// node.getDisplayName() + -// "'},"; -// return buffer; -// } -// -// private static String getProperty(NodeModel node) { -// StringBuffer buffer = new StringBuffer(); -// buffer.append("props:{"); -// try { -// PropertyDescriptor[] beanProperties = PropertyUtils.getPropertyDescriptors(node); -// for (PropertyDescriptor propertyDescriptor : beanProperties) { -// if (propertyDescriptor.getReadMethod() == null || propertyDescriptor.getWriteMethod() == null) -// continue; -// String name = propertyDescriptor.getName(); -// String value = ""; -// if (propertyDescriptor.getPropertyType() == String.class) { -// value = BeanUtils.getProperty(node, name); -// } else { -// continue; -// } -// if (value == null || value.equals("")) continue; -// buffer.append(name); -// buffer.append(":{value:'"); -// buffer.append(convert(value)); -// buffer.append("'},"); -// } -// } catch (Exception e) { -// e.printStackTrace(); -// } -// buffer.deleteCharAt(buffer.length() - 1); -// buffer.append("}}"); -// return buffer.toString(); -// } -// -// private static String getLayout(NodeModel node) { -// StringBuffer buffer = new StringBuffer(); -// buffer.append("attr:{"); -// String[] values = node.getLayout().split(","); -// buffer.append("x:").append(getNumber(values[0])).append(","); -// buffer.append("y:").append(values[1]).append(","); -// if ("-1".equals(values[2])) { -// if (node instanceof TaskModel || node instanceof CustomModel || node instanceof SubProcessModel) { -// values[2] = "100"; -// } else { -// values[2] = "50"; -// } -// } -// if ("-1".equals(values[3])) { -// values[3] = "50"; -// } -// buffer.append("width:").append(values[2]).append(","); -// buffer.append("height:").append(values[3]); -// buffer.append("},"); -// return buffer.toString(); -// } -// -// private static String convert(String value) { -// if (StrUtil.isEmpty(value)) -// return ""; -// if (value.indexOf("'") != -1) { -// value = value.replaceAll("'", "#1"); -// } -// if (value.indexOf("\"") != -1) { -// value = value.replaceAll("\"", "#2"); -// } -// if (value.indexOf("\r\n") != -1) { -// value = value.replaceAll("\r\n", "#3"); -// } -// if (value.indexOf("\n") != -1) { -// value = value.replaceAll("\n", "#4"); -// } -// if (value.indexOf(">") != -1) { -// value = value.replaceAll(">", "#5"); -// } -// if (value.indexOf("<") != -1) { -// value = value.replaceAll("<", "#6"); -// } -// if (value.indexOf("&") != -1) { -// value = value.replaceAll("&", "#7"); -// } -// return value; -// } -// -// public static String convertXml(String value) { -// if (value.indexOf("#1") != -1) { -// value = value.replaceAll("#1", "'"); -// } -// if (value.indexOf("#2") != -1) { -// value = value.replaceAll("#2", "\""); -// } -// if (value.indexOf("#5") != -1) { -// value = value.replaceAll("#5", ">"); -// } -// if (value.indexOf("#6") != -1) { -// value = value.replaceAll("#6", "<"); -// } -// if (value.indexOf("&") != -1) { -// value = value.replaceAll("#7", "&"); -// } -// return value; -// } -// -// private static int getNumber(String value) { -// if (value == null) return 0; -// try { -// return Integer.parseInt(value) + 180; -// } catch (Exception e) { -// return 0; -// } -// } -// -//} diff --git a/src/main/java/com/budwk/app/snakerflow/config/SnakerEngineConfig.java b/src/main/java/com/budwk/app/snakerflow/config/SnakerEngineConfig.java deleted file mode 100644 index 6056e355..00000000 --- a/src/main/java/com/budwk/app/snakerflow/config/SnakerEngineConfig.java +++ /dev/null @@ -1,41 +0,0 @@ -//package com.budwk.app.snakerflow.config; -// -//import org.nutz.ioc.loader.annotation.Inject; -//import org.nutz.ioc.loader.annotation.IocBean; -//import org.nutz.lang.Mirror; -//import org.snaker.engine.SnakerEngine; -//import org.snaker.engine.cfg.Configuration; -//import org.snaker.engine.core.SnakerEngineImpl; -//import org.snaker.engine.impl.JuelExpression; -//import org.snaker.engine.impl.SimpleContext; -//import org.snaker.nutz.access.NutzAccess; -//import org.snaker.nutz.access.NutzTransactionInterceptor; -// -//import javax.sql.DataSource; -// -//@IocBean -//public class SnakerEngineConfig { -// -// @Inject -// private DataSource dataSource; -// -// @IocBean -// public SnakerEngine snakerEngine() { -// SimpleContext ctx = new SimpleContext(); -// ctx.put(NutzAccess.class.getName(), NutzAccess.class); -// ctx.put(JuelExpression.class.getName(), JuelExpression.class); -// -//// ctx.put(NutzTransactionInterceptor.class.getName(), NutzTransactionInterceptor.class); -// -// // 初始化配置 -// Configuration configuration = new Configuration(ctx); -// -//// Mirror.me(configuration).setValue(configuration, "interceptor", ctx.find(NutzTransactionInterceptor.class)); -// configuration.initAccessDBObject(dataSource); -// -// -// SnakerEngine engine = configuration.buildSnakerEngine(); -// return engine; -// } -// -//} diff --git a/src/main/java/com/budwk/app/snakerflow/config/SnakerExpression.java b/src/main/java/com/budwk/app/snakerflow/config/SnakerExpression.java deleted file mode 100644 index f11a8e50..00000000 --- a/src/main/java/com/budwk/app/snakerflow/config/SnakerExpression.java +++ /dev/null @@ -1,16 +0,0 @@ -//package com.budwk.app.snakerflow.config; -// -//import cn.hutool.extra.expression.ExpressionUtil; -//import org.snaker.engine.Expression; -// -//import java.util.Map; -// -//public class SnakerExpression implements Expression { -// @Override -// public T eval(Class T, String expr, Map args) { -// -// Object eval = ExpressionUtil.eval(expr, args); -// -// return null; -// } -//} diff --git a/src/main/java/com/budwk/app/snakerflow/controller/SankerFlowDefineController.java b/src/main/java/com/budwk/app/snakerflow/controller/SankerFlowDefineController.java deleted file mode 100644 index 2086d921..00000000 --- a/src/main/java/com/budwk/app/snakerflow/controller/SankerFlowDefineController.java +++ /dev/null @@ -1,357 +0,0 @@ -//package com.budwk.app.snakerflow.controller; -// -//import cn.dev33.satoken.annotation.SaCheckLogin; -//import cn.hutool.core.util.StrUtil; -//import cn.hutool.json.JSONObject; -//import com.budwk.app.base.page.Pagination; -//import com.budwk.app.base.result.Result; -//import com.budwk.app.snakerflow.SnakerHelper; -//import io.swagger.annotations.ApiOperation; -//import lombok.extern.slf4j.Slf4j; -//import org.nutz.aop.interceptor.ioc.TransAop; -//import org.nutz.dao.Dao; -//import org.nutz.dao.Sqls; -//import org.nutz.dao.sql.Sql; -//import org.nutz.ioc.aop.Aop; -//import org.nutz.ioc.loader.annotation.Inject; -//import org.nutz.ioc.loader.annotation.IocBean; -//import org.nutz.lang.util.NutMap; -//import org.nutz.mvc.annotation.At; -//import org.nutz.mvc.annotation.Ok; -//import org.nutz.mvc.annotation.Param; -//import org.snaker.engine.SnakerEngine; -//import org.snaker.engine.access.Page; -//import org.snaker.engine.access.QueryFilter; -//import org.snaker.engine.entity.HistoryTask; -//import org.snaker.engine.entity.Order; -//import org.snaker.engine.entity.Process; -//import org.snaker.engine.entity.Task; -//import org.snaker.engine.helper.AssertHelper; -//import org.snaker.engine.helper.StreamHelper; -//import org.snaker.engine.model.ProcessModel; -//import org.snaker.engine.model.TaskModel; -//import org.snaker.engine.model.TransitionModel; -// -//import javax.servlet.http.HttpServletRequest; -//import java.io.IOException; -//import java.io.InputStream; -//import java.nio.charset.StandardCharsets; -//import java.util.*; -// -//import static org.snaker.engine.access.QueryFilter.DESC; -// -//@IocBean -//@At("/flow/define") -//@Ok("json:full") -//@Slf4j -//public class SankerFlowDefineController { -// -// @Inject -// private SnakerEngine snakerEngine; -// @Inject -// private Dao dao; -// -// @At("") -// @Ok("beetl:/platform/flow/definition/index.html") -// @SaCheckLogin -// public void index() { -// } -// -// @At("/designer") -// @Ok("beetl:/platform/flow/definition/designer.html") -// @SaCheckLogin -// public void designer(HttpServletRequest request) { -// request.setAttribute("processId", request.getParameter("processId")); -// } -// -// @At("/designer2") -// @Ok("beetl:/platform/flow/designer.html") -// @SaCheckLogin -// public void designer2(HttpServletRequest request) { -// request.setAttribute("processId", request.getParameter("processId")); -// } -// -// -// @At("/diagram") -// @Ok("beetl:/platform/flow/diagram.html") -// @SaCheckLogin -// public void diagram(HttpServletRequest request) { -// request.setAttribute("processId", request.getParameter("processId")); -// request.setAttribute("orderId", request.getParameter("orderId")); -// } -// -// -// @At -// @SaCheckLogin -// @ApiOperation("获取流程定义分页列表") -// public Result pageData(Integer pageNumber, Integer pageSize, String displayName, String name) { -// QueryFilter filter = new QueryFilter(); -// if (StrUtil.isNotEmpty(displayName)) { -// filter.setDisplayName(displayName); -// } -// if (StrUtil.isNotEmpty(name)) { -// filter.setName(name); -// } -// filter.orderBy("create_Time").order(DESC); -// Page page = new Page<>(); -// page.setPageNo(pageNumber); -// page.setPageSize(pageSize); -// snakerEngine.process().getProcesss(page, filter); -// List result = page.getResult(); -// Pagination pagination = new Pagination<>(pageNumber, pageSize, (int) page.getTotalCount(), result); -// return Result.success(pagination); -// } -// -// -// @At -// @SaCheckLogin -// @ApiOperation("新增流程定义") -// public Result insert(){ -// -// return null; -// } -// -// -// -// -// -// @At -// @SaCheckLogin -// @ApiOperation("保存流程定义") -// @Aop(TransAop.READ_COMMITTED) -// public Result saveProcessXml(String model, String id, boolean xmlHeader) { -// InputStream input = null; -// try { -// String xml = ""; -// if (!xmlHeader) { -// xml = "\n"; -// } -// xml = xml + SnakerHelper.convertXml(model); -// input = StreamHelper.getStreamFromString(xml); -// if (StrUtil.isNotEmpty(id) && !id.equals("undefined")) { -// snakerEngine.process().redeploy(id, input); -// } else { -// snakerEngine.process().deploy(input); -// } -// } catch (Exception e) { -// log.error("", e); -// return Result.error("保存失败:" + e.getMessage()); -// } finally { -// if (input != null) { -// try { -// input.close(); -// } catch (IOException ignored) { -// } -// } -// } -// return Result.success(); -// } -// -// @At("/getXml") -// @SaCheckLogin -// @ApiOperation("获取流程定义") -// public Result getProcessXml(String id) { -// Process process = snakerEngine.process().getProcessById(id); -// if (process != null) { -// byte[] bytes = process.getDBContent(); -// return Result.success().addData(new String(bytes, StandardCharsets.UTF_8)); -// } -// return Result.success(); -// } -// -// @At("/process/modelJson") -// @ApiOperation(value = "根据流程定义名称获取流程定义json", tags = "流程引擎-流程") -// @SaCheckLogin -// public Result getProcessJson(String processId) { -// if (StrUtil.isBlank(processId)) { -// return Result.success(); -// } -// Process process = snakerEngine.process().getProcessById(processId); -// if (Objects.isNull(process)) { -// return Result.success(); -// } -// ProcessModel processModel = process.getModel(); -// if (Objects.isNull(processModel)) { -// return Result.success(); -// } -// String modelJson = SnakerHelper.getModelJson(processModel); -// return Result.success().addData(modelJson); -// } -// -// @At("/process/json") -// @SaCheckLogin -// @ApiOperation(value = "流程定义+流程状态") -// public Result getProcessStateJson(String processId, String orderId) { -// if (StrUtil.isBlank(processId)) { -// processId = snakerEngine.query().getHistOrder(orderId).getProcessId(); -// } -// Process process = snakerEngine.process().getProcessById(processId); -// AssertHelper.notNull(process); -// ProcessModel model = process.getModel(); -// Map jsonMap = new HashMap<>(); -// if (model != null) { -// String modelJson = SnakerHelper.getModelJson(model); -// jsonMap.put("process", SnakerHelper.getModelJson(model)); -// } -// -// if (StrUtil.isNotEmpty(orderId)) { -// List tasks = snakerEngine.query().getActiveTasks(new QueryFilter().setOrderId(orderId)); -// List historyTasks = snakerEngine.query().getHistoryTasks(new QueryFilter().setOrderId(orderId)); -// jsonMap.put("state", SnakerHelper.getStateJson(model, tasks, historyTasks)); -// } -// return Result.success(jsonMap); -// } -// -// -// @At -// @SaCheckLogin -// @ApiOperation("取消部署") -// public Result undeploy(String id) { -// snakerEngine.process().undeploy(id); -// return Result.success(); -// } -// -// @At -// @SaCheckLogin -// @ApiOperation("发布流程") -// public Result publish(String id) { -// InputStream inputStream = null; -// try { -// Process process = snakerEngine.process().getProcessById(id); -// byte[] bytes = process.getDBContent(); -// String xml = new String(bytes, StandardCharsets.UTF_8); -// inputStream = StreamHelper.getStreamFromString(xml); -// snakerEngine.process().redeploy(id, inputStream); -// return Result.success(); -// } catch (Exception e) { -// return Result.error("发布失败:" + e.getMessage()); -// } finally { -// if (inputStream != null) { -// try { -// inputStream.close(); -// } catch (IOException ignored) { -// } -// } -// } -// } -// -// @At -// @SaCheckLogin -// @ApiOperation("删除流程定义") -// public Result delete(String id) { -// snakerEngine.process().cascadeRemove(id); -// return Result.success(); -// } -// -// -// @At -// @SaCheckLogin -// @ApiOperation("获取流程定义+流程状态") -// public Object getProcessJson(String processId, String orderId) { -// if (StrUtil.isBlank(processId)) { -// processId = snakerEngine.query().getHistOrder(orderId).getProcessId(); -// } -// Process process = snakerEngine.process().getProcessById(processId); -// AssertHelper.notNull(process); -// ProcessModel model = process.getModel(); -// Map jsonMap = new HashMap<>(); -// if (model != null) { -// jsonMap.put("process", SnakerHelper.getModelJson(model)); -// } -// -// if (StrUtil.isNotEmpty(orderId)) { -// List tasks = snakerEngine.query().getActiveTasks(new QueryFilter().setOrderId(orderId)); -// List historyTasks = snakerEngine.query().getHistoryTasks(new QueryFilter().setOrderId(orderId)); -// jsonMap.put("state", SnakerHelper.getStateJson(model, tasks, historyTasks)); -// } -// return jsonMap; -// } -// -// -// @At(value = "/flow/task/tip", top = true) -// @SaCheckLogin -// public Result taskTip(String orderId, String taskName) { -// List tasks = snakerEngine.query().getActiveTasks(new QueryFilter().setOrderId(orderId)); -// StringBuilder builder = new StringBuilder(); -// String createTime = StrUtil.EMPTY; -// String finishTime = StrUtil.EMPTY; -// boolean find = false; -// for (Task task : tasks) { -// if (task.getTaskName().equalsIgnoreCase(taskName)) { -// String[] actors = snakerEngine.query().getTaskActorsByTaskId(task.getId()); -// for (String actor : actors) { -//// SysUser sysUser = sysUserService.getById(Long.valueOf(actor)); -//// String nickName = sysUser.getNickName(); -//// builder.append(nickName).append(","); -// builder.append(actor); -// find = true; -// } -// createTime = task.getCreateTime(); -// } -// } -// if (!find) { -// List historyTasks = snakerEngine.query().getHistoryTasks(new QueryFilter().setOrderId(orderId)); -// for (HistoryTask task : historyTasks) { -// if (task.getTaskName().equalsIgnoreCase(taskName)) { -// String[] actors = snakerEngine.query().getHistoryTaskActorsByTaskId(task.getId()); -// for (String actor : actors) { -//// SysUser sysUser = sysUserService.getById(Long.valueOf(actor)); -//// String nickName = sysUser.getNickName(); -//// builder.append(nickName).append(","); -// builder.append(actor); -// } -// createTime = task.getCreateTime(); -// finishTime = task.getFinishTime(); -// } -// } -// } -// if (!builder.isEmpty()) { -// builder.deleteCharAt(builder.length() - 1); -// } -// Map data = new HashMap<>(); -// data.put("actors", builder.toString()); -// data.put("createTime", createTime); -// data.put("finishTime", finishTime); -// return Result.success(data); -// } -// -// @At(value = "/flow/instance/info", top = true) -// @SaCheckLogin -// @ApiOperation("流程实例信息") -// public Result instanceStatus(@Param("instanceId") String instanceId) { -// Sql sql = Sqls.create(""" -// SELECT -// o.order_State AS orderState, -// p.display_Name AS processName, -// concat(t.display_Name) AS currentTaskName\s -// FROM -// wf_hist_order o -// LEFT JOIN wf_process p ON p.id = o.process_Id -// LEFT JOIN wf_task t ON t.order_Id = o.id -// WHERE o.id = @instanceId -// """); -// sql.setParam("instanceId", instanceId); -// sql.setCallback(Sqls.callback.map()); -// dao.execute(sql); -// NutMap result = (NutMap) sql.getResult(); -// return Result.success(result); -// } -// -// @At(value = "/flow/task/info", top = true) -// @SaCheckLogin -// @ApiOperation("任务信息") -// public Result taskInfo(@Param("taskId") String taskId) { -// Task task = snakerEngine.query().getTask(taskId); -// return Result.success(task); -// } -// -// @At(value = "/flow/task/next", top = true) -// @ApiOperation("获取可执行的流向任务") -// @SaCheckLogin -// public Result taskNext(@Param("taskId") String taskId) { -// -// return Result.success(); -// } -// -// -//} diff --git a/src/main/java/com/budwk/app/snakerflow/controller/SnakerFlowCommonController.java b/src/main/java/com/budwk/app/snakerflow/controller/SnakerFlowCommonController.java deleted file mode 100644 index 86f1fed2..00000000 --- a/src/main/java/com/budwk/app/snakerflow/controller/SnakerFlowCommonController.java +++ /dev/null @@ -1,19 +0,0 @@ -//package com.budwk.app.snakerflow.controller; -// -//import cn.dev33.satoken.annotation.SaCheckLogin; -//import io.swagger.annotations.ApiOperation; -//import org.nutz.mvc.annotation.At; -//import org.nutz.mvc.annotation.Ok; -// -//@At("/flow/common") -//public class SnakerFlowCommonController { -// -// @ApiOperation("通用审批页面") -// @At("/approval") -// @SaCheckLogin -// @Ok("beetl:/platform/flow/approval.html") -// public void approval() { -// -// } -// -//} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalApplyControllerX.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalApplyControllerX.java new file mode 100644 index 00000000..cd7fc5ac --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalApplyControllerX.java @@ -0,0 +1,108 @@ +package com.budwk.app.zhgh.democratic.proposal.controller.transact; + +import cn.dev33.satoken.annotation.SaCheckLogin; +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.result.Result; +import com.budwk.app.flow.engine.FlowEngine; +import com.budwk.app.web.commons.auth.utils.SecurityUtil; +import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo; +import com.budwk.app.zhgh.democratic.proposal.service.ProposalWriteService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.nutz.aop.interceptor.ioc.TransAop; +import org.nutz.dao.Cnd; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; +import org.nutz.ioc.aop.Aop; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.util.NutMap; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; + +@IocBean +@At("/platform/proposal/apply") +@Ok("json:full") +@Api("撰写提案") +public class ProposalApplyControllerX { + + @Inject + private FlowEngine flowEngine; + @Inject + private ProposalWriteService proposalWriteService; + + @At("/index") + @Ok("beetl:/platform/zhgh/democratic/proposal/transact/apply/index.html") + @SaCheckLogin + public void index() { + + } + + @At("/form") + @Ok("beetl:/platform/zhgh/democratic/proposal/transact/apply/form.html") + @SaCheckLogin + public void form() { + } + + @At + @SaCheckLogin + public Result pageData(Integer pageNumber, Integer pageSize) { + Sql sql = Sqls.create(""" + SELECT + info.*, + type.name AS typeName, + tcs.fullName AS sessionName, + tcd.`name` AS delegationName, + ins.id AS instanceId, + ins.businessNo, + ins.state instanceState, + ins.variable instanceVariable, + t.id taskId, + t.taskName AS taskKey, + t.displayName taskName, + t.taskType, + t.performType taskPerformType, + t.taskState, + t.finishTime, + t.taskParentId, + t.variable taskVariale, + IF((SELECT taskName FROM wf_process_task tt WHERE tt.id = t.taskParentId) = 'startTask', 1, 0) canRevoke, + (select MAX(id) from wf_process_task where processInstanceId = ins.id and taskName = 'startTask') AS startTaskId + FROM + proposal_info info + LEFT JOIN proposal_type type on type.id = info.typeId + LEFT JOIN teacher_congress_session tcs on tcs.id = info.sessionId + LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId + LEFT JOIN `wf_process_instance` ins ON ins.businessNo = info.id + LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10 + LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id + $condition + """); + Cnd cnd = Cnd.NEW(); + cnd.and("info.createdBy", "=", SecurityUtil.getUserId()); + cnd.desc("info.createdAt"); + sql.setCondition(cnd); + Pagination pagination = proposalWriteService.listPageMap(pageNumber, pageSize, sql); + return Result.success(pagination); + } + + @At + @SaCheckLogin + public Result info(String id) { + ProposalInfo info = proposalWriteService.fetch(id); + return Result.success(info); + } + + + @At + @SaCheckLogin + @Aop(TransAop.READ_COMMITTED) + @ApiOperation("删除") + public Result delete(@Param("id") String id) { + proposalWriteService.delete(id); + flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(id); + return Result.success(); + } + +} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalDelegationController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalDelegationController.java index dae7a0cf..a1ab046a 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalDelegationController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalDelegationController.java @@ -1,14 +1,18 @@ package com.budwk.app.zhgh.democratic.proposal.controller.transact; +import cn.dev33.satoken.annotation.SaCheckLogin; import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.StrUtil; import com.budwk.app.base.annotation.SLog; import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.page.Pagination; import com.budwk.app.base.result.Result; import com.budwk.app.base.service.BaseService; +import com.budwk.app.base.utils.PageUtil; import com.budwk.app.bpm.enums.BpmProcessTaskStatusEnum; import com.budwk.app.bpm.param.BpmTaskApprovalParam; import com.budwk.app.bpm.service.BpmService; +import com.budwk.app.flow.enums.ProcessTaskStateEnum; import com.budwk.app.web.commons.auth.utils.AuthUtil; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.zhgh.democratic.proposal.controller.vo.ProposalInfoPageVO; @@ -26,11 +30,13 @@ import org.nutz.dao.util.cri.Static; import org.nutz.ioc.aop.Aop; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.util.NutMap; import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; import org.nutz.mvc.annotation.Param; import javax.validation.Valid; +import java.util.List; /** * 团长审核 @@ -42,99 +48,78 @@ import javax.validation.Valid; @Api(tags = "提案-办理-团长审核") public class ProposalDelegationController { - @Inject - private BaseService baseService; @Inject private ProposalCommonService proposalCommonService; - @Inject - private ProposalDelegationService proposalDelegationService; - @Inject - private BpmService bpmService; - @At("") + @At("/index") @Ok("beetl:/platform/zhgh/democratic/proposal/transact/delegation/index.html") - @SaCheckPermission("proposal.delegation") + @SaCheckLogin public void index() { + + } + + @At("/form") + @Ok("beetl:/platform/zhgh/democratic/proposal/transact/delegation/form.html") + @SaCheckLogin + public void form() { } @At - @SaCheckPermission("proposal.delegation") - @ApiOperation("分页列表") - public Result pageData(@Valid ProposalSearchParam pageForm,boolean approval) { + @SaCheckPermission("proposal.seconded") + @SaCheckLogin + public Result pageData(@Valid ProposalSearchParam pageForm, boolean approval) { Sql sql = Sqls.create(""" - SELECT - info.*, - type.name AS typeName, - tcs.fullName AS sessionName, - tcd.`name` AS delegationName, - inst.id processInstanceId, - inst.processInstanceNodeId, - inst.processInstanceNodeName, - inst.processInstanceTaskIds, - inst.processInstanceStatus, - task.id processInstanceTaskId, - task.taskStatus processInstanceTaskStatus, - EXISTS ( - SELECT 1 - FROM bpm_process_task next_task - WHERE next_task.prevTaskId = task.id - AND next_task.taskStatus = 'COMPLETE' - ) AS nextTaskIsComplete + SELECT + info.*, + type.name AS typeName, + tcs.fullName AS sessionName, + tcd.`name` AS delegationName, + ins.id AS instanceId, + ins.businessNo, + ins.state instanceState, + ins.variable instanceVariale, + t.id taskId, + t.taskName AS taskKey, + t.displayName taskName, + t.taskType, + t.performType taskPerformType, + t.taskState, + t.finishTime, + t.taskParentId, + t.variable taskVariable, + IFNULL(GROUP_CONCAT(DISTINCT nt.displayName),'结束') curTaskName, + IF(rt.id IS NOT NULL, 1, 0) AS canRevoke FROM - bpm_process_task task - INNER JOIN bpm_process_node_define nd ON nd.id = task.processTaskNodeId - INNER JOIN bpm_process_instance inst ON inst.id = task.processInstanceId - INNER JOIN proposal_info info ON info.id = inst.processInstanceBusinessId - LEFT JOIN proposal_type type on type.id = info.typeId - LEFT JOIN teacher_congress_session tcs ON tcs.id = info.sessionId - LEFT JOIN teacher_congress_delegation tcd ON tcd.id = info.delegationId + wf_process_task t + LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId + LEFT JOIN proposal_info info ON info.id = ins.businessNo + LEFT JOIN proposal_type type on type.id = info.typeId + LEFT JOIN teacher_congress_session tcs on tcs.id = info.sessionId + LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId + LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id + LEFT JOIN wf_process_task nt ON nt.processInstanceId = ins.id AND nt.taskState = 10 + LEFT JOIN wf_process_task rt ON rt.processInstanceId = ins.id AND rt.taskParentId = t.id AND rt.taskState = 10 $condition """); Cnd cnd = Cnd.NEW(); - if(!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())){ - cnd.and(new Static("JSON_CONTAINS( task.assignments, '\"%s\"' )".formatted(SecurityUtil.getUserLoginname()))); - } - cnd.and("nd.nodeCode", "=", 30); + cnd.and("t.taskName", "=", "93d5ba64-8220-4e62-9783-83422f474b36"); + cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId())); + if (approval) { - cnd.and("task.taskStatus", "=", BpmProcessTaskStatusEnum.COMPLETE); - cnd.groupBy("info.id"); + cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode())); } else { - cnd.and("task.taskStatus", "=", BpmProcessTaskStatusEnum.ACTIVE); + cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode()); } - ProposalSearchParam.buildSearch(cnd, pageForm); - cnd.and(new Static(""" - NOT EXISTS( - SELECT 1 - FROM bpm_process_task t2 - WHERE t2.processInstanceId = task.processInstanceId - AND t2.processTaskNodeCode = task.processTaskNodeCode - AND t2.createdOn > task.createdOn - ) - """)); + + if (StrUtil.isAllBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) { + cnd.desc("info.createdAt"); + } else { + cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy())); + } + cnd.groupBy("t.id"); sql.setCondition(cnd); - Pagination pagination = baseService.listPageVO(pageForm, sql, ProposalInfoPageVO.class); - return Result.success(pagination); - } - - @At - @SaCheckPermission("proposal.delegation") - @Aop(TransAop.READ_COMMITTED) - @SLog(tag = "提案", msg = "团长审核") - @ApiOperation("审核") - public Result approval(@Valid @Param("approval") BpmTaskApprovalParam approvalParam) { - proposalDelegationService.approval(approvalParam); - return Result.success(); - } - - @At - @SaCheckPermission("proposal.delegation") - @Aop(TransAop.READ_COMMITTED) - @SLog(tag = "提案", msg = "团长审核撤回") - @ApiOperation("撤回") - public Result revoke(@Valid String taskId) { - proposalDelegationService.revokeTask(taskId); -// bpmService.revokeTask(taskId); - return Result.success(); + Pagination pageVO = proposalCommonService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + return Result.success(pageVO); } } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalInviteController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalInviteController.java new file mode 100644 index 00000000..fba3c315 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalInviteController.java @@ -0,0 +1,150 @@ +package com.budwk.app.zhgh.democratic.proposal.controller.transact; + +import cn.dev33.satoken.annotation.SaCheckLogin; +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.param.PageForm; +import com.budwk.app.base.result.Result; +import com.budwk.app.base.utils.PageUtil; +import com.budwk.app.flow.engine.FlowEngine; +import com.budwk.app.flow.enums.ProcessTaskStateEnum; +import com.budwk.app.web.commons.auth.utils.SecurityUtil; +import com.budwk.app.zhgh.democratic.proposal.param.ProposalSearchParam; +import com.budwk.app.zhgh.democratic.proposal.service.ProposalWriteService; +import com.budwk.app.zhgh.democratic.proposal.service.common.ProposalCommonService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.nutz.dao.Cnd; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; +import org.nutz.dao.util.cri.SqlExpressionGroup; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.util.NutMap; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; + +import javax.validation.Valid; +import java.util.List; + +@IocBean +@At("/platform/proposal/invite") +@Ok("json:full") +@Api("邀请附议人") +public class ProposalInviteController { + + @Inject + private FlowEngine flowEngine; + @Inject + private ProposalCommonService proposalCommonService; + + @At("/index") + @Ok("beetl:/platform/zhgh/democratic/proposal/transact/invite/index.html") + @SaCheckLogin + public void index() { + + } + + @At("/form") + @Ok("beetl:/platform/zhgh/democratic/proposal/transact/invite/form.html") + @SaCheckLogin + public void form() { + } + + @At + @SaCheckPermission("proposal.seconded") + @SaCheckLogin + public Result pageData(@Valid ProposalSearchParam pageForm, boolean approval) { + Sql sql = Sqls.create(""" + SELECT + info.*, + type.name AS typeName, + tcs.fullName AS sessionName, + tcd.`name` AS delegationName, + ins.id AS instanceId, + ins.businessNo, + ins.state instanceState, + ins.variable instanceVariale, + t.id taskId, + t.taskName AS taskKey, + t.displayName taskName, + t.taskType, + t.performType taskPerformType, + t.taskState, + t.finishTime, + t.taskParentId, + t.variable taskVariable, + IFNULL(GROUP_CONCAT(DISTINCT nt.displayName),'结束') curTaskName, + IF(rt.id IS NOT NULL, 1, 0) AS canRevoke + FROM + wf_process_task t + LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId + LEFT JOIN proposal_info info ON info.id = ins.businessNo + LEFT JOIN proposal_type type on type.id = info.typeId + LEFT JOIN teacher_congress_session tcs on tcs.id = info.sessionId + LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId + LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id + LEFT JOIN wf_process_task nt ON nt.processInstanceId = ins.id AND nt.taskState = 10 + LEFT JOIN wf_process_task rt ON rt.processInstanceId = ins.id AND rt.taskParentId = t.id AND rt.taskState = 10 + $condition + """); + Cnd cnd = Cnd.NEW(); + cnd.and("t.taskName", "=", "85b7b9bd-d706-48cb-99a1-ef1370fb1819"); + cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId())); + + if (approval) { + cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode())); + } else { + cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode()); + } + + if (StrUtil.isAllBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) { + cnd.desc("info.createdAt"); + } else { + cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy())); + } + cnd.groupBy("t.id"); + sql.setCondition(cnd); + Pagination pageVO = proposalCommonService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + return Result.success(pageVO); + } + + + @At + @SaCheckPermission("proposal.seconded") + @SaCheckLogin + @ApiOperation("查询附议人") + public Result listSeconder(@Valid PageForm pageForm, @Valid String proposalId, @Valid String sessionId, + String delegationId, boolean isInvite){ + Sql sql = Sqls.create(""" + SELECT + t1.userId, + t1.loginName, + t1.userName, + t1.sex, + t1.unitName, + t1.unionName, + t2.NAME AS delegationName + FROM + teacher_congress_delegate t1 + LEFT JOIN teacher_congress_delegation t2 ON t2.id = t1.delegationId + $condition + """); + Cnd cnd = Cnd.where("t1.sessionId", "=", sessionId); + cnd.andEX("t1.delegationId", "=", delegationId); + cnd.and("t1.roleId","=","72e24b5b4c4f4e90a6641e6af8487e42"); + cnd.and("t1.loginName", "!=", SecurityUtil.getUserLoginname()); + if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) { + SqlExpressionGroup seg = new SqlExpressionGroup(); + seg.orLike("t1.loginName", pageForm.getSearchKeyword()); + seg.orLike("t1.userName", pageForm.getSearchKeyword()); + cnd.and(seg); + } + sql.setCondition(cnd); + Pagination pageVO = proposalCommonService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + return Result.success(pageVO); + } + + +} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalSecondedController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalSecondedController.java index b7195a50..76cd5f69 100644 --- a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalSecondedController.java +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/transact/ProposalSecondedController.java @@ -1,19 +1,23 @@ package com.budwk.app.zhgh.democratic.proposal.controller.transact; import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.StrUtil; import com.budwk.app.base.annotation.SLog; import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.page.Pagination; import com.budwk.app.base.result.Result; import com.budwk.app.base.service.BaseService; +import com.budwk.app.base.utils.PageUtil; import com.budwk.app.bpm.enums.BpmProcessTaskStatusEnum; import com.budwk.app.bpm.param.BpmTaskApprovalParam; import com.budwk.app.bpm.service.BpmService; +import com.budwk.app.flow.enums.ProcessTaskStateEnum; import com.budwk.app.web.commons.auth.utils.AuthUtil; import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.zhgh.democratic.proposal.controller.vo.ProposalInfoPageVO; import com.budwk.app.zhgh.democratic.proposal.param.ProposalSearchParam; import com.budwk.app.zhgh.democratic.proposal.service.ProposalSecondedService; +import com.budwk.app.zhgh.democratic.proposal.service.ProposalWriteService; import com.budwk.app.zhgh.democratic.proposal.service.common.ProposalCommonService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -27,11 +31,13 @@ import org.nutz.dao.util.cri.Static; import org.nutz.ioc.aop.Aop; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.util.NutMap; import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; import org.nutz.mvc.annotation.Param; import javax.validation.Valid; +import java.util.List; /** * 附议提案 @@ -46,84 +52,76 @@ public class ProposalSecondedController { @Inject private Dao dao; @Inject - private BaseService baseService; - @Inject private ProposalCommonService proposalCommonService; - @Inject - private BpmService bpmService; - @Inject - private ProposalSecondedService proposalSecondedService; - - @At("") + @At("/index") @Ok("beetl:/platform/zhgh/democratic/proposal/transact/seconded/index.html") @SaCheckPermission("proposal.seconded") public void index() { } + @At("/form") + @Ok("beetl:/platform/zhgh/democratic/proposal/transact/seconded/form.html") + @SaCheckPermission("proposal.seconded") + public void form() { + } + + @At @SaCheckPermission("proposal.seconded") public Result pageData(@Valid ProposalSearchParam pageForm, boolean approval) { Sql sql = Sqls.create(""" - SELECT - info.*, - type.name AS typeName, - tcs.fullName AS sessionName, - tcd.`name` AS delegationName, - inst.id processInstanceId, - inst.processInstanceNodeId, - inst.processInstanceNodeName, - inst.processInstanceTaskIds, - inst.processInstanceStatus, - task.id processInstanceTaskId, - task.taskStatus processInstanceTaskStatus, - JSON_EXTRACT( task.createVariable, '$.userName' ) AS seconderName, - COUNT( nt.id ) OVER ( PARTITION BY task.id ) > 0 AS nextTaskIsComplete + SELECT + info.*, + type.name AS typeName, + tcs.fullName AS sessionName, + tcd.`name` AS delegationName, + ins.id AS instanceId, + ins.businessNo, + ins.state instanceState, + ins.variable instanceVariale, + t.id taskId, + t.taskName AS taskKey, + t.displayName taskName, + t.taskType, + t.performType taskPerformType, + t.taskState, + t.finishTime, + t.taskParentId, + t.variable taskVariable, + IFNULL(GROUP_CONCAT(DISTINCT nt.displayName),'结束') curTaskName, + IF(rt.id IS NOT NULL, 1, 0) AS canRevoke FROM - bpm_process_task task - INNER JOIN bpm_process_node_define nd ON nd.id = task.processTaskNodeId - INNER JOIN bpm_process_instance inst ON inst.id = task.processInstanceId - INNER JOIN proposal_info info ON info.id = inst.processInstanceBusinessId - LEFT JOIN proposal_type type on type.id = info.typeId - LEFT JOIN teacher_congress_session tcs ON tcs.id = info.sessionId - LEFT JOIN teacher_congress_delegation tcd ON tcd.id = info.delegationId - LEFT JOIN bpm_process_task nt ON nt.prevTaskId = task.id AND nt.taskStatus = 'COMPLETE' + wf_process_task t + LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId + LEFT JOIN proposal_info info ON info.id = ins.businessNo + LEFT JOIN proposal_type type on type.id = info.typeId + LEFT JOIN teacher_congress_session tcs on tcs.id = info.sessionId + LEFT JOIN teacher_congress_delegation tcd on tcd.id = info.delegationId + LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id + LEFT JOIN wf_process_task nt ON nt.processInstanceId = ins.id AND nt.taskState = 10 + LEFT JOIN wf_process_task rt ON rt.processInstanceId = ins.id AND rt.taskParentId = t.id AND rt.taskState = 10 $condition """); Cnd cnd = Cnd.NEW(); - if(!AuthUtil.hasRole(RoleConstant.SYSADMIN.name())){ - cnd.and(new Static("JSON_CONTAINS( task.assignments, '\"%s\"' )".formatted(SecurityUtil.getUserLoginname()))); - } - cnd.and("nd.nodeCode", "=", 20); - if (approval) { - cnd.and("task.taskStatus", "=", BpmProcessTaskStatusEnum.COMPLETE); - } else { - cnd.and("task.taskStatus", "=", BpmProcessTaskStatusEnum.ACTIVE); - } - ProposalSearchParam.buildSearch(cnd, pageForm); -// cnd.and(new Static(""" -// NOT EXISTS( -// SELECT 1 -// FROM bpm_process_task t2 -// WHERE t2.processInstanceId = task.processInstanceId -// AND t2.processTaskNodeCode = task.processTaskNodeCode -// AND t2.createdOn > task.createdOn -// ) -// """)); -// cnd.groupBy("task.id"); - sql.setCondition(cnd); - Pagination pagination = baseService.listPageVO(pageForm, sql, ProposalInfoPageVO.class); - return Result.success(pagination); - } + cnd.and("t.taskName", "=", "74458b33-ad6e-46c4-b8d9-1aa897142b25"); + cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId())); - @At - @SaCheckPermission("proposal.seconded") - @ApiOperation("附议") - @Aop(TransAop.READ_COMMITTED) - @SLog(tag = "提案", msg = "提案人附议") - public Result approval(@Valid @Param("approval") BpmTaskApprovalParam approvalParam) { - proposalSecondedService.approval(approvalParam); - return Result.success(); + if (approval) { + cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode())); + } else { + cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode()); + } + + if (StrUtil.isAllBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) { + cnd.desc("info.createdAt"); + } else { + cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy())); + } + cnd.groupBy("t.id"); + sql.setCondition(cnd); + Pagination pageVO = proposalCommonService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + return Result.success(pageVO); } } diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/view/ProposalViewController.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/view/ProposalViewController.java new file mode 100644 index 00000000..bf3d84bb --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/controller/view/ProposalViewController.java @@ -0,0 +1,37 @@ +package com.budwk.app.zhgh.democratic.proposal.controller.view; + +import cn.dev33.satoken.annotation.SaCheckLogin; +import com.budwk.app.base.result.Result; +import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo; +import io.swagger.annotations.Api; +import org.nutz.dao.Dao; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; + +@IocBean +@At("/platform/proposal/view") +@Ok("json:full") +@Api("提案查看") +public class ProposalViewController { + + @Inject + private Dao dao; + + @At("/index") + @SaCheckLogin + @Ok("beetl:/platform/zhgh/democratic/proposal/view/index.html") + public void index(){ + + } + + @At("/info") + @SaCheckLogin + public Result info(String id) { + ProposalInfo info = dao.fetch(ProposalInfo.class, id); + return Result.success(info); + } + + +} diff --git a/src/main/java/com/budwk/app/zhgh/democratic/proposal/interceptor/ProposalApplyInterceptor.java b/src/main/java/com/budwk/app/zhgh/democratic/proposal/interceptor/ProposalApplyInterceptor.java new file mode 100644 index 00000000..6614509c --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/democratic/proposal/interceptor/ProposalApplyInterceptor.java @@ -0,0 +1,30 @@ +package com.budwk.app.zhgh.democratic.proposal.interceptor; + +import com.budwk.app.flow.constant.FlowConst; +import com.budwk.app.flow.engine.FlowInterceptor; +import com.budwk.app.flow.engine.core.Execution; +import com.budwk.app.flow.engine.core.ServiceContext; +import com.budwk.app.flow.entity.ProcessInstance; +import com.budwk.app.zhgh.democratic.proposal.models.ProposalInfo; +import org.nutz.dao.Chain; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.json.Json; + +/** + * 提案申请拦截器 + */ +public class ProposalApplyInterceptor implements FlowInterceptor { + @Override + public void intercept(Execution execution) { + String formDataStr = execution.getArgs().getStr(FlowConst.FORM_DATA); + ProposalInfo info = Json.fromJson(ProposalInfo.class, formDataStr); + + Dao dao = ServiceContext.find(Dao.class); + dao.insertOrUpdate(info); + execution.getArgs().set(FlowConst.FORM_DATA, Json.toJson(info)); + + int instanceId = execution.getArgs().getInt(FlowConst.PROCESS_INSTANCE_ID_KEY); + dao.update(ProcessInstance.class, Chain.make("businessNo", info.getId()), Cnd.where(ProcessInstance::getId, "=", instanceId)); + } +} diff --git a/src/main/resources/static/assets/platform/plugins/snaker/SnakerflowDesigner.umd.js b/src/main/resources/static/assets/platform/plugins/snaker/SnakerflowDesigner.umd.js index a5ee85ce..b3c86e50 100644 --- a/src/main/resources/static/assets/platform/plugins/snaker/SnakerflowDesigner.umd.js +++ b/src/main/resources/static/assets/platform/plugins/snaker/SnakerflowDesigner.umd.js @@ -2088,7 +2088,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.iterator.for-each.js */ \"./node_modules/core-js/modules/es.iterator.for-each.js\");\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _start__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./start */ \"./packages/SnakerFlowDesigner/src/PropertySetting/start.vue\");\n/* harmony import */ var _end__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./end */ \"./packages/SnakerFlowDesigner/src/PropertySetting/end.vue\");\n/* harmony import */ var _custom__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./custom */ \"./packages/SnakerFlowDesigner/src/PropertySetting/custom.vue\");\n/* harmony import */ var _decision__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./decision */ \"./packages/SnakerFlowDesigner/src/PropertySetting/decision.vue\");\n/* harmony import */ var _task__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./task */ \"./packages/SnakerFlowDesigner/src/PropertySetting/task.vue\");\n/* harmony import */ var _transition__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./transition */ \"./packages/SnakerFlowDesigner/src/PropertySetting/transition.vue\");\n/* harmony import */ var _process__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./process */ \"./packages/SnakerFlowDesigner/src/PropertySetting/process.vue\");\n/* harmony import */ var _join__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./join */ \"./packages/SnakerFlowDesigner/src/PropertySetting/join.vue\");\n/* harmony import */ var _fork__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./fork */ \"./packages/SnakerFlowDesigner/src/PropertySetting/fork.vue\");\n/* harmony import */ var _subProcess__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./subProcess */ \"./packages/SnakerFlowDesigner/src/PropertySetting/subProcess.vue\");\n/* harmony import */ var _wfSubProcess__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./wfSubProcess */ \"./packages/SnakerFlowDesigner/src/PropertySetting/wfSubProcess.vue\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n components: {\n SnakerStart: _start__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n SnakerEnd: _end__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n SnakerCustom: _custom__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n SnakerDecision: _decision__WEBPACK_IMPORTED_MODULE_5__[\"default\"],\n SnakerTask: _task__WEBPACK_IMPORTED_MODULE_6__[\"default\"],\n SnakerTransition: _transition__WEBPACK_IMPORTED_MODULE_7__[\"default\"],\n SnakerProcess: _process__WEBPACK_IMPORTED_MODULE_8__[\"default\"],\n SnakerJoin: _join__WEBPACK_IMPORTED_MODULE_9__[\"default\"],\n SnakerFork: _fork__WEBPACK_IMPORTED_MODULE_10__[\"default\"],\n SnakerSubProcess: _subProcess__WEBPACK_IMPORTED_MODULE_11__[\"default\"],\n SnakerWfSubProcess: _wfSubProcess__WEBPACK_IMPORTED_MODULE_12__[\"default\"]\n },\n props: {\n value: {\n type: Object,\n default() {\n return {};\n }\n },\n node: {\n type: Object,\n default() {\n return {};\n }\n },\n lf: {\n type: Object,\n default() {\n return null;\n }\n },\n extendAttrConfig: {\n // 扩展属性配置\n type: Object\n },\n // 扩展的属性key\n extendPropertyKeys: {\n type: Array\n }\n },\n data() {\n return {\n drawer: false,\n form: {},\n nodeId: undefined\n };\n },\n computed: {\n title() {\n if (this.node && this.node.type === 'snaker:transition') {\n return '设置边属性';\n } else if (this.node && this.node.type === 'snaker:process') {\n return '设置流程属性';\n }\n return '设置节点属性';\n }\n },\n watch: {\n node(n) {\n if (n) {\n if (n.type === 'snaker:process') {\n this.form = n;\n } else {\n this.nodeId = n.id;\n this.form = {\n name: n.id,\n displayName: n.text instanceof Object ? n.text.value : n.text,\n ...n.properties\n };\n }\n }\n },\n 'form.name'(n, o) {\n // 监听名称变量并更新\n if (this.node.type === 'snaker:process') {\n this.$emit('input', {\n ...this.value,\n name: n\n });\n } else {\n if (n && o) {\n if (['snaker:transition'].includes(this.node.type)) {\n if (!this.lf.getEdgeModelById(n)) {\n this.lf.changeEdgeId(o, n);\n }\n } else if (['snaker:decision'].includes(this.node.type)) {\n if (!this.lf.getNodeModelById(n)) {\n this.lf.changeNodeId(o, n);\n }\n } else {\n if (!this.lf.getNodeModelById(n)) {\n this.lf.changeNodeId(o, n);\n }\n }\n this.nodeId = n;\n }\n }\n },\n 'form.displayName'(n) {\n // 监听显示名称变化并更新\n if (this.node.type === 'snaker:process') {\n this.$emit('input', {\n ...this.value,\n displayName: n\n });\n } else {\n this.lf.updateText(this.nodeId, n);\n }\n },\n 'form.form'(n) {\n // 监听表单属性变化并更新\n this.lf.setProperties(this.nodeId, {\n form: n\n });\n },\n 'form.assignee'(n) {\n // 监听参与者属性变化并更新\n this.lf.setProperties(this.nodeId, {\n assignee: n\n });\n },\n 'form.assignmentHandler'(n) {\n // 监听参与者处理类属性变化并更新\n this.lf.setProperties(this.nodeId, {\n assignmentHandler: n\n });\n },\n 'form.taskType'(n) {\n // 监听任务类型属性变化并更新\n this.lf.setProperties(this.nodeId, {\n taskType: n\n });\n },\n 'form.performType'(n) {\n // 监听参与类型属性变化并更新\n this.lf.setProperties(this.nodeId, {\n performType: n\n });\n },\n 'form.preInterceptors'(n) {\n // 监听前置拦截器属性变化并更新\n if (this.node.type === 'snaker:process') {\n this.$emit('input', {\n ...this.value,\n preInterceptors: n\n });\n } else {\n this.lf.setProperties(this.nodeId, {\n preInterceptors: n\n });\n }\n },\n 'form.postInterceptors'(n) {\n // 监听后置拦截器属性变化并更新\n if (this.node.type === 'snaker:process') {\n this.$emit('input', {\n ...this.value,\n postInterceptors: n\n });\n } else {\n this.lf.setProperties(this.nodeId, {\n postInterceptors: n\n });\n }\n },\n 'form.reminderTime'(n) {\n // 监听提醒时间属性变化并更新\n this.lf.setProperties(this.nodeId, {\n reminderTime: n\n });\n },\n 'form.reminderRepeat'(n) {\n // 监听重复提醒间隔属性变化并更新\n this.lf.setProperties(this.nodeId, {\n reminderRepeat: n\n });\n },\n 'form.expireTime'(n) {\n // 监听期待完成时间属性变化并更新\n if (this.node.type === 'snaker:process') {\n this.$emit('input', {\n ...this.value,\n expireTime: n\n });\n } else {\n this.lf.setProperties(this.nodeId, {\n expireTime: n\n });\n }\n },\n 'form.autoExecute'(n) {\n // 监听是否自动完成属性变化并更新\n this.lf.setProperties(this.nodeId, {\n autoExecute: n\n });\n },\n 'form.callback'(n) {\n // 监听回调处理属性变化并更新\n this.lf.setProperties(this.nodeId, {\n callback: n\n });\n },\n 'form.expr'(n) {\n // 监听决策表达式属性变化并更新\n this.lf.setProperties(this.nodeId, {\n expr: n\n });\n },\n 'form.handleClass'(n) {\n // 监听处理类属性变化并更新\n this.lf.setProperties(this.nodeId, {\n handleClass: n\n });\n },\n 'form.clazz'(n) {\n // 监听类路径属性变化并更新\n this.lf.setProperties(this.nodeId, {\n clazz: n\n });\n },\n 'form.methodName'(n) {\n // 监听方法名属性变化并更新\n this.lf.setProperties(this.nodeId, {\n methodName: n\n });\n },\n 'form.args'(n) {\n // 监听参数变量属性变化并更新\n this.lf.setProperties(this.nodeId, {\n args: n\n });\n },\n 'form.instanceUrl'(n) {\n // 监听流程实例启动Url变量属性变化并更新\n if (this.node.type === 'snaker:subProcess') {\n this.lf.setProperties(this.nodeId, {\n instanceUrl: n\n });\n } else {\n this.$emit('input', {\n ...this.value,\n instanceUrl: n\n });\n }\n },\n 'form.h5InstanceUrl'(n) {\n // 监听流程实例启动Url变量属性变化并更新\n if (this.node.type === 'snaker:subProcess') {\n this.lf.setProperties(this.nodeId, {\n h5InstanceUrl: n\n });\n } else {\n this.$emit('input', {\n ...this.value,\n h5InstanceUrl: n\n });\n }\n },\n 'form.category'(n) {\n // 监听流程实例分类\n if (this.node.type === 'snaker:subProcess') {\n this.lf.setProperties(this.nodeId, {\n category: n\n });\n } else {\n this.$emit('input', {\n ...this.value,\n category: n\n });\n }\n },\n 'form.instanceNoClass'(n) {\n // 监听流程实例编号生成类变量属性变化并更新\n if (this.node.type === 'snaker:subProcess') {\n this.lf.setProperties(this.nodeId, {\n instanceNoClass: n\n });\n } else {\n this.$emit('input', {\n ...this.value,\n instanceNoClass: n\n });\n }\n },\n 'form.field'(n) {\n // 监听扩展属性变化并更新\n this.lf.setProperties(this.nodeId, {\n field: n\n });\n },\n 'form.width'(n) {\n // 宽度\n this.lf.setProperties(this.nodeId, {\n width: !n || Number.isNaN(n) ? 120 : n\n });\n const nodeModel = this.lf.getNodeModelById(this.nodeId);\n if (nodeModel) {\n nodeModel.width = !n || Number.isNaN(n) ? 120 : n;\n }\n },\n 'form.height'(n) {\n // 高度\n this.lf.setProperties(this.nodeId, {\n height: !n || Number.isNaN(n) ? 80 : n\n });\n const nodeModel = this.lf.getNodeModelById(this.nodeId);\n if (nodeModel) {\n nodeModel.height = !n || Number.isNaN(n) ? 80 : n;\n }\n },\n 'form.version'(n) {\n // 监听方法名属性变化并更新\n this.lf.setProperties(this.nodeId, {\n version: n\n });\n },\n form: {\n handler(newVal) {\n if (newVal && this.extendPropertyKeys && this.extendPropertyKeys.length) {\n Object.keys(newVal).forEach(key => {\n if (this.extendPropertyKeys.includes(key)) {\n const v = {\n [key]: newVal[key]\n };\n this.lf.setProperties(this.nodeId, v);\n }\n });\n }\n },\n deep: true // 开启深度监听\n }\n },\n methods: {\n show() {\n this.drawer = true;\n },\n handleClose() {\n this.drawer = false;\n }\n }\n});\n\n//# sourceURL=webpack://SnakerflowDesigner/./packages/SnakerFlowDesigner/src/PropertySetting/index.vue?./node_modules/cache-loader/dist/cjs.js??ref--13-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--1-0!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.iterator.for-each.js */ \"./node_modules/core-js/modules/es.iterator.for-each.js\");\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _start__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./start */ \"./packages/SnakerFlowDesigner/src/PropertySetting/start.vue\");\n/* harmony import */ var _end__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./end */ \"./packages/SnakerFlowDesigner/src/PropertySetting/end.vue\");\n/* harmony import */ var _custom__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./custom */ \"./packages/SnakerFlowDesigner/src/PropertySetting/custom.vue\");\n/* harmony import */ var _decision__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./decision */ \"./packages/SnakerFlowDesigner/src/PropertySetting/decision.vue\");\n/* harmony import */ var _task__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./task */ \"./packages/SnakerFlowDesigner/src/PropertySetting/task.vue\");\n/* harmony import */ var _transition__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./transition */ \"./packages/SnakerFlowDesigner/src/PropertySetting/transition.vue\");\n/* harmony import */ var _process__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./process */ \"./packages/SnakerFlowDesigner/src/PropertySetting/process.vue\");\n/* harmony import */ var _join__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./join */ \"./packages/SnakerFlowDesigner/src/PropertySetting/join.vue\");\n/* harmony import */ var _fork__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./fork */ \"./packages/SnakerFlowDesigner/src/PropertySetting/fork.vue\");\n/* harmony import */ var _subProcess__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./subProcess */ \"./packages/SnakerFlowDesigner/src/PropertySetting/subProcess.vue\");\n/* harmony import */ var _wfSubProcess__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./wfSubProcess */ \"./packages/SnakerFlowDesigner/src/PropertySetting/wfSubProcess.vue\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n components: {\n SnakerStart: _start__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n SnakerEnd: _end__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n SnakerCustom: _custom__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n SnakerDecision: _decision__WEBPACK_IMPORTED_MODULE_5__[\"default\"],\n SnakerTask: _task__WEBPACK_IMPORTED_MODULE_6__[\"default\"],\n SnakerTransition: _transition__WEBPACK_IMPORTED_MODULE_7__[\"default\"],\n SnakerProcess: _process__WEBPACK_IMPORTED_MODULE_8__[\"default\"],\n SnakerJoin: _join__WEBPACK_IMPORTED_MODULE_9__[\"default\"],\n SnakerFork: _fork__WEBPACK_IMPORTED_MODULE_10__[\"default\"],\n SnakerSubProcess: _subProcess__WEBPACK_IMPORTED_MODULE_11__[\"default\"],\n SnakerWfSubProcess: _wfSubProcess__WEBPACK_IMPORTED_MODULE_12__[\"default\"]\n },\n props: {\n value: {\n type: Object,\n default() {\n return {};\n }\n },\n node: {\n type: Object,\n default() {\n return {};\n }\n },\n lf: {\n type: Object,\n default() {\n return null;\n }\n },\n extendAttrConfig: {\n // 扩展属性配置\n type: Object\n },\n // 扩展的属性key\n extendPropertyKeys: {\n type: Array\n }\n },\n data() {\n return {\n drawer: false,\n form: {},\n nodeId: undefined\n };\n },\n computed: {\n title() {\n if (this.node && this.node.type === 'snaker:transition') {\n return '设置边属性';\n } else if (this.node && this.node.type === 'snaker:process') {\n return '设置流程属性';\n }\n return '设置节点属性';\n }\n },\n watch: {\n node(n) {\n if (n) {\n if (n.type === 'snaker:process') {\n this.form = n;\n } else {\n this.nodeId = n.id;\n this.form = {\n name: n.id,\n displayName: n.text instanceof Object ? n.text.value : n.text,\n ...n.properties\n };\n }\n }\n },\n 'form.name'(n, o) {\n // 监听名称变量并更新\n if (this.node.type === 'snaker:process') {\n this.$emit('input', {\n ...this.value,\n name: n\n });\n } else {\n if (n && o) {\n if (['snaker:transition'].includes(this.node.type)) {\n if (!this.lf.getEdgeModelById(n)) {\n this.lf.changeEdgeId(o, n);\n }\n } else if (['snaker:decision'].includes(this.node.type)) {\n if (!this.lf.getNodeModelById(n)) {\n this.lf.changeNodeId(o, n);\n }\n } else {\n if (!this.lf.getNodeModelById(n)) {\n this.lf.changeNodeId(o, n);\n }\n }\n this.nodeId = n;\n }\n }\n },\n 'form.displayName'(n) {\n // 监听显示名称变化并更新\n if (this.node.type === 'snaker:process') {\n this.$emit('input', {\n ...this.value,\n displayName: n\n });\n } else {\n this.lf.updateText(this.nodeId, n);\n }\n },\n 'form.form'(n) {\n // 监听表单属性变化并更新\n this.lf.setProperties(this.nodeId, {\n form: n\n });\n },\n 'form.assignee'(n) {\n // 监听参与者属性变化并更新\n this.lf.setProperties(this.nodeId, {\n assignee: n\n });\n },\n 'form.assignmentHandler'(n) {\n // 监听参与者处理类属性变化并更新\n this.lf.setProperties(this.nodeId, {\n assignmentHandler: n\n });\n },\n 'form.taskType'(n) {\n // 监听任务类型属性变化并更新\n this.lf.setProperties(this.nodeId, {\n taskType: n\n });\n },\n 'form.performType'(n) {\n // 监听参与类型属性变化并更新\n this.lf.setProperties(this.nodeId, {\n performType: n\n });\n },\n 'form.countersignType'(n) {\n // 监听会签类型属性变化并更新\n this.lf.setProperties(this.nodeId, {\n countersignType: n\n });\n },\n 'form.countersignCompletionCondition'(n) {\n // 监听会签完成条件属性变化并更新\n this.lf.setProperties(this.nodeId, {\n countersignCompletionCondition: n\n });\n },\n 'form.preInterceptors'(n) {\n // 监听前置拦截器属性变化并更新\n if (this.node.type === 'snaker:process') {\n this.$emit('input', {\n ...this.value,\n preInterceptors: n\n });\n } else {\n this.lf.setProperties(this.nodeId, {\n preInterceptors: n\n });\n }\n },\n 'form.postInterceptors'(n) {\n // 监听后置拦截器属性变化并更新\n if (this.node.type === 'snaker:process') {\n this.$emit('input', {\n ...this.value,\n postInterceptors: n\n });\n } else {\n this.lf.setProperties(this.nodeId, {\n postInterceptors: n\n });\n }\n },\n 'form.reminderTime'(n) {\n // 监听提醒时间属性变化并更新\n this.lf.setProperties(this.nodeId, {\n reminderTime: n\n });\n },\n 'form.reminderRepeat'(n) {\n // 监听重复提醒间隔属性变化并更新\n this.lf.setProperties(this.nodeId, {\n reminderRepeat: n\n });\n },\n 'form.expireTime'(n) {\n // 监听期待完成时间属性变化并更新\n if (this.node.type === 'snaker:process') {\n this.$emit('input', {\n ...this.value,\n expireTime: n\n });\n } else {\n this.lf.setProperties(this.nodeId, {\n expireTime: n\n });\n }\n },\n 'form.autoExecute'(n) {\n // 监听是否自动完成属性变化并更新\n this.lf.setProperties(this.nodeId, {\n autoExecute: n\n });\n },\n 'form.callback'(n) {\n // 监听回调处理属性变化并更新\n this.lf.setProperties(this.nodeId, {\n callback: n\n });\n },\n 'form.expr'(n) {\n // 监听决策表达式属性变化并更新\n this.lf.setProperties(this.nodeId, {\n expr: n\n });\n },\n 'form.handleClass'(n) {\n // 监听处理类属性变化并更新\n this.lf.setProperties(this.nodeId, {\n handleClass: n\n });\n },\n 'form.clazz'(n) {\n // 监听类路径属性变化并更新\n this.lf.setProperties(this.nodeId, {\n clazz: n\n });\n },\n 'form.methodName'(n) {\n // 监听方法名属性变化并更新\n this.lf.setProperties(this.nodeId, {\n methodName: n\n });\n },\n 'form.args'(n) {\n // 监听参数变量属性变化并更新\n this.lf.setProperties(this.nodeId, {\n args: n\n });\n },\n 'form.instanceUrl'(n) {\n // 监听流程实例启动Url变量属性变化并更新\n if (this.node.type === 'snaker:subProcess') {\n this.lf.setProperties(this.nodeId, {\n instanceUrl: n\n });\n } else {\n this.$emit('input', {\n ...this.value,\n instanceUrl: n\n });\n }\n },\n 'form.h5InstanceUrl'(n) {\n // 监听流程实例启动Url变量属性变化并更新\n if (this.node.type === 'snaker:subProcess') {\n this.lf.setProperties(this.nodeId, {\n h5InstanceUrl: n\n });\n } else {\n this.$emit('input', {\n ...this.value,\n h5InstanceUrl: n\n });\n }\n },\n 'form.category'(n) {\n // 监听流程实例分类\n if (this.node.type === 'snaker:subProcess') {\n this.lf.setProperties(this.nodeId, {\n category: n\n });\n } else {\n this.$emit('input', {\n ...this.value,\n category: n\n });\n }\n },\n 'form.instanceNoClass'(n) {\n // 监听流程实例编号生成类变量属性变化并更新\n if (this.node.type === 'snaker:subProcess') {\n this.lf.setProperties(this.nodeId, {\n instanceNoClass: n\n });\n } else {\n this.$emit('input', {\n ...this.value,\n instanceNoClass: n\n });\n }\n },\n 'form.field'(n) {\n // 监听扩展属性变化并更新\n this.lf.setProperties(this.nodeId, {\n field: n\n });\n },\n 'form.width'(n) {\n // 宽度\n this.lf.setProperties(this.nodeId, {\n width: !n || Number.isNaN(n) ? 120 : n\n });\n const nodeModel = this.lf.getNodeModelById(this.nodeId);\n if (nodeModel) {\n nodeModel.width = !n || Number.isNaN(n) ? 120 : n;\n }\n },\n 'form.height'(n) {\n // 高度\n this.lf.setProperties(this.nodeId, {\n height: !n || Number.isNaN(n) ? 80 : n\n });\n const nodeModel = this.lf.getNodeModelById(this.nodeId);\n if (nodeModel) {\n nodeModel.height = !n || Number.isNaN(n) ? 80 : n;\n }\n },\n 'form.version'(n) {\n // 监听方法名属性变化并更新\n this.lf.setProperties(this.nodeId, {\n version: n\n });\n },\n form: {\n handler(newVal) {\n if (newVal && this.extendPropertyKeys && this.extendPropertyKeys.length) {\n Object.keys(newVal).forEach(key => {\n if (this.extendPropertyKeys.includes(key)) {\n const v = {\n [key]: newVal[key]\n };\n this.lf.setProperties(this.nodeId, v);\n }\n });\n }\n },\n deep: true // 开启深度监听\n }\n },\n methods: {\n show() {\n this.drawer = true;\n },\n handleClose() {\n this.drawer = false;\n }\n }\n});\n\n//# sourceURL=webpack://SnakerflowDesigner/./packages/SnakerFlowDesigner/src/PropertySetting/index.vue?./node_modules/cache-loader/dist/cjs.js??ref--13-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--1-0!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -2148,7 +2148,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.iterator.filter.js */ \"./node_modules/core-js/modules/es.iterator.filter.js\");\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.iterator.find.js */ \"./node_modules/core-js/modules/es.iterator.find.js\");\n/* harmony import */ var core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.iterator.for-each.js */ \"./node_modules/core-js/modules/es.iterator.for-each.js\");\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.iterator.map.js */ \"./node_modules/core-js/modules/es.iterator.map.js\");\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_5__);\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n props: {\n value: {\n type: Object,\n default() {\n return {};\n }\n },\n extendAttrConfig: {\n // 扩展属性配置\n type: Object\n }\n },\n data() {\n return {\n form: this.value,\n attrKey: '',\n field: this.value.field || {},\n mDropdownData: [{\n label: '用户标识',\n name: 'userKey',\n icon: '',\n tips: '参与者处理类可根据用户标识获取参与者'\n }, {\n label: '用户组标识',\n name: 'groupKey',\n icon: '',\n tips: '参与者处理类可根据用户组标识获取参与者'\n }, {\n label: '候选用户',\n name: 'candidateUsers',\n icon: '',\n tips: '候选用户(提供给上一节点选择下一节点参与者的用户标识)'\n }, {\n label: '候选用户组',\n name: 'candidateGroups',\n icon: '',\n tips: '候选用户组(提供给上一节点选择下一节点参与者的用户组标识)'\n }, {\n label: '候选人处理类',\n name: 'candidateHandler',\n icon: '',\n tips: '获取候选人的处理类'\n }, {\n label: '额外属性1',\n name: 'attr1',\n icon: '',\n tips: '其他扩展属性1'\n }, {\n label: '额外属性2',\n name: 'attr2',\n icon: '',\n tips: '其他扩展属性2'\n }, {\n label: '额外属性3',\n name: 'attr3',\n icon: '',\n tips: '其他扩展属性3'\n }],\n performTypeAttrs: [{\n label: '会签类型',\n name: 'countersignType',\n icon: '',\n tips: '参数类型为会签参与时生效',\n disabled: true\n }, {\n label: '会签完成条件',\n name: 'countersignCompletionCondition',\n disabled: true,\n icon: '',\n tips: '参数类型为会签参与时生效'\n }]\n };\n },\n computed: {\n attrList() {\n if (!this.field) {\n return [];\n }\n // 会签相关属性\n const performTypeAttrs = [];\n if (this.form.performType === 'ALL') {\n performTypeAttrs.push({\n key: 'countersignType',\n value: this.field.countersignType,\n disabled: true\n });\n performTypeAttrs.push({\n key: 'countersignCompletionCondition',\n value: this.field.countersignCompletionCondition,\n disabled: true\n });\n }\n return [...performTypeAttrs, ...Object.keys(this.field).filter(key => !performTypeAttrs.map(item => item.key).includes(key)).map(key => {\n return {\n key: key,\n value: this.field[key]\n };\n })];\n },\n dropdownData() {\n let res = [];\n if (!this.extendAttrConfig || !this.extendAttrConfig.items || !this.extendAttrConfig.items.length) {\n res = this.mDropdownData;\n } else {\n res = this.extendAttrConfig.items;\n }\n if (this.form.performType === 'ALL') {\n return [...this.performTypeAttrs, ...res];\n }\n return res;\n }\n },\n watch: {\n form: {\n handler(n) {\n this.$emit('change', n);\n },\n deep: true\n },\n 'form.performType': {\n handler(n) {\n // 设置countersignType默认值\n if (this.form.performType === 'ALL' && !this.field.countersignType) {\n this.$set(this.field, 'countersignType', 'PARALLEL');\n }\n if (this.form.performType !== 'ALL' && this.field) {\n this.performTypeAttrs.forEach(item => {\n delete this.field[item.name];\n });\n }\n }\n },\n value: {\n handler(n) {\n this.form = n;\n },\n deep: true\n },\n field: {\n handler(n) {\n this.$set(this.form, 'field', JSON.parse(JSON.stringify(this.field)));\n },\n deep: true\n }\n },\n methods: {\n handleCommand(command) {\n this.$set(this.field, command, '');\n },\n handleRemoveFieldAttr(key) {\n this.$delete(this.field, key);\n },\n getLabel(name) {\n const res = this.dropdownData.find(item => {\n return item.name === name;\n });\n if (res) {\n return res.label;\n }\n return '';\n },\n getTooltip(name) {\n const res = this.dropdownData.find(item => {\n return item.name === name;\n });\n if (res) {\n return res.tips || res.label;\n }\n return '';\n }\n }\n});\n\n//# sourceURL=webpack://SnakerflowDesigner/./packages/SnakerFlowDesigner/src/PropertySetting/task.vue?./node_modules/cache-loader/dist/cjs.js??ref--13-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--1-0!./node_modules/vue-loader/lib??vue-loader-options"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n props: {\n value: {\n type: Object,\n default() {\n return {};\n }\n },\n extendAttrConfig: {\n // 扩展属性配置\n type: Object\n }\n },\n data() {\n return {\n form: this.value,\n attrKey: '',\n field: this.value.field || {},\n mDropdownData: [{\n label: '用户标识',\n name: 'userKey',\n icon: '',\n tips: '参与者处理类可根据用户标识获取参与者'\n }, {\n label: '用户组标识',\n name: 'groupKey',\n icon: '',\n tips: '参与者处理类可根据用户组标识获取参与者'\n }, {\n label: '候选用户',\n name: 'candidateUsers',\n icon: '',\n tips: '候选用户(提供给上一节点选择下一节点参与者的用户标识)'\n }, {\n label: '候选用户组',\n name: 'candidateGroups',\n icon: '',\n tips: '候选用户组(提供给上一节点选择下一节点参与者的用户组标识)'\n }, {\n label: '候选人处理类',\n name: 'candidateHandler',\n icon: '',\n tips: '获取候选人的处理类'\n }, {\n label: '额外属性1',\n name: 'attr1',\n icon: '',\n tips: '其他扩展属性1'\n }, {\n label: '额外属性2',\n name: 'attr2',\n icon: '',\n tips: '其他扩展属性2'\n }, {\n label: '额外属性3',\n name: 'attr3',\n icon: '',\n tips: '其他扩展属性3'\n }],\n performTypeAttrs: [{\n label: '会签类型',\n name: 'countersignType',\n icon: '',\n tips: '参数类型为会签参与时生效',\n disabled: true\n }, {\n label: '会签完成条件',\n name: 'countersignCompletionCondition',\n disabled: true,\n icon: '',\n tips: '参数类型为会签参与时生效'\n }]\n };\n },\n computed: {\n // attrList () {\n // if (!this.field) {\n // return []\n // }\n // // 会签相关属性\n // const performTypeAttrs = []\n // if (this.form.performType === 'ALL') {\n // performTypeAttrs.push({\n // key: 'countersignType',\n // value: this.field.countersignType,\n // disabled: true\n // })\n // performTypeAttrs.push({\n // key: 'countersignCompletionCondition',\n // value: this.field.countersignCompletionCondition,\n // disabled: true\n // })\n // }\n // return [\n // ...performTypeAttrs,\n // ...Object.keys(this.field).filter((key) => !performTypeAttrs.map(item => item.key).includes(key)).map(key => {\n // return {\n // key: key,\n // value: this.field[key]\n // }\n // })\n // ]\n // },\n // dropdownData () {\n // let res = []\n // if (!this.extendAttrConfig || !this.extendAttrConfig.items || !this.extendAttrConfig.items.length) {\n // res = this.mDropdownData\n // } else {\n // res = this.extendAttrConfig.items\n // }\n // if (this.form.performType === 'ALL') {\n // return [\n // ...this.performTypeAttrs,\n // ...res\n // ]\n // }\n // return res\n // }\n },\n watch: {\n form: {\n handler(n) {\n console.log(n);\n this.$emit('change', n);\n },\n deep: true\n },\n 'form.performType': {\n handler(n) {\n // 设置countersignType默认值\n // if (this.form.performType === 'ALL' && !this.field.countersignType) {\n // this.$set(this.field, 'countersignType', 'PARALLEL')\n // }\n // if (this.form.performType !== 'ALL' && this.field) {\n // this.performTypeAttrs.forEach((item) => {\n // delete this.field[item.name]\n // })\n // }\n }\n },\n value: {\n handler(n) {\n this.form = n;\n },\n deep: true\n },\n field: {\n handler(n) {\n console.log(n);\n this.$set(this.form, 'field', JSON.parse(JSON.stringify(this.field)));\n },\n deep: true\n }\n },\n methods: {\n // handleCommand (command) {\n // this.$set(this.field, command, '')\n // },\n // handleRemoveFieldAttr (key) {\n // this.$delete(this.field, key)\n // },\n // getLabel (name) {\n // const res = this.dropdownData.find(item => {\n // return item.name === name\n // })\n // if (res) {\n // return res.label\n // }\n // return ''\n // },\n // getTooltip (name) {\n // const res = this.dropdownData.find(item => {\n // return item.name === name\n // })\n // if (res) {\n // return res.tips || res.label\n // }\n // return ''\n // }\n }\n});\n\n//# sourceURL=webpack://SnakerflowDesigner/./packages/SnakerFlowDesigner/src/PropertySetting/task.vue?./node_modules/cache-loader/dist/cjs.js??ref--13-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--1-0!./node_modules/vue-loader/lib??vue-loader-options"); /***/ }), @@ -12911,7 +12911,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"nodeStyleHandle\", function() { return nodeStyleHandle; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"edgeStyleHandle\", function() { return edgeStyleHandle; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"parseXml2Dom\", function() { return parseXml2Dom; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"snakerXml2LogicFlowJson\", function() { return snakerXml2LogicFlowJson; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"logicFlowJsonToSnakerXml\", function() { return logicFlowJsonToSnakerXml; });\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.iterator.filter.js */ \"./node_modules/core-js/modules/es.iterator.filter.js\");\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.iterator.find.js */ \"./node_modules/core-js/modules/es.iterator.find.js\");\n/* harmony import */ var core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.iterator.for-each.js */ \"./node_modules/core-js/modules/es.iterator.for-each.js\");\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.iterator.map.js */ \"./node_modules/core-js/modules/es.iterator.map.js\");\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_5__);\n\n\n\n\n\n\n\n\n\n\n\n\n/**\r\n * 节点样式处理方法\r\n * @param {*}} _this\r\n * @param {*} style\r\n * @returns\r\n */\nconst nodeStyleHandle = (_this, style) => {\n if (_this.properties.state === 'active') {\n style.stroke = '#ffa500';\n } else if (_this.properties.state === 'history') {\n style.stroke = '#008000';\n style.fill = '#e6f7ff';\n }\n return style;\n};\n/**\r\n * 边样式处理方法\r\n * @param {*}} _this\r\n * @param {*} style\r\n * @returns\r\n */\nconst edgeStyleHandle = (_this, style) => {\n if (_this.properties.state === 'active') {\n style.stroke = '#ffa500';\n } else if (_this.properties.state === 'history') {\n style.stroke = '#008000';\n }\n return style;\n};\n/**\r\n * 解析xml成Dom对象\r\n * @param {} xml\r\n * @returns\r\n */\nconst parseXml2Dom = xml => {\n let xmlDoc = null;\n if (window.DOMParser) {\n const parser = new DOMParser();\n xmlDoc = parser.parseFromString(xml, 'text/xml');\n } else {\n // Internet Explorer\n // eslint-disable-next-line no-undef\n xmlDoc = new ActiveXObject('Microsoft.XMLDOM');\n xmlDoc.async = false;\n xmlDoc.loadXML(xml);\n }\n return xmlDoc;\n};\n// 节点标签\nconst NODE_NAMES = ['start', 'task', 'decision', 'end', 'custom', 'join', 'fork', 'subProcess', 'wfSubProcess'];\n// 流程节点属性\nconst PROCESS_ATTR_KEYS = ['name', 'displayName', 'category', 'instanceUrl', 'h5InstanceUrl', 'expireTime', 'instanceNoClass', 'preInterceptors', 'postInterceptors'];\n// 节点属性\nconst NODE_ATTR_KEYS = ['name', 'displayName', 'form', 'assignee', 'assignmentHandler', 'taskType', 'performType', 'preInterceptors', 'postInterceptors', 'reminderTime', 'reminderRepeat', 'expireTime', 'autoExecute', 'callback', 'expr', 'handleClass', 'clazz', 'methodName', 'args', 'layout', 'g', 'form', 'version'];\n// 变迁节点属性\nconst TRANSITION_ATTR_KEYS = ['name', 'displayName', 'to', 'expr', 'g'];\n\n/**\r\n * 将snaker的定义文件转成LogicFlow支持的数据格式\r\n * @param {*} xml\r\n * @returns\r\n */\nconst snakerXml2LogicFlowJson = xml => {\n const graphData = {\n nodes: [],\n edges: []\n };\n const xmlDoc = parseXml2Dom(xml);\n const processDom = xmlDoc.getElementsByTagName('process');\n if (!processDom.length) {\n return graphData;\n }\n let value = null;\n // 解析process属性\n PROCESS_ATTR_KEYS.forEach(key => {\n value = processDom[0].getAttribute(key);\n if (value) {\n graphData[key] = value;\n }\n });\n let nodeEles = null;\n let node = null;\n let lfNode = {};\n // 解析节点\n NODE_NAMES.forEach(key => {\n nodeEles = processDom[0].getElementsByTagName(key);\n if (nodeEles.length) {\n for (var i = 0, len = nodeEles.length; i < len; i++) {\n node = nodeEles[i];\n lfNode = {\n type: 'snaker:' + (key === 'subProcess' ? 'wfSubProcess' : key),\n properties: {}\n };\n // 处理节点\n NODE_ATTR_KEYS.forEach(attrKey => {\n value = node.getAttribute(attrKey);\n if (value) {\n if (attrKey === 'name') {\n lfNode.id = value;\n } else if (attrKey === 'layout') {\n const attr = value.split(',');\n if (attr.length === 4) {\n lfNode.x = attr[0];\n lfNode.y = attr[1];\n lfNode.properties.width = attr[2] <= 0 ? 100 : attr[2];\n lfNode.properties.height = attr[3] <= 0 ? 50 : attr[3];\n }\n } else if (attrKey === 'displayName') {\n lfNode.text = value;\n } else {\n lfNode.properties[attrKey] = value;\n }\n }\n });\n // 处理扩展属性\n if (key === 'task') {\n const fieldEles = node.getElementsByTagName('field');\n if (fieldEles.length) {\n const fieldEle = fieldEles[0];\n const field = {};\n const attr = fieldEle.getElementsByTagName('attr');\n for (var iii = 0; iii < attr.length; iii++) {\n field[attr[iii].getAttribute('name')] = attr[iii].getAttribute('value');\n }\n lfNode.properties.field = field;\n }\n }\n graphData.nodes.push(lfNode);\n // 处理边\n let transitionEles = null;\n let transitionEle = null;\n let edge = {};\n if (key !== 'end') {\n transitionEles = node.getElementsByTagName('transition');\n for (var j = 0, lenn = transitionEles.length; j < lenn; j++) {\n transitionEle = transitionEles[j];\n edge = {};\n edge.id = transitionEle.getAttribute('name');\n edge.type = 'snaker:transition';\n edge.sourceNodeId = lfNode.id;\n edge.targetNodeId = transitionEle.getAttribute('to');\n edge.text = {\n value: transitionEle.getAttribute('displayName') ? transitionEle.getAttribute('displayName') : ''\n };\n edge.properties = {};\n const expr = transitionEle.getAttribute('expr');\n if (expr) {\n edge.properties.expr = expr;\n }\n const g = transitionEle.getAttribute('g');\n if (g) {\n const points = g.split(';');\n if (points.length >= 2) {\n edge.pointsList = [];\n points.forEach(item => {\n const pointArr = item.split(',');\n edge.pointsList.push({\n x: Number(pointArr[0]),\n y: Number(pointArr[1])\n });\n });\n edge.startPoint = edge.pointsList[0];\n edge.endPoint = edge.pointsList[edge.pointsList.length - 1];\n }\n }\n graphData.edges.push(edge);\n }\n }\n }\n }\n });\n return graphData;\n};\n/**\r\n * 将LogicFlow的数据转成snaker的定义文件\r\n * @param {*} data(...processInfo,nodes,edges)\r\n * @returns\r\n */\nconst logicFlowJsonToSnakerXml = data => {\n let xml = '';\n // data的数据由流程定义文件信息+logicFlow数据构成\n // 先构建成流程对象\n const processObj = {\n name: data.name,\n // 流程定义名称\n displayName: data.displayName,\n // 流程定义显示名称\n category: data.category,\n // 流程定义分类\n instanceUrl: data.instanceUrl,\n // 实例启动Url\n h5InstanceUrl: data.h5InstanceUrl,\n // H5实例启动Url\n expireTime: data.expireTime,\n // 期望完成时间\n instanceNoClass: data.instanceNoClass,\n // 实例编号生成类\n preInterceptors: data.preInterceptors,\n // 节点前置拦截器\n postInterceptors: data.postInterceptors // 节点后置拦截器\n };\n /**\r\n * 获取所有子流程\r\n */\n const getSubProcessNodes = () => {\n return data.nodes.filter(node => {\n return node.type === 'snaker:subProcess';\n });\n };\n /**\r\n * 获取开始节点\r\n * @returns\r\n */\n const getStartNode = () => {\n return data.nodes.find(node => {\n return node.type === 'snaker:start';\n });\n };\n /**\r\n * 获取当前节点的所有下一个节点集合\r\n * @param {*} id 当前节点名称\r\n * @returns\r\n */\n const getNextNodes = id => {\n return data.edges.filter(edge => {\n return edge.sourceNodeId === id;\n }).map(edge => {\n return data.nodes.find(node => {\n return node.id === edge.targetNodeId;\n });\n });\n };\n /**\r\n * 获取节点所有输出边\r\n * @param {*} id\r\n * @returns\r\n */\n const getTransitions = id => {\n return data.edges.filter(edge => {\n return edge.sourceNodeId === id;\n }).map(edge => {\n return {\n name: edge.id,\n displayName: edge.text instanceof String || edge.text === undefined ? edge.text : edge.text.value,\n to: edge.targetNodeId,\n // 目地节点id\n expr: edge.properties.expr,\n // 表达式\n g: edge.pointsList.map(point => {\n // 转换点集合\n return point.x + ',' + point.y;\n }).join(';')\n };\n });\n };\n /**\r\n * 构建节点属性\r\n * @param {}} node\r\n * @returns\r\n */\n const buildNode = node => {\n let field;\n if (node.properties.field && Object.keys(node.properties.field).length) {\n field = {\n name: 'ext',\n displayName: '扩展属性',\n attr: Object.keys(node.properties.field).map(key => {\n return {\n name: key,\n value: node.properties.field[key]\n };\n })\n };\n }\n return {\n name: node.id,\n displayName: node.text instanceof String || node.text === undefined ? node.text : node.text.value,\n layout: node.x + ',' + node.y + ',' + (node.properties.width ? node.properties.width : '120') + ',' + (node.properties.height ? node.properties.height : '80'),\n ...node.properties,\n transition: getTransitions(node.id),\n field\n };\n };\n /**\r\n * 特殊字符转义\r\n * @param {*} text\r\n * @returns\r\n */\n const textEncode = text => {\n text = text.replace(/&/g, '&').replace(/\"/g, '"').replace(//g, '>');\n return text;\n };\n /**\r\n * 递归构建节点属性\r\n * @param {} node\r\n */\n const recursionBuildNode = node => {\n const nodeName = node.type.replace('snaker:', '');\n if (!processObj[nodeName + '_' + node.id]) {\n processObj[nodeName + '_' + node.id] = buildNode(node);\n const nextNodes = getNextNodes(node.id);\n nextNodes.forEach(nextNode => {\n recursionBuildNode(nextNode);\n });\n }\n };\n const startNode = getStartNode();\n if (!startNode) {\n // 开始节点不存在,xml不合法\n return '';\n }\n recursionBuildNode(startNode);\n xml = '\\n';\n xml += ' {\n const value = processObj[key];\n if (PROCESS_ATTR_KEYS.includes(key) && value) {\n xml += ' ' + key + '=' + '\"' + textEncode(value) + '\"';\n }\n });\n xml += '>\\n';\n // 生成节点xml\n Object.keys(processObj).forEach(key => {\n const value = processObj[key];\n let nodeName = key.split('_')[0];\n if (NODE_NAMES.includes(nodeName)) {\n if (nodeName === 'wfSubProcess') {\n nodeName = 'subProcess';\n }\n xml += '\\t<' + nodeName;\n // 构造属性\n Object.keys(value).forEach(nodeAttrKey => {\n if (NODE_ATTR_KEYS.includes(nodeAttrKey) && value[nodeAttrKey]) {\n xml += ' ' + nodeAttrKey + '=' + '\"' + textEncode(value[nodeAttrKey]) + '\"';\n }\n });\n xml += '>\\n\\t';\n // 构建transition\n if (value.transition) {\n value.transition.forEach(tran => {\n xml += '\\t {\n if (TRANSITION_ATTR_KEYS.includes(tranAttrKey) && tran[tranAttrKey]) {\n xml += ' ' + tranAttrKey + '=' + '\"' + textEncode(tran[tranAttrKey]) + '\"';\n }\n });\n xml += '>';\n xml += '\\n';\n });\n }\n if (value.field && nodeName === 'task') {\n xml += '\\t\\n';\n value.field.attr.forEach(attrItem => {\n xml += '\\t\\t\\n';\n });\n xml += '\\t\\n';\n }\n xml += '\\t\\n';\n }\n });\n xml += '';\n // 构建子流程模型数据\n const buildSubProcessList = () => {\n const subProcessNodes = getSubProcessNodes();\n const subProcessModel = subProcessNodes.map(n => {\n const subModel = {\n name: n.id,\n // 流程定义名称\n displayName: n.properties.displayName,\n // 流程定义显示名称\n category: n.properties.category,\n // 流程定义分类\n instanceUrl: n.properties.instanceUrl,\n // 实例启动Url\n h5InstanceUrl: n.properties.h5InstanceUrl,\n // H5实例启动Url\n expireTime: n.properties.expireTime,\n // 期望完成时间\n instanceNoClass: n.properties.instanceNoClass,\n // 实例编号生成类\n preInterceptors: n.properties.preInterceptors,\n // 节点前置拦截器\n postInterceptors: n.properties.postInterceptors,\n // 节点后置拦截器\n nodes: data.nodes.filter(item => n.children.includes(item.id)),\n edges: data.edges.filter(item => n.children.includes(item.id))\n };\n subModel.nodes.forEach(item => {\n data.edges.forEach(edge => {\n if (edge.sourceNodeId === item.id) {\n subModel.edges.push(edge);\n }\n });\n });\n return subModel;\n });\n return subProcessModel;\n };\n const subProcessList = buildSubProcessList();\n subProcessList.forEach(processModel => {\n xml += logicFlowJsonToSnakerXml(processModel).replace('', '');\n });\n return xml;\n};\n\n//# sourceURL=webpack://SnakerflowDesigner/./packages/SnakerFlowDesigner/src/snakerflow/tool.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"nodeStyleHandle\", function() { return nodeStyleHandle; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"edgeStyleHandle\", function() { return edgeStyleHandle; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"parseXml2Dom\", function() { return parseXml2Dom; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"snakerXml2LogicFlowJson\", function() { return snakerXml2LogicFlowJson; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"logicFlowJsonToSnakerXml\", function() { return logicFlowJsonToSnakerXml; });\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.iterator.filter.js */ \"./node_modules/core-js/modules/es.iterator.filter.js\");\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.iterator.find.js */ \"./node_modules/core-js/modules/es.iterator.find.js\");\n/* harmony import */ var core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.iterator.for-each.js */ \"./node_modules/core-js/modules/es.iterator.for-each.js\");\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.iterator.map.js */ \"./node_modules/core-js/modules/es.iterator.map.js\");\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_5__);\n\n\n\n\n\n\n\n\n\n\n\n\n/**\r\n * 节点样式处理方法\r\n * @param {*}} _this\r\n * @param {*} style\r\n * @returns\r\n */\nconst nodeStyleHandle = (_this, style) => {\n if (_this.properties.state === 'active') {\n style.stroke = '#ffa500';\n } else if (_this.properties.state === 'history') {\n style.stroke = '#008000';\n style.fill = '#e6f7ff';\n }\n return style;\n};\n/**\r\n * 边样式处理方法\r\n * @param {*}} _this\r\n * @param {*} style\r\n * @returns\r\n */\nconst edgeStyleHandle = (_this, style) => {\n if (_this.properties.state === 'active') {\n style.stroke = '#ffa500';\n } else if (_this.properties.state === 'history') {\n style.stroke = '#008000';\n }\n return style;\n};\n/**\r\n * 解析xml成Dom对象\r\n * @param {} xml\r\n * @returns\r\n */\nconst parseXml2Dom = xml => {\n let xmlDoc = null;\n if (window.DOMParser) {\n const parser = new DOMParser();\n xmlDoc = parser.parseFromString(xml, 'text/xml');\n } else {\n // Internet Explorer\n // eslint-disable-next-line no-undef\n xmlDoc = new ActiveXObject('Microsoft.XMLDOM');\n xmlDoc.async = false;\n xmlDoc.loadXML(xml);\n }\n return xmlDoc;\n};\n// 节点标签\nconst NODE_NAMES = ['start', 'task', 'decision', 'end', 'custom', 'join', 'fork', 'subProcess', 'wfSubProcess'];\n// 流程节点属性\nconst PROCESS_ATTR_KEYS = ['name', 'displayName', 'category', 'instanceUrl', 'h5InstanceUrl', 'expireTime', 'instanceNoClass', 'preInterceptors', 'postInterceptors'];\n// 节点属性\nconst NODE_ATTR_KEYS = ['name', 'displayName', 'form', 'assignee', 'assignmentHandler', 'taskType', 'performType', 'countersignType', 'countersignCompletionCondition', 'preInterceptors', 'postInterceptors', 'reminderTime', 'reminderRepeat', 'expireTime', 'autoExecute', 'callback', 'expr', 'handleClass', 'clazz', 'methodName', 'args', 'layout', 'g', 'form', 'version'];\n// 变迁节点属性\nconst TRANSITION_ATTR_KEYS = ['name', 'displayName', 'to', 'expr', 'g'];\n\n/**\r\n * 将snaker的定义文件转成LogicFlow支持的数据格式\r\n * @param {*} xml\r\n * @returns\r\n */\nconst snakerXml2LogicFlowJson = xml => {\n const graphData = {\n nodes: [],\n edges: []\n };\n const xmlDoc = parseXml2Dom(xml);\n const processDom = xmlDoc.getElementsByTagName('process');\n if (!processDom.length) {\n return graphData;\n }\n let value = null;\n // 解析process属性\n PROCESS_ATTR_KEYS.forEach(key => {\n value = processDom[0].getAttribute(key);\n if (value) {\n graphData[key] = value;\n }\n });\n let nodeEles = null;\n let node = null;\n let lfNode = {};\n // 解析节点\n NODE_NAMES.forEach(key => {\n nodeEles = processDom[0].getElementsByTagName(key);\n if (nodeEles.length) {\n for (var i = 0, len = nodeEles.length; i < len; i++) {\n node = nodeEles[i];\n lfNode = {\n type: 'snaker:' + (key === 'subProcess' ? 'wfSubProcess' : key),\n properties: {}\n };\n // 处理节点\n NODE_ATTR_KEYS.forEach(attrKey => {\n value = node.getAttribute(attrKey);\n if (value) {\n if (attrKey === 'name') {\n lfNode.id = value;\n } else if (attrKey === 'layout') {\n const attr = value.split(',');\n if (attr.length === 4) {\n lfNode.x = attr[0];\n lfNode.y = attr[1];\n lfNode.properties.width = attr[2] <= 0 ? 100 : attr[2];\n lfNode.properties.height = attr[3] <= 0 ? 50 : attr[3];\n }\n } else if (attrKey === 'displayName') {\n lfNode.text = value;\n } else {\n lfNode.properties[attrKey] = value;\n }\n }\n });\n // 处理扩展属性\n if (key === 'task') {\n const fieldEles = node.getElementsByTagName('field');\n if (fieldEles.length) {\n const fieldEle = fieldEles[0];\n const field = {};\n const attr = fieldEle.getElementsByTagName('attr');\n for (var iii = 0; iii < attr.length; iii++) {\n field[attr[iii].getAttribute('name')] = attr[iii].getAttribute('value');\n }\n lfNode.properties.field = field;\n }\n }\n graphData.nodes.push(lfNode);\n // 处理边\n let transitionEles = null;\n let transitionEle = null;\n let edge = {};\n if (key !== 'end') {\n transitionEles = node.getElementsByTagName('transition');\n for (var j = 0, lenn = transitionEles.length; j < lenn; j++) {\n transitionEle = transitionEles[j];\n edge = {};\n edge.id = transitionEle.getAttribute('name');\n edge.type = 'snaker:transition';\n edge.sourceNodeId = lfNode.id;\n edge.targetNodeId = transitionEle.getAttribute('to');\n edge.text = {\n value: transitionEle.getAttribute('displayName') ? transitionEle.getAttribute('displayName') : ''\n };\n edge.properties = {};\n const expr = transitionEle.getAttribute('expr');\n if (expr) {\n edge.properties.expr = expr;\n }\n const g = transitionEle.getAttribute('g');\n if (g) {\n const points = g.split(';');\n if (points.length >= 2) {\n edge.pointsList = [];\n points.forEach(item => {\n const pointArr = item.split(',');\n edge.pointsList.push({\n x: Number(pointArr[0]),\n y: Number(pointArr[1])\n });\n });\n edge.startPoint = edge.pointsList[0];\n edge.endPoint = edge.pointsList[edge.pointsList.length - 1];\n }\n }\n graphData.edges.push(edge);\n }\n }\n }\n }\n });\n return graphData;\n};\n/**\r\n * 将LogicFlow的数据转成snaker的定义文件\r\n * @param {*} data(...processInfo,nodes,edges)\r\n * @returns\r\n */\nconst logicFlowJsonToSnakerXml = data => {\n let xml = '';\n // data的数据由流程定义文件信息+logicFlow数据构成\n // 先构建成流程对象\n const processObj = {\n name: data.name,\n // 流程定义名称\n displayName: data.displayName,\n // 流程定义显示名称\n category: data.category,\n // 流程定义分类\n instanceUrl: data.instanceUrl,\n // 实例启动Url\n h5InstanceUrl: data.h5InstanceUrl,\n // H5实例启动Url\n expireTime: data.expireTime,\n // 期望完成时间\n instanceNoClass: data.instanceNoClass,\n // 实例编号生成类\n preInterceptors: data.preInterceptors,\n // 节点前置拦截器\n postInterceptors: data.postInterceptors // 节点后置拦截器\n };\n /**\r\n * 获取所有子流程\r\n */\n const getSubProcessNodes = () => {\n return data.nodes.filter(node => {\n return node.type === 'snaker:subProcess';\n });\n };\n /**\r\n * 获取开始节点\r\n * @returns\r\n */\n const getStartNode = () => {\n return data.nodes.find(node => {\n return node.type === 'snaker:start';\n });\n };\n /**\r\n * 获取当前节点的所有下一个节点集合\r\n * @param {*} id 当前节点名称\r\n * @returns\r\n */\n const getNextNodes = id => {\n return data.edges.filter(edge => {\n return edge.sourceNodeId === id;\n }).map(edge => {\n return data.nodes.find(node => {\n return node.id === edge.targetNodeId;\n });\n });\n };\n /**\r\n * 获取节点所有输出边\r\n * @param {*} id\r\n * @returns\r\n */\n const getTransitions = id => {\n return data.edges.filter(edge => {\n return edge.sourceNodeId === id;\n }).map(edge => {\n return {\n name: edge.id,\n displayName: edge.text instanceof String || edge.text === undefined ? edge.text : edge.text.value,\n to: edge.targetNodeId,\n // 目地节点id\n expr: edge.properties.expr,\n // 表达式\n g: edge.pointsList.map(point => {\n // 转换点集合\n return point.x + ',' + point.y;\n }).join(';')\n };\n });\n };\n /**\r\n * 构建节点属性\r\n * @param {}} node\r\n * @returns\r\n */\n const buildNode = node => {\n let field;\n if (node.properties.field && Object.keys(node.properties.field).length) {\n field = {\n name: 'ext',\n displayName: '扩展属性',\n attr: Object.keys(node.properties.field).map(key => {\n return {\n name: key,\n value: node.properties.field[key]\n };\n })\n };\n }\n return {\n name: node.id,\n displayName: node.text instanceof String || node.text === undefined ? node.text : node.text.value,\n layout: node.x + ',' + node.y + ',' + (node.properties.width ? node.properties.width : '120') + ',' + (node.properties.height ? node.properties.height : '80'),\n ...node.properties,\n transition: getTransitions(node.id),\n field\n };\n };\n /**\r\n * 特殊字符转义\r\n * @param {*} text\r\n * @returns\r\n */\n const textEncode = text => {\n text = text.replace(/&/g, '&').replace(/\"/g, '"').replace(//g, '>');\n return text;\n };\n /**\r\n * 递归构建节点属性\r\n * @param {} node\r\n */\n const recursionBuildNode = node => {\n const nodeName = node.type.replace('snaker:', '');\n if (!processObj[nodeName + '_' + node.id]) {\n processObj[nodeName + '_' + node.id] = buildNode(node);\n const nextNodes = getNextNodes(node.id);\n nextNodes.forEach(nextNode => {\n recursionBuildNode(nextNode);\n });\n }\n };\n const startNode = getStartNode();\n if (!startNode) {\n // 开始节点不存在,xml不合法\n return '';\n }\n recursionBuildNode(startNode);\n xml = '\\n';\n xml += ' {\n const value = processObj[key];\n if (PROCESS_ATTR_KEYS.includes(key) && value) {\n xml += ' ' + key + '=' + '\"' + textEncode(value) + '\"';\n }\n });\n xml += '>\\n';\n // 生成节点xml\n Object.keys(processObj).forEach(key => {\n const value = processObj[key];\n let nodeName = key.split('_')[0];\n if (NODE_NAMES.includes(nodeName)) {\n if (nodeName === 'wfSubProcess') {\n nodeName = 'subProcess';\n }\n xml += '\\t<' + nodeName;\n // 构造属性\n Object.keys(value).forEach(nodeAttrKey => {\n if (NODE_ATTR_KEYS.includes(nodeAttrKey) && value[nodeAttrKey]) {\n xml += ' ' + nodeAttrKey + '=' + '\"' + textEncode(value[nodeAttrKey]) + '\"';\n }\n });\n xml += '>\\n\\t';\n // 构建transition\n if (value.transition) {\n value.transition.forEach(tran => {\n xml += '\\t {\n if (TRANSITION_ATTR_KEYS.includes(tranAttrKey) && tran[tranAttrKey]) {\n xml += ' ' + tranAttrKey + '=' + '\"' + textEncode(tran[tranAttrKey]) + '\"';\n }\n });\n xml += '>';\n xml += '\\n';\n });\n }\n if (value.field && nodeName === 'task') {\n xml += '\\t\\n';\n value.field.attr.forEach(attrItem => {\n xml += '\\t\\t\\n';\n });\n xml += '\\t\\n';\n }\n xml += '\\t\\n';\n }\n });\n xml += '';\n // 构建子流程模型数据\n const buildSubProcessList = () => {\n const subProcessNodes = getSubProcessNodes();\n const subProcessModel = subProcessNodes.map(n => {\n const subModel = {\n name: n.id,\n // 流程定义名称\n displayName: n.properties.displayName,\n // 流程定义显示名称\n category: n.properties.category,\n // 流程定义分类\n instanceUrl: n.properties.instanceUrl,\n // 实例启动Url\n h5InstanceUrl: n.properties.h5InstanceUrl,\n // H5实例启动Url\n expireTime: n.properties.expireTime,\n // 期望完成时间\n instanceNoClass: n.properties.instanceNoClass,\n // 实例编号生成类\n preInterceptors: n.properties.preInterceptors,\n // 节点前置拦截器\n postInterceptors: n.properties.postInterceptors,\n // 节点后置拦截器\n nodes: data.nodes.filter(item => n.children.includes(item.id)),\n edges: data.edges.filter(item => n.children.includes(item.id))\n };\n subModel.nodes.forEach(item => {\n data.edges.forEach(edge => {\n if (edge.sourceNodeId === item.id) {\n subModel.edges.push(edge);\n }\n });\n });\n return subModel;\n });\n return subProcessModel;\n };\n const subProcessList = buildSubProcessList();\n subProcessList.forEach(processModel => {\n xml += logicFlowJsonToSnakerXml(processModel).replace('', '');\n });\n return xml;\n};\n\n//# sourceURL=webpack://SnakerflowDesigner/./packages/SnakerFlowDesigner/src/snakerflow/tool.js?"); /***/ }), diff --git a/src/main/resources/static/components/plugins/snaker/snakerFlow.vue b/src/main/resources/static/components/plugins/snaker/snakerFlow.vue index 18c28d56..24fd22a4 100644 --- a/src/main/resources/static/components/plugins/snaker/snakerFlow.vue +++ b/src/main/resources/static/components/plugins/snaker/snakerFlow.vue @@ -517,7 +517,7 @@ module.exports = { top: 64px; left: 0; right: 0; - z-index: 1000; + z-index: 19000; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); } diff --git a/src/main/resources/static/components/plugins/snaker/snakerFlowTaskFormAction.vue b/src/main/resources/static/components/plugins/snaker/snakerFlowTaskFormAction.vue index 744751b4..e0e02047 100644 --- a/src/main/resources/static/components/plugins/snaker/snakerFlowTaskFormAction.vue +++ b/src/main/resources/static/components/plugins/snaker/snakerFlowTaskFormAction.vue @@ -1,7 +1,7 @@