@@ -17,18 +17,19 @@ import java.util.List; | |||||
import java.util.Map; | import java.util.Map; | ||||
/** | /** | ||||
* Created by Akmm at 2022/6/8 15:36 | |||||
* 模板生成代码 | |||||
* Created by Akmm at 2022/6/8 15:36 | |||||
* 模板生成代码 | |||||
*/ | */ | ||||
public class CodeGenerator { | public class CodeGenerator { | ||||
private final static String KEY_MODEL = "model"; | private final static String KEY_MODEL = "model"; | ||||
private final static String TEMPLATE_JAVA_BEAN = "../java_bean"; | |||||
private final static String TEMPLATE_JAVA_CACHE = "../java_cache"; | |||||
private final static String TEMPLATE_JAVA_SERVICE = "../java_service"; | |||||
private final static String TEMPLATE_JS_EVENT = "../js_event"; | |||||
private final static String TEMPLATE_JAVA_BEAN = "java_bean"; | |||||
private final static String TEMPLATE_JAVA_CACHE = "java_cache"; | |||||
private final static String TEMPLATE_JAVA_SERVICE = "java_service"; | |||||
private final static String TEMPLATE_JS_EVENT = "js_event"; | |||||
private static CodeGenerator instance = null; | private static CodeGenerator instance = null; | ||||
private Configuration configuration = null; | |||||
private Configuration modelConfiguration = null; | |||||
private Configuration codeConfiguration = null; | |||||
private final String encode = org.apache.commons.codec.CharEncoding.UTF_8; | private final String encode = org.apache.commons.codec.CharEncoding.UTF_8; | ||||
//模板文件所在目录 | //模板文件所在目录 | ||||
@@ -40,32 +41,33 @@ public class CodeGenerator { | |||||
protected CodeGenerator() { | protected CodeGenerator() { | ||||
// templatesDir = this.getClass().getResource("/static/template").getPath(); | // templatesDir = this.getClass().getResource("/static/template").getPath(); | ||||
mapTemplate = YamlUtil.readValue(this.getClass().getResourceAsStream("/static/template/" + SwConsts.modelPath + "/index.yaml"), SwMap.class); | mapTemplate = YamlUtil.readValue(this.getClass().getResourceAsStream("/static/template/" + SwConsts.modelPath + "/index.yaml"), SwMap.class); | ||||
configuration = new Configuration(Configuration.VERSION_2_3_31); | |||||
try { | |||||
configuration.setClassForTemplateLoading(this.getClass(), "/static/template/" + SwConsts.modelPath); | |||||
modelConfiguration = buildConfig("/static/template/" + SwConsts.modelPath); | |||||
codeConfiguration = buildConfig("/static/template/"); | |||||
} | |||||
private Configuration buildConfig(String path) { | |||||
Configuration config = new Configuration(Configuration.VERSION_2_3_31); | |||||
config.setClassForTemplateLoading(this.getClass(), path); | |||||
// configuration.setDirectoryForTemplateLoading(new File(templatesDir)); | // configuration.setDirectoryForTemplateLoading(new File(templatesDir)); | ||||
configuration.setClassicCompatible(true); | |||||
configuration.setDefaultEncoding(encode); | |||||
configuration.setOutputEncoding(encode); | |||||
} catch (Exception e) { | |||||
e.printStackTrace(); | |||||
throw new SwException(e); | |||||
} | |||||
config.setClassicCompatible(true); | |||||
config.setDefaultEncoding(encode); | |||||
config.setOutputEncoding(encode); | |||||
return config; | |||||
} | } | ||||
//页面设计的模板信息 | //页面设计的模板信息 | ||||
public List<Map<String, Object>> getModelTemplates() { | public List<Map<String, Object>> getModelTemplates() { | ||||
return (List<Map<String, Object>>)mapTemplate.get(KEY_MODEL); | |||||
return (List<Map<String, Object>>) mapTemplate.get(KEY_MODEL); | |||||
} | } | ||||
private void initModel(Map<String, Object> model) { | private void initModel(Map<String, Object> model) { | ||||
model.put("newId", new PKGenerator()); | model.put("newId", new PKGenerator()); | ||||
} | } | ||||
public void generate(Map<String, Object> model, String templateName, Writer writer) { | |||||
public void generate(Configuration config, Map<String, Object> model, String templateName, Writer writer) { | |||||
try { | try { | ||||
initModel(model); | initModel(model); | ||||
Template template = configuration.getTemplate(templateName, encode); | |||||
Template template = config.getTemplate(templateName, encode); | |||||
template.setOutputEncoding(encode); | template.setOutputEncoding(encode); | ||||
template.process(model, writer); | template.process(model, writer); | ||||
writer.close(); | writer.close(); | ||||
@@ -76,7 +78,7 @@ public class CodeGenerator { | |||||
} | } | ||||
public void generate(Map<String, Object> model, String templateName, String fileName) { | |||||
public void generate(Configuration config, Map<String, Object> model, String templateName, String fileName) { | |||||
File file = new File(fileName); | File file = new File(fileName); | ||||
if (file.exists()) file.delete(); | if (file.exists()) file.delete(); | ||||
FileOutputStream out = null; | FileOutputStream out = null; | ||||
@@ -85,7 +87,7 @@ public class CodeGenerator { | |||||
out = new FileOutputStream(fileName); | out = new FileOutputStream(fileName); | ||||
initModel(model); | initModel(model); | ||||
Template template = configuration.getTemplate(templateName + ".ftl", StandardCharsets.UTF_8.toString()); | |||||
Template template = config.getTemplate(templateName + ".ftl", StandardCharsets.UTF_8.toString()); | |||||
template.setOutputEncoding(encode); | template.setOutputEncoding(encode); | ||||
template.process(model, new OutputStreamWriter(out, encode)); | template.process(model, new OutputStreamWriter(out, encode)); | ||||
out.flush(); | out.flush(); | ||||
@@ -96,26 +98,26 @@ public class CodeGenerator { | |||||
} | } | ||||
} | } | ||||
public String generate(Map<String, Object> model, String templateName) { | |||||
public String generatePage(Map<String, Object> model, String templateName) { | |||||
StringWriter out = new StringWriter(); | StringWriter out = new StringWriter(); | ||||
generate(model, templateName + ".ftl", out); | |||||
generate(modelConfiguration, model, templateName + ".ftl", out); | |||||
return out.getBuffer().toString(); | return out.getBuffer().toString(); | ||||
} | } | ||||
public void generateBean(Map<String, Object> model, String fileName) { | public void generateBean(Map<String, Object> model, String fileName) { | ||||
generate(model, TEMPLATE_JAVA_BEAN, fileName); | |||||
generate(codeConfiguration, model, TEMPLATE_JAVA_BEAN, fileName); | |||||
} | } | ||||
public void generateCache(Map<String, Object> model, String fileName) { | public void generateCache(Map<String, Object> model, String fileName) { | ||||
generate(model, TEMPLATE_JAVA_CACHE, fileName); | |||||
generate(codeConfiguration, model, TEMPLATE_JAVA_CACHE, fileName); | |||||
} | } | ||||
public void generateService(Map<String, Object> model, String fileName) { | public void generateService(Map<String, Object> model, String fileName) { | ||||
generate(model, TEMPLATE_JAVA_SERVICE, fileName); | |||||
generate(codeConfiguration, model, TEMPLATE_JAVA_SERVICE, fileName); | |||||
} | } | ||||
public void generateJsEvent(Map<String, Object> model, String fileName) { | public void generateJsEvent(Map<String, Object> model, String fileName) { | ||||
generate(model, TEMPLATE_JS_EVENT, fileName); | |||||
generate(codeConfiguration, model, TEMPLATE_JS_EVENT, fileName); | |||||
} | } | ||||
@@ -140,63 +142,4 @@ public class CodeGenerator { | |||||
// return DbEngine.getInstance().nextId(); | // return DbEngine.getInstance().nextId(); | ||||
} | } | ||||
} | } | ||||
/* | |||||
{param:{pa:"aaa"}, | |||||
layout:{ | |||||
c1:[{type:"list", dataset:"ds123", fields:[{field:"", dataset:""}], cfilters:[{}]}] | |||||
} | |||||
*/ | |||||
public static void main(String[] args) { | |||||
StringWriter out = new StringWriter(); | |||||
SwMap map = new SwMap(); | |||||
SwMap param = new SwMap(); | |||||
param.put("pa", "aaaaa"); | |||||
map.put("param", param); | |||||
SwMap layout = new SwMap(); | |||||
map.put("layout", layout); | |||||
List<SwMap> groups = new ArrayList<>(); | |||||
layout.put("c1", groups); | |||||
SwMap area = new SwMap(); | |||||
groups.add(area); | |||||
area.put("type", "list"); | |||||
area.put("dataset", "ds123"); | |||||
List<SwMap> fields = new ArrayList<>(); | |||||
area.put("fields", fields); | |||||
SwMap field = new SwMap(); | |||||
field.put("field", "f123"); | |||||
field.put("dataset", "ds123"); | |||||
field.put("label", "字段123"); | |||||
fields.add(field); | |||||
field = new SwMap(); | |||||
field.put("field", "f121"); | |||||
field.put("label", "字段121"); | |||||
field.put("dataset", "ds123"); | |||||
fields.add(field); | |||||
field = new SwMap(); | |||||
field.put("field", "f122"); | |||||
field.put("label", "字段122"); | |||||
field.put("dataset", "ds123"); | |||||
fields.add(field); | |||||
List<SwMap> filters = new ArrayList<>(); | |||||
area.put("cfilters", filters); | |||||
field = new SwMap(); | |||||
field.put("field", "f122"); | |||||
field.put("dataset", "ds123"); | |||||
field.put("label", "字段122"); | |||||
field.put("maxlength", 20); | |||||
filters.add(field); | |||||
map.put("title", "thisIsATest!"); | |||||
map.put("newId", new PKGenerator()); | |||||
CodeGenerator.getInstance().generate(map, "model_card.ftl", out); | |||||
System.out.println(out.getBuffer().toString()); | |||||
} | |||||
} | } |
@@ -1,8 +1,10 @@ | |||||
package cc.smtweb.system.bpm.web.design.flow.define; | package cc.smtweb.system.bpm.web.design.flow.define; | ||||
import cc.smtweb.system.bpm.web.design.flow.FlowConst; | |||||
import lombok.Data; | import lombok.Data; | ||||
import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
import java.util.ArrayList; | |||||
import java.util.List; | import java.util.List; | ||||
/** | /** | ||||
@@ -31,4 +33,21 @@ public class ProcInfo { | |||||
} | } | ||||
return null; | return null; | ||||
} | } | ||||
//获取任务名称 | |||||
public String getActNameById(String id) { | |||||
Activity act = findActivity(id); | |||||
return act != null ? act.getLabel() : ""; | |||||
} | |||||
//获取结束节点 | |||||
public List<Activity> findEndActivity() { | |||||
List<Activity> list = new ArrayList<>(); | |||||
for (Activity act: activities) { | |||||
if (act.getType() == FlowConst.ActivityType.END.value) { | |||||
list.add(act); | |||||
} | |||||
} | |||||
return list; | |||||
} | |||||
} | } |
@@ -462,7 +462,7 @@ public class ModelFormHelper { | |||||
} | } | ||||
tmplModel.put("widgetRef", widgetRef); | tmplModel.put("widgetRef", widgetRef); | ||||
tmplModel.put("tmplType", tmplId); | tmplModel.put("tmplType", tmplId); | ||||
final String model = CodeGenerator.getInstance().generate(tmplModel, tmplId); | |||||
final String model = CodeGenerator.getInstance().generatePage(tmplModel, tmplId); | |||||
form.setContent(model); | form.setContent(model); | ||||
// form.setContent(buildSaveModel(form)); | // form.setContent(buildSaveModel(form)); | ||||
} | } | ||||
@@ -1,23 +0,0 @@ | |||||
package cc.smtweb.system.bpm.web.engine.flow; | |||||
import cc.smtweb.framework.core.common.R; | |||||
import cc.smtweb.framework.core.common.SwMap; | |||||
import cc.smtweb.framework.core.exception.BizException; | |||||
import cc.smtweb.framework.core.session.UserSession; | |||||
import cc.smtweb.system.bpm.web.design.form.ModelForm; | |||||
import cc.smtweb.system.bpm.web.design.form.ModelFormHelper; | |||||
import cc.smtweb.system.bpm.web.engine.dynPage.AbstractDynPageHandler; | |||||
/** | |||||
* Created by Akmm at 2022/4/21 17:53 | |||||
* 保存指定数据集操作 | |||||
* 入参:{pageId, data:} | |||||
*/ | |||||
public class AbstractFlowHandler extends AbstractDynPageHandler { | |||||
@Override | |||||
public void init(SwMap params, UserSession us) { | |||||
super.init(params, us); | |||||
ModelForm form = ModelFormHelper.getFromCache(pageId); | |||||
if (form.getBillType() <= 0L) throw new BizException("此页面非单据页面,不能使用流程服务!"); | |||||
} | |||||
} |
@@ -1,19 +0,0 @@ | |||||
package cc.smtweb.system.bpm.web.engine.flow; | |||||
import cc.smtweb.framework.core.common.R; | |||||
import cc.smtweb.system.bpm.web.engine.dynPage.AbstractDynPageHandler; | |||||
/** | |||||
* Created by Akmm at 2022/4/21 17:53 | |||||
* 保存指定数据集操作 | |||||
* 入参:{pageId, data:} | |||||
*/ | |||||
public class FlowHandler extends AbstractDynPageHandler { | |||||
/** | |||||
* 办理签收 | |||||
*/ | |||||
public R handle() { | |||||
return R.success(); | |||||
} | |||||
} |
@@ -1,11 +1,18 @@ | |||||
package cc.smtweb.system.bpm.web.engine.flow; | package cc.smtweb.system.bpm.web.engine.flow; | ||||
import cc.smtweb.framework.core.db.DbEngine; | |||||
import cc.smtweb.framework.core.db.EntityHelper; | |||||
import cc.smtweb.framework.core.exception.BizException; | import cc.smtweb.framework.core.exception.BizException; | ||||
import cc.smtweb.system.bpm.web.design.flow.FlowConst; | import cc.smtweb.system.bpm.web.design.flow.FlowConst; | ||||
import cc.smtweb.system.bpm.web.design.flow.ModelProcHelper; | import cc.smtweb.system.bpm.web.design.flow.ModelProcHelper; | ||||
import cc.smtweb.system.bpm.web.design.flow.define.Activity; | import cc.smtweb.system.bpm.web.design.flow.define.Activity; | ||||
import cc.smtweb.system.bpm.web.design.flow.define.ProcInfo; | import cc.smtweb.system.bpm.web.design.flow.define.ProcInfo; | ||||
import cc.smtweb.system.bpm.web.design.flow.define.Trans; | import cc.smtweb.system.bpm.web.design.flow.define.Trans; | ||||
import cc.smtweb.system.bpm.web.design.form.ModelForm; | |||||
import cc.smtweb.system.bpm.web.design.form.ModelFormHelper; | |||||
import cc.smtweb.system.bpm.web.engine.flow.entity.Candidate; | |||||
import cc.smtweb.system.bpm.web.engine.flow.entity.Task; | |||||
import cc.smtweb.system.bpm.web.engine.flow.entity.TaskRel; | |||||
import java.util.ArrayList; | import java.util.ArrayList; | ||||
import java.util.List; | import java.util.List; | ||||
@@ -15,6 +22,27 @@ import java.util.List; | |||||
* 单据 | * 单据 | ||||
*/ | */ | ||||
public class FlowHelper { | public class FlowHelper { | ||||
//获取页面单据类型 | |||||
public static long getBillType(String pageId) { | |||||
ModelForm form = ModelFormHelper.getFromCache(pageId); | |||||
long billType = form.getBillType(); | |||||
if (billType <= 0L) throw new BizException("此页面非单据页面,不能使用流程服务!"); | |||||
return billType; | |||||
} | |||||
//是否我的待办任务 | |||||
public static boolean isMyWaitedTask(long task_id, long user_id) { | |||||
return DbEngine.getInstance().isExists("select 1 from " + EntityHelper.getSchemaTableName(Candidate.ENTITY_NAME) + | |||||
" where task_id=? and user_id=?", task_id, user_id); | |||||
} | |||||
public static boolean isMySubmitTask(long task_id, long user_id) { | |||||
return DbEngine.getInstance().isExists("select 1 from " + EntityHelper.getSchemaTableName(TaskRel.ENTITY_NAME) + | |||||
" r inner join " + EntityHelper.getSchemaTableName(Task.ENTITY_NAME) + " t on t.task_id = r.before_task_bid\n" + | |||||
" where r.task_id=? and t.handler=?", task_id, user_id); | |||||
} | |||||
/** | /** | ||||
* 得到指定活动的下一任务节点 | * 得到指定活动的下一任务节点 | ||||
* | * | ||||
@@ -22,7 +50,7 @@ public class FlowHelper { | |||||
* @return | * @return | ||||
*/ | */ | ||||
public static List<Activity> getNextActivity(FlowInstance flowInstance) throws Exception { | public static List<Activity> getNextActivity(FlowInstance flowInstance) throws Exception { | ||||
Activity act = ModelProcHelper.getNextActivity(flowInstance.act_inst.getPrcId(), flowInstance.act_inst.getActId()); | |||||
Activity act = ModelProcHelper.getNextActivity(flowInstance.getActInst().getPrcId(), flowInstance.getActInst().getActId()); | |||||
if (act == null) { | if (act == null) { | ||||
throw new BizException("未找到可用的活动节点定义!"); | throw new BizException("未找到可用的活动节点定义!"); | ||||
} | } | ||||
@@ -45,9 +73,9 @@ public class FlowHelper { | |||||
private static void buildNextActivityRes(Activity act, FlowInstance flowInstance, List<Activity> listRet) throws Exception { | private static void buildNextActivityRes(Activity act, FlowInstance flowInstance, List<Activity> listRet) throws Exception { | ||||
//待返回的结果集 | //待返回的结果集 | ||||
// if (act.getActType() == FlowConst.ActivityType.scriptTask) 自动任务暂不支持 | // if (act.getActType() == FlowConst.ActivityType.scriptTask) 自动任务暂不支持 | ||||
ProcInfo proc = flowInstance.proc_def.getProcInfo(); | |||||
ProcInfo proc = flowInstance.getProcDef().getProcInfo(); | |||||
if (act.getType() == FlowConst.ActivityType.CONDITION.value) {//条件分支 | if (act.getType() == FlowConst.ActivityType.CONDITION.value) {//条件分支 | ||||
List<Trans> list = ModelProcHelper.getNextTrans(flowInstance.proc_inst.getPrcId(), act.getId()); | |||||
List<Trans> list = ModelProcHelper.getNextTrans(flowInstance.getProcInst().getPrcId(), act.getId()); | |||||
for (Trans t : list) { | for (Trans t : list) { | ||||
if (flowInstance.execTrans(t.getExpr())) { | if (flowInstance.execTrans(t.getExpr())) { | ||||
Activity a = proc.findActivity(t.getDst()); | Activity a = proc.findActivity(t.getDst()); | ||||
@@ -59,7 +87,7 @@ public class FlowHelper { | |||||
} | } | ||||
} | } | ||||
} else if (act.getType() == FlowConst.ActivityType.PARALLEL.value) {//并发分支 | } else if (act.getType() == FlowConst.ActivityType.PARALLEL.value) {//并发分支 | ||||
List<Trans> list = ModelProcHelper.getNextTrans(flowInstance.proc_def.getId(), act.getId()); | |||||
List<Trans> list = ModelProcHelper.getNextTrans(flowInstance.getProcDef().getId(), act.getId()); | |||||
for (Trans t : list) { | for (Trans t : list) { | ||||
if (flowInstance.execTrans(t.getExpr())) { | if (flowInstance.execTrans(t.getExpr())) { | ||||
Activity a = proc.findActivity(t.getDst()); | Activity a = proc.findActivity(t.getDst()); | ||||
@@ -1,53 +1,55 @@ | |||||
package cc.smtweb.system.bpm.web.engine.flow; | package cc.smtweb.system.bpm.web.engine.flow; | ||||
import cc.smtweb.framework.core.common.SwMap; | |||||
import cc.smtweb.framework.core.db.DbEngine; | import cc.smtweb.framework.core.db.DbEngine; | ||||
import cc.smtweb.framework.core.db.EntityHelper; | import cc.smtweb.framework.core.db.EntityHelper; | ||||
import cc.smtweb.framework.core.exception.BizException; | import cc.smtweb.framework.core.exception.BizException; | ||||
import cc.smtweb.framework.core.exception.SwException; | |||||
import cc.smtweb.framework.core.session.UserSession; | import cc.smtweb.framework.core.session.UserSession; | ||||
import cc.smtweb.framework.core.util.CommUtil; | |||||
import cc.smtweb.framework.core.util.DateUtil; | import cc.smtweb.framework.core.util.DateUtil; | ||||
import cc.smtweb.framework.core.util.NumberUtil; | import cc.smtweb.framework.core.util.NumberUtil; | ||||
import cc.smtweb.system.bpm.web.design.flow.FlowConst; | import cc.smtweb.system.bpm.web.design.flow.FlowConst; | ||||
import cc.smtweb.system.bpm.web.design.flow.ModelProc; | import cc.smtweb.system.bpm.web.design.flow.ModelProc; | ||||
import cc.smtweb.system.bpm.web.design.flow.ModelProcHelper; | import cc.smtweb.system.bpm.web.design.flow.ModelProcHelper; | ||||
import cc.smtweb.system.bpm.web.design.flow.define.Activity; | import cc.smtweb.system.bpm.web.design.flow.define.Activity; | ||||
import cc.smtweb.system.bpm.web.engine.flow.define.ProcinstEntity; | |||||
import cc.smtweb.system.bpm.web.engine.flow.define.TaskEntity; | |||||
import cc.smtweb.system.bpm.web.sys.base.dict.DictCache; | |||||
import cc.smtweb.system.bpm.web.engine.flow.entity.*; | |||||
import cc.smtweb.system.bpm.web.sys.user.dept.Dept; | import cc.smtweb.system.bpm.web.sys.user.dept.Dept; | ||||
import cc.smtweb.system.bpm.web.sys.user.dept.DeptCache; | import cc.smtweb.system.bpm.web.sys.user.dept.DeptCache; | ||||
import cc.smtweb.system.bpm.web.sys.user.party.Party; | import cc.smtweb.system.bpm.web.sys.user.party.Party; | ||||
import cc.smtweb.system.bpm.web.sys.user.party.PartyCache; | import cc.smtweb.system.bpm.web.sys.user.party.PartyCache; | ||||
import cc.smtweb.system.bpm.web.sys.user.user.UserCache; | |||||
import lombok.Data; | |||||
import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
import java.util.ArrayList; | |||||
import java.util.HashMap; | |||||
import java.util.List; | |||||
import java.util.Map; | |||||
import java.util.*; | |||||
/** | /** | ||||
* Created by Akmm at 2020/3/4 11:35 | * Created by Akmm at 2020/3/4 11:35 | ||||
* 单据流程实例组件 | * 单据流程实例组件 | ||||
*/ | */ | ||||
@Data | |||||
public class FlowInstance { | public class FlowInstance { | ||||
//会话信息 | //会话信息 | ||||
private UserSession us; | private UserSession us; | ||||
//流程定义 | //流程定义 | ||||
public ModelProc proc_def; | |||||
private ModelProc procDef; | |||||
//流程实例 | //流程实例 | ||||
public ProcinstEntity proc_inst; | |||||
private ProcInst procInst; | |||||
//活动任务 | //活动任务 | ||||
public TaskEntity act_inst; | |||||
private Task actInst; | |||||
//操作类型 新增/编辑/查看 | //操作类型 新增/编辑/查看 | ||||
public int opt_mode = FlowConst.OperatorType.VIEW; | |||||
private int opt_mode = FlowConst.OperatorType.VIEW; | |||||
//流程执行变量 | //流程执行变量 | ||||
// public Map<String, String> variables = new HashMap<>(); | // public Map<String, String> variables = new HashMap<>(); | ||||
//当前任务 | //当前任务 | ||||
public List<Map<String, String>> tasks = new ArrayList<>(); | |||||
private List<Map<String, String>> tasks = new ArrayList<>(); | |||||
//数据提供者 | |||||
private FlowProvider provider = new FlowProvider(); | |||||
public FlowInstance(UserSession us) { | public FlowInstance(UserSession us) { | ||||
this.us = us; | this.us = us; | ||||
@@ -56,11 +58,12 @@ public class FlowInstance { | |||||
//能否编辑 | //能否编辑 | ||||
public boolean canEdit() { | public boolean canEdit() { | ||||
//新增状态可以编辑 | //新增状态可以编辑 | ||||
if (opt_mode == FlowConst.OperatorType.NEW || proc_inst.getStatu() == FlowConst.InstanceStatu.BEGIN.value) | |||||
if (opt_mode == FlowConst.OperatorType.NEW || procInst.getStatu() == FlowConst.InstanceStatu.BEGIN.value) | |||||
return true; | return true; | ||||
return false; | return false; | ||||
} | } | ||||
/** | /** | ||||
* 流程条件 | * 流程条件 | ||||
* | * | ||||
@@ -88,7 +91,7 @@ public class FlowInstance { | |||||
* @param bill_type | * @param bill_type | ||||
* @throws Exception | * @throws Exception | ||||
*/ | */ | ||||
public void create(int bill_type) throws Exception { | |||||
public void create(int bill_type) { | |||||
Party loginParty = PartyCache.getInstance().get(us.getPartyId()); | Party loginParty = PartyCache.getInstance().get(us.getPartyId()); | ||||
if (EntityHelper.isEmpty(loginParty)) { | if (EntityHelper.isEmpty(loginParty)) { | ||||
throw new BizException("当前登录人员管理单位信息为空,请检查后保存!"); | throw new BizException("当前登录人员管理单位信息为空,请检查后保存!"); | ||||
@@ -99,45 +102,45 @@ public class FlowInstance { | |||||
loginDept = new Dept(); | loginDept = new Dept(); | ||||
} | } | ||||
proc_def = ModelProcHelper.getBillProc(bill_type, us.getUserId()); //根据单据分类获取流程定义 | |||||
if (EntityHelper.isEmpty(proc_def)) { | |||||
procDef = ModelProcHelper.getBillProc(bill_type, us.getUserId()); //根据单据分类获取流程定义 | |||||
if (EntityHelper.isEmpty(procDef)) { | |||||
// throw new BizException("没有找到对应的流程定义,请到【系统设置】-【单据流程分配】为当前单据类型【" + BillTypeCache.getInstance().getName(bill_type) + "】分配工作流程!"); | // throw new BizException("没有找到对应的流程定义,请到【系统设置】-【单据流程分配】为当前单据类型【" + BillTypeCache.getInstance().getName(bill_type) + "】分配工作流程!"); | ||||
} | } | ||||
Activity start = ModelProcHelper.getFirstActivity(proc_def.getEntityId()); | |||||
Activity start = ModelProcHelper.getFirstActivity(procDef.getEntityId()); | |||||
if (start == null) { | if (start == null) { | ||||
throw new BizException("对应的流程没有定义有效的活动步骤!"); | throw new BizException("对应的流程没有定义有效的活动步骤!"); | ||||
} | } | ||||
opt_mode = FlowConst.OperatorType.NEW; | opt_mode = FlowConst.OperatorType.NEW; | ||||
proc_inst = new ProcinstEntity(); | |||||
proc_inst.init(); | |||||
proc_inst.setEntityId(DbEngine.getInstance().nextId()); | |||||
proc_inst.setPartyId(loginParty.getEntityId()); | |||||
proc_inst.setDeptId(loginDept.getEntityId()); | |||||
proc_inst.setBillType(bill_type); | |||||
proc_inst.setMakeDate(DateUtil.nowDateTimeLong()); | |||||
proc_inst.setPrcId(proc_def.getEntityId()); | |||||
proc_inst.setStartTime(DateUtil.nowDateTimeLong()); | |||||
proc_inst.setUserId(us.getUserId()); | |||||
proc_inst.setStatu(FlowConst.InstanceStatu.BEGIN.value); | |||||
act_inst = new TaskEntity(); | |||||
act_inst.init(); | |||||
act_inst.setEntityId(DbEngine.getInstance().nextId()); | |||||
act_inst.setId(proc_inst.getEntityId()); | |||||
act_inst.setPrcId(proc_def.getEntityId()); | |||||
act_inst.setActId(start.getId()); | |||||
act_inst.setHandler(us.getUserId()); | |||||
act_inst.setStartTime(DateUtil.nowDateTimeLong()); | |||||
act_inst.setStatu(FlowConst.ActivityStatu.HANDLE.value); | |||||
act_inst.setMake(true); | |||||
act_inst.setSign(false); | |||||
act_inst.setReject(false); | |||||
act_inst.setRetake(false); | |||||
proc_inst.setTaskId(act_inst.getEntityId()); | |||||
procInst = new ProcInst(); | |||||
procInst.init(); | |||||
procInst.setEntityId(DbEngine.getInstance().nextId()); | |||||
procInst.setPartyId(loginParty.getEntityId()); | |||||
procInst.setDeptId(loginDept.getEntityId()); | |||||
procInst.setBillType(bill_type); | |||||
procInst.setMakeDate(DateUtil.nowDateTimeLong()); | |||||
procInst.setPrcId(procDef.getEntityId()); | |||||
procInst.setStartTime(DateUtil.nowDateTimeLong()); | |||||
procInst.setUserId(us.getUserId()); | |||||
procInst.setStatu(FlowConst.InstanceStatu.BEGIN.value); | |||||
actInst = new Task(); | |||||
actInst.init(); | |||||
actInst.setEntityId(DbEngine.getInstance().nextId()); | |||||
actInst.setId(procInst.getEntityId()); | |||||
actInst.setPrcId(procDef.getEntityId()); | |||||
actInst.setActId(start.getId()); | |||||
actInst.setHandler(us.getUserId()); | |||||
actInst.setStartTime(DateUtil.nowDateTimeLong()); | |||||
actInst.setStatu(FlowConst.ActivityStatu.HANDLE.value); | |||||
actInst.setMake(true); | |||||
actInst.setSign(false); | |||||
actInst.setReject(false); | |||||
actInst.setRetake(false); | |||||
procInst.setTaskId(actInst.getEntityId()); | |||||
} | } | ||||
/** | /** | ||||
@@ -149,28 +152,759 @@ public class FlowInstance { | |||||
long user_id = us.getUserId(); | long user_id = us.getUserId(); | ||||
//校验权限,当前人员有权限干不,没权限直接抛异常 | //校验权限,当前人员有权限干不,没权限直接抛异常 | ||||
// checkPermission(); | // checkPermission(); | ||||
if (act_inst.getStatu() != FlowConst.ActivityStatu.WAIT.value) { | |||||
if (actInst.getStatu() != FlowConst.ActivityStatu.WAIT.value) { | |||||
throw new BizException("当前任务非待办状态,不能办理失败!"); | throw new BizException("当前任务非待办状态,不能办理失败!"); | ||||
} | } | ||||
act_inst.setHandler(user_id); | |||||
act_inst.setStartTime(DateUtil.nowDateTimeLong()); | |||||
act_inst.setStatu(FlowConst.ActivityStatu.HANDLE.value); | |||||
actInst.setHandler(user_id); | |||||
actInst.setStartTime(DateUtil.nowDateTimeLong()); | |||||
actInst.setStatu(FlowConst.ActivityStatu.HANDLE.value); | |||||
procInst.setTaskId(actInst.getEntityId()); | |||||
procInst.setStatu(FlowConst.InstanceStatu.RUNING.value); | |||||
DbEngine.getInstance().findDao(Task.ENTITY_NAME).updateEntity(actInst); | |||||
DbEngine.getInstance().findDao(ProcInst.ENTITY_NAME).updateEntity(procInst); | |||||
buildBillLog(FlowConst.Button.HANDLE.value, actInst, null); | |||||
// comp.transCallback(FlowConst.FlowOptType.RETAKE.value, act_inst, null); | |||||
} | |||||
//从页面参数加载流程实例 | |||||
public void readFromPage(SwMap map) { | |||||
procInst.readFromMap(map); | |||||
actInst.setPriId(procInst.getId()); | |||||
actInst.setEntityId(procInst.getTaskId()); | |||||
} | |||||
/** | |||||
* 从数据库加载已有流程实例 | |||||
* | |||||
* @param bill_id | |||||
* @throws Exception | |||||
*/ | |||||
public void load(long bill_id, long task_id) { | |||||
procInst = provider.findProcInst(bill_id); | |||||
procDef = ModelProcHelper.getFromCache(procInst.getPrcId()); | |||||
task_id = getTaskId(task_id); | |||||
if (task_id > 0L) { | |||||
actInst = provider.findTask(task_id); | |||||
} | |||||
} | |||||
/** | |||||
* 当前任务处于待办时: | |||||
* 上一步办理人进来,看上一个步骤,否则看当前步骤 | |||||
* | |||||
* @param task_id | |||||
* @return | |||||
*/ | |||||
private long getTaskId(long task_id) { | |||||
if (task_id > 0L) return task_id; | |||||
Task curTask = provider.findTask(task_id); | |||||
if (EntityHelper.isEmpty(curTask) || curTask.getStatu() != FlowConst.ActivityStatu.WAIT.value) return task_id; | |||||
Task preAct = provider.findBeforeTask(task_id); | |||||
if (EntityHelper.isEmpty(preAct)) return task_id; | |||||
if (preAct.getHandler() == us.getUserId()) { | |||||
return preAct.getId(); | |||||
} | |||||
return task_id; | |||||
} | |||||
/** | |||||
* 矫正默认任务及获取可选任务列表,供界面选择 | |||||
* | |||||
* @return | |||||
* @throws Exception | |||||
*/ | |||||
public List<Task> adjustTasks() { | |||||
List<Task> listTask = new ArrayList<>(); | |||||
if (opt_mode == FlowConst.OperatorType.NEW || procInst.getStatu() == FlowConst.InstanceStatu.DISUSE.value) { | |||||
listTask.add(actInst); | |||||
return listTask; | |||||
} | |||||
//获取当前单据活动任务列表及当前任务 | |||||
// act_inst = null; | |||||
List<Task> list = provider.findCurTask(procInst.getId()); | |||||
listTask.addAll(list); | |||||
//当前登录用户 | |||||
String sqlIn = ""; | |||||
for (Task act : list) { | |||||
//如果办理人是当前用户,则置此任务为当前任务 | |||||
// if (act_inst == null) { | |||||
//我办理中的任务:非待办,且是我的任务 | |||||
if (act.getStatu() != FlowConst.ActivityStatu.WAIT.value) { | |||||
if (us.getUserId() == act.getHandler()) { | |||||
actInst = act; | |||||
} | |||||
} else if (FlowHelper.isMyWaitedTask(act.getId(), us.getUserId())) { | |||||
//我的待办任务 | |||||
actInst = act; | |||||
act.setHandler(us.getUserId()); | |||||
} else { | |||||
Activity ae = procDef.getProcInfo().findActivity(act.getActId()); | |||||
if (ae != null && ae.getType() == FlowConst.ActivityType.END.value) { | |||||
actInst = act; | |||||
} | |||||
} | |||||
// } | |||||
//如果当前任务为待办理,那么要找其前置任务,作为活动任务,方便取回 | |||||
if (act.getStatu() == FlowConst.ActivityStatu.WAIT.value) { | |||||
sqlIn += "," + act.getEntityId(); | |||||
} | |||||
} | |||||
//找待办任务的前置任务,便于取回 | |||||
if (StringUtils.isNotEmpty(sqlIn)) { | |||||
List<Task> list1 = provider.findBeforeTasks(sqlIn.substring(1)); | |||||
listTask.addAll(list1); | |||||
if (actInst == null) { | |||||
for (Task act : list1) { | |||||
//如果办理人是当前用户,则置此任务为当前任务 | |||||
if (us.getUserId() == act.getHandler()) { | |||||
actInst = act; | |||||
break; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
//没有我的处理任务,用流程当前任务来 | |||||
if (actInst == null) { | |||||
actInst = provider.findTask(procInst.getTaskId()); | |||||
} | |||||
return listTask; | |||||
} | |||||
proc_inst.setTaskId(act_inst.getEntityId()); | |||||
proc_inst.setStatu(FlowConst.InstanceStatu.RUNING.value); | |||||
/** | |||||
* 设置单据描述及链接地址,待办中展示 | |||||
* | |||||
* @param bill_info | |||||
* @param bill_url | |||||
*/ | |||||
public void setBillInfo(String bill_code, String bill_info, String bill_url) { | |||||
procInst.setBillInfo(bill_info); | |||||
procInst.setBillCode(bill_code); | |||||
// procInst.setBillUrl(bill_url); todo | |||||
} | |||||
//启动流程 | |||||
public void save() { | |||||
if (opt_mode == FlowConst.OperatorType.NEW) { | |||||
DbEngine.getInstance().findDao(ProcInst.class).insertEntity(procInst); | |||||
DbEngine.getInstance().findDao(Task.class).insertEntity(actInst); | |||||
buildBillLog(FlowConst.Button.ADD.value, null, null); | |||||
opt_mode = FlowConst.OperatorType.EDIT; | |||||
} else { | |||||
DbEngine.getInstance().findDao(ProcInst.class).updateEntity(procInst); | |||||
if (actInst != null) { | |||||
DbEngine.getInstance().findDao(Task.class).updateEntity(actInst); | |||||
} | |||||
} | |||||
} | |||||
DbEngine.getInstance().findDao(TaskEntity.ENTITY_NAME).updateEntity(act_inst); | |||||
DbEngine.getInstance().findDao(ProcinstEntity.ENTITY_NAME).updateEntity(proc_inst); | |||||
/** | |||||
* 删除流程 | |||||
* | |||||
* @throws Exception | |||||
*/ | |||||
public void delete() { | |||||
DbEngine.getInstance().findDao(ProcInst.class).deleteEntity(procInst); | |||||
DbEngine.getInstance().findDao(Task.class).deleteEntity("where bill_id=?", procInst.getId()); | |||||
DbEngine.getInstance().findDao(Candidate.class).deleteEntity("where bill_id=?", procInst.getId()); | |||||
DbEngine.getInstance().findDao(Care.class).deleteEntity("where bill_id=?", procInst.getId()); | |||||
DbEngine.getInstance().findDao(Comment.class).deleteEntity("where bill_id=?", procInst.getId()); | |||||
DbEngine.getInstance().findDao(Sign.class).deleteEntity("where bill_id=?", procInst.getId()); | |||||
DbEngine.getInstance().findDao(TaskRel.class).deleteEntity("where bill_id=?", procInst.getId()); | |||||
} | |||||
buildBillLog(FlowConst.Button.HANDLE.value, act_inst, null); | |||||
// comp.transCallback(CmEnum.FlowOptType.RETAKE.value, act_inst, null); | |||||
/** | |||||
* 返回页面前的设置 | |||||
*/ | |||||
public void resetPage() { | |||||
List<Task> listTask = adjustTasks(); | |||||
//可选步骤 | |||||
tasks.clear(); | |||||
String next_text = procDef.getProcInfo().getActNameById(actInst.getActId()); | |||||
int index = 0; | |||||
for (Task act : listTask) { | |||||
Map<String, String> row = new HashMap<>(); | |||||
tasks.add(row); | |||||
row.put("id", String.valueOf(act.getId())); | |||||
if (act.getId() == actInst.getId() && listTask.size() > 1 && index != 0) { | |||||
next_text = "待" + next_text; | |||||
} else { | |||||
next_text = procDef.getProcInfo().getActNameById(act.getActId()); | |||||
} | |||||
row.put("text", next_text); | |||||
index++; | |||||
} | |||||
resetButtons(); | |||||
} | } | ||||
public void resetButtons() { | |||||
Map<String, Integer> buttons = new HashMap<>(); | |||||
//按钮 | |||||
buttons.clear(); | |||||
long user_id = us.getUserId(); | |||||
/* | |||||
//菜单权限 | |||||
Map<String, String> mapPermisson = MenuHelper.getPermission(context); | |||||
//新增不要显示历史 | |||||
boolean isNew = opt_mode == FlowConst.OperatorType.NEW; | |||||
boolean isAdmin = UserBaseEntityBuffer.getInstance().isAdmin(user_id); | |||||
boolean canEdit = MenuHelper.hasPermisson(mapPermisson, FlowConst.MenuFuncRight.ADD.value) || MenuHelper.hasPermisson(mapPermisson, FlowConst.MenuFuncRight.UPD.value); | |||||
//能否新增,菜单有授权+单据有流程分配 | |||||
boolean canAdd = canEdit && BillFlowWfHelper.getBillProc(procInst.getBillType(), user_id) != null; | |||||
boolean canDel = MenuHelper.hasPermisson(mapPermisson, FlowConst.MenuFuncRight.DEL.value); | |||||
boolean canDis = MenuHelper.hasPermisson(mapPermisson, FlowConst.MenuFuncRight.DIS.value) && canEdit && !isNew; | |||||
//非制单人能否修改单据 | |||||
boolean othCanEdit = BillFlowWfHelper.getPropBool(procDef.getEntityId(), FlowConst.NULL_STR, FlowConst.ProcProperty.CAN_EDIT_OTHER); | |||||
buttons.put(FlowConst.Button.LOG, isNew ? 0 : 1); | |||||
buttons.put(FlowConst.Button.WORD, isNew || !MenuHelper.hasPermisson(mapPermisson, FlowConst.MenuFuncRight.EXP.value) ? 0 : 1); | |||||
buttons.put(FlowConst.Button.EXCEL, isNew || !MenuHelper.hasPermisson(mapPermisson, FlowConst.MenuFuncRight.EXP.value) ? 0 : 1); | |||||
buttons.put(FlowConst.Button.DEL, !isNew ? 1 : 0); | |||||
buttons.put(FlowConst.Button.ADD, canAdd ? 1 : 0); | |||||
//buttons.put(FlowConst.Button.DISUSE, canDis ? 1 : 0); | |||||
buttons.put(FlowConst.Button.DISUSE, 0); | |||||
//单据作废 | |||||
if (procInst.getStatu() == FlowConst.InstanceStatu.DISUSE.value) { | |||||
buttons.put(FlowConst.Button.DISUSE, 0); | |||||
buttons.put(FlowConst.Button.DEL, 0); | |||||
context.getDfpResponse().put("buttons", buttons); | |||||
return; | |||||
} | |||||
if (procInst.getStatu() == FlowConst.InstanceStatu.FINISH.value) { | |||||
buttons.put(FlowConst.Button.DEL, 0); | |||||
} | |||||
ActivityEntity act = ActivityEntityBuffer.getInstance().get(actInst.getActId()); | |||||
//非制单状态时 编辑权限受 功能权限+流程修改权限+流程节点修改权限 | |||||
boolean notMakeEdit = act != null && act.getActEdit() && othCanEdit && MenuHelper.hasPermisson(mapPermisson, FlowConst.MenuFuncRight.UPD.value); | |||||
boolean handler_make = isHandleMakeEx(act); | |||||
//当前任务是我办理的(我的待办任务,前面读取的时候也已经写了办理人为我了): | |||||
if (act == null || act.getActType() == FlowConst.ActivityType.endEvent.value) { | |||||
if (isAdmin) buttons.put(FlowConst.Button.RETAKE, 1); | |||||
buttons.put(FlowConst.Button.DISUSE, 0); | |||||
} else if (user_id.equalsIgnoreCase(actInst.getHandler()) || isAdmin) { | |||||
if (actInst.getStatu() == FlowConst.ActivityStatu.WAIT.value) { | |||||
//待办任务,显示办理按钮 | |||||
if (notMakeEdit || handler_make) { | |||||
buttons.put(FlowConst.Button.HANDLER, 1); | |||||
buttons.put(FlowConst.Button.SUBMIT, 0); | |||||
} else { | |||||
buttons.put(FlowConst.Button.SUBMIT, 1); | |||||
buttons.put(FlowConst.Button.REJECT, 1); | |||||
buttons.put(FlowConst.Button.REJECT_MAKE, 1); | |||||
} | |||||
} else if (actInst.getStatu() == FlowConst.ActivityStatu.HANDLE.value) { | |||||
buttons.put(FlowConst.Button.SUBMIT, 1); | |||||
//办理中任务,提交/驳回 | |||||
if (actInst.isMake()) { | |||||
buttons.put(FlowConst.Button.SAVE, 1); | |||||
if (canDel && !isNew) { | |||||
buttons.put(FlowConst.Button.DEL, 1); | |||||
} | |||||
} else { | |||||
if (notMakeEdit || handler_make) { | |||||
buttons.put(FlowConst.Button.SAVE, 1); | |||||
} | |||||
buttons.put(FlowConst.Button.REJECT, 1); | |||||
buttons.put(FlowConst.Button.REJECT_MAKE, 1); | |||||
} | |||||
} else if (actInst.getStatu() == FlowConst.ActivityStatu.SUBMIT.value) { | |||||
//我已提交的任务,取回(前面已经过滤掉不能取回的任务:下一任务已办理) | |||||
buttons.put(FlowConst.Button.RETAKE, 1); | |||||
} | |||||
} else if (actInst.getStatu() == FlowConst.ActivityStatu.WAIT.value && new ActinstDao().isMyWaitedTask(actInst.getTaskId(), user_id)) { | |||||
//待办任务,显示办理按钮 | |||||
if (notMakeEdit || handler_make) { | |||||
buttons.put(FlowConst.Button.HANDLER, 1); | |||||
buttons.put(FlowConst.Button.SUBMIT, 0); | |||||
} else buttons.put(FlowConst.Button.SUBMIT, 1); | |||||
} else if (actInst.isMake() && actInst.getStatu() == FlowConst.ActivityStatu.HANDLE.value && canEdit && BillFlowWfHelper.getPropBool(procDef.getEntityId(), FlowConst.NULL_STR, FlowConst.ProcProperty.CAN_EDIT_OTHER)) { | |||||
//不是我的任务,制单任务判断属性,是否可以修改他人单据 | |||||
ProcdefEntity def = BillFlowWfHelper.getBillProc(procInst.getBillType(), user_id); | |||||
if (def != null && def.getEntityId().equals(procDef.getEntityId())) { | |||||
buttons.put(FlowConst.Button.SAVE, 1); | |||||
buttons.put(FlowConst.Button.SUBMIT, 1); | |||||
} | |||||
} | |||||
context.getDfpResponse().put("buttons", buttons); | |||||
*/ | |||||
} | |||||
/** | |||||
* 校验权限 | |||||
* | |||||
* @throws Exception | |||||
*/ | |||||
private void checkPermission() { | |||||
if (actInst == null) { | |||||
throw new SwException("没有找到对应的任务步骤!"); | |||||
} | |||||
long user_id = us.getUserId(); | |||||
//是我办理的单据,正常,返回 | |||||
if (actInst.getHandler() <= 0L || user_id == actInst.getHandler()) return; | |||||
//不是我办理的单据,非制单状态,不允许他人操作 | |||||
if (!actInst.isMake()) { | |||||
throw new BizException("非制单步骤,必须办理人本人操作!"); | |||||
} | |||||
} | |||||
/* | |||||
public void submitToEnd() { | |||||
long user_id = us.getUserId(); | |||||
//校验权限,当前人员有权限干不,没权限直接抛异常 | |||||
checkPermission(); | |||||
if (actInst.getStatu() == FlowConst.ActivityStatu.SUBMIT.value) { | |||||
throw new BizException("当前任务已经提交,不能重复提交"); | |||||
} | |||||
if (actInst.getStatu() == FlowConst.ActivityStatu.WAIT.value && !FlowHelper.isMyWaitedTask(actInst.getEntityId(), user_id)) { | |||||
throw new BizException("您不是当前任务的办理人,不允许提交"); | |||||
} | |||||
//校验完毕,接下来干活。 | |||||
List<Activity> new_acts = procDef.getProcInfo().findEndActivity(); | |||||
if (CommUtil.isEmpty(new_acts)) { | |||||
throw new BizException("结束任务为空,不允许提交到结束!"); | |||||
} | |||||
//待新增任务 | |||||
List<Task> listInsertTask = new ArrayList<>(); | |||||
List<TaskRel> listTaskRel = new ArrayList<>(); | |||||
//待新增任务候选人 | |||||
List<Candidate> listInsertCand = new ArrayList<>(); | |||||
for (Activity act : new_acts) { | |||||
buildTask(act, listInsertTask, listInsertCand, listTaskRel, user_id); | |||||
} | |||||
actInst.setHandler(user_id); | |||||
actInst.setStartTime(DateUtil.nowDateTimeLong()); | |||||
actInst.setStatu(FlowConst.ActivityStatu.SUBMIT.value); | |||||
actInst.setRetake(true); | |||||
if (listInsertTask.size() > 0) { | |||||
procInst.setTaskId(listInsertTask.get(0).getEntityId()); | |||||
} else { | |||||
procInst.setTaskId(actInst.getEntityId()); | |||||
} | |||||
if (new_acts.size() == 1 && new_acts.get(0).getType() == FlowConst.ActivityType.endEvent.value) { | |||||
procInst.setstatu(FlowConst.InstanceStatu.FINISH.value); | |||||
procInst.setEndTime(UtilDateTime.nowDateTimeString()); | |||||
} else { | |||||
procInst.setstatu(FlowConst.InstanceStatu.RUNING.value); | |||||
} | |||||
//保存入库 | |||||
if (!listInsertTask.isEmpty()) { | |||||
actDao.batchInsert(listInsertTask); | |||||
new CandidateDao().batchInsert(listInsertCand); | |||||
new ActinstRelDao().batchInsert(listTaskRel); | |||||
} | |||||
actDao.update(actInst); | |||||
new ProcinstDao().update(procInst); | |||||
buildBillLog(FlowConst.FlowOptType.SUBMIT.value, actInst, listInsertTask); | |||||
comp.transCallback(FlowConst.FlowOptType.SUBMIT.value, actInst, listInsertTask); | |||||
} | |||||
*/ | |||||
/** | |||||
* 提交 | |||||
* | |||||
* @throws Exception | |||||
*/ | |||||
/* | |||||
public void submit(AbsBillWfComponent comp) { | |||||
String user_id = context.getLoginInfo().getUserId(); | |||||
//校验权限,当前人员有权限干不,没权限直接抛异常 | |||||
checkPermission(); | |||||
if (actInst.getStatu() == FlowConst.ActivityStatu.SUBMIT.value) { | |||||
throw new DfpException("当前任务已经提交,不能重复提交"); | |||||
} | |||||
ActinstDao actDao = new ActinstDao(); | |||||
if (actInst.getStatu() == FlowConst.ActivityStatu.WAIT.value && !actDao.isMyWaitedTask(actInst.getEntityId(), user_id) && !UserBaseEntityBuffer.getInstance().isAdmin(user_id)) { | |||||
throw new DfpException("您不是当前任务的办理人,不允许提交"); | |||||
} | |||||
//校验完毕,接下来干活。todo:流程定义需要控制一下,非判断/并发分支不允许多个出口 | |||||
List<ActivityEntity> new_acts = BillHelper.getNextActivity(comp); | |||||
//待新增任务 | |||||
List<Task> listInsertTask = new ArrayList<>(); | |||||
List<ActinstRelEntity> listTaskRel = new ArrayList<>(); | |||||
//待新增任务候选人 | |||||
List<CandidateEntity> listInsertCand = new ArrayList<>(); | |||||
for (ActivityEntity act : new_acts) { | |||||
buildTask(act, listInsertTask, listInsertCand, listTaskRel, user_id); | |||||
} | |||||
actInst.setHandler(user_id); | |||||
actInst.setStartTime(UtilDateTime.nowDateTimeString()); | |||||
actInst.setstatu(FlowConst.ActivityStatu.SUBMIT.value); | |||||
actInst.setRetake(true); | |||||
if (listInsertTask.size() > 0) { | |||||
procInst.setTaskId(listInsertTask.get(0).getEntityId()); | |||||
procInst.setTaskName(ActivityEntityBuffer.getInstance().getNameById(listInsertTask.get(0).getActId())); | |||||
} else { | |||||
procInst.setTaskId(actInst.getEntityId()); | |||||
procInst.setTaskName(ActivityEntityBuffer.getInstance().getNameById(actInst.getActId())); | |||||
} | |||||
if (new_acts.size() == 1 && new_acts.get(0).getActType() == FlowConst.ActivityType.endEvent.value) { | |||||
procInst.setstatu(FlowConst.InstanceStatu.FINISH.value); | |||||
procInst.setEndTime(UtilDateTime.nowDateTimeString()); | |||||
} else { | |||||
procInst.setstatu(FlowConst.InstanceStatu.RUNING.value); | |||||
} | |||||
//保存入库 | |||||
if (!listInsertTask.isEmpty()) { | |||||
actDao.batchInsert(listInsertTask); | |||||
new CandidateDao().batchInsert(listInsertCand); | |||||
new ActinstRelDao().batchInsert(listTaskRel); | |||||
} | |||||
actDao.update(actInst); | |||||
new ProcinstDao().update(procInst); | |||||
buildBillLog(FlowConst.FlowOptType.SUBMIT.value, actInst, listInsertTask); | |||||
comp.transCallback(FlowConst.FlowOptType.SUBMIT.value, actInst, listInsertTask); | |||||
} | |||||
public void checkSubmit(AbsBillWfComponent comp) { | |||||
String user_id = context.getLoginInfo().getUserId(); | |||||
//校验权限,当前人员有权限干不,没权限直接抛异常 | |||||
checkPermission(); | |||||
if (actInst.getStatu() == FlowConst.ActivityStatu.SUBMIT.value) { | |||||
throw new DfpException("当前任务已经提交,不能重复提交"); | |||||
} | |||||
ActinstDao actDao = new ActinstDao(); | |||||
if (actInst.getStatu() == FlowConst.ActivityStatu.WAIT.value && !actDao.isMyWaitedTask(actInst.getEntityId(), user_id) && !UserBaseEntityBuffer.getInstance().isAdmin(user_id)) { | |||||
throw new DfpException("您不是当前任务的办理人,不允许提交"); | |||||
} | |||||
comp.checkSubmit(FlowConst.FlowOptType.SUBMIT.value, actInst); | |||||
} | |||||
*/ | |||||
/** | |||||
* 作废 | |||||
* | |||||
* @throws Exception | |||||
*/ | |||||
/* | |||||
public void disuse(AbsBillWfComponent comp) { | |||||
String user_id = context.getLoginInfo().getUserId(); | |||||
//校验权限,当前人员有权限干不,没权限直接抛异常 | |||||
checkPermission(); | |||||
if (procInst.getStatu() == FlowConst.InstanceStatu.FINISH.value) { | |||||
throw new DfpException("当前单据已审批完成,不能作废单据"); | |||||
} | |||||
ActinstDao actDao = new ActinstDao(); | |||||
if (actInst.getStatu() == FlowConst.ActivityStatu.WAIT.value && !actDao.isMyWaitedTask(actInst.getEntityId(), user_id) && !UserBaseEntityBuffer.getInstance().isAdmin(user_id)) { | |||||
throw new DfpException("您不是当前任务的办理人,不允许作废"); | |||||
} | |||||
actInst.setHandler(user_id); | |||||
actInst.setStartTime(UtilDateTime.nowDateTimeString()); | |||||
actInst.setstatu(FlowConst.ActivityStatu.DISUSE.value); | |||||
procInst.setstatu(FlowConst.InstanceStatu.DISUSE.value); | |||||
procInst.setEndTime(UtilDateTime.nowDateTimeString()); | |||||
actDao.update(actInst); | |||||
new ProcinstDao().update(procInst); | |||||
buildBillLog(FlowConst.FlowOptType.DISUSE.value, actInst, null); | |||||
comp.transCallback(FlowConst.FlowOptType.DISUSE.value, actInst, null); | |||||
} | |||||
*/ | |||||
/** | |||||
* 提交创建任务 | |||||
* | |||||
* @param act | |||||
* @param listInsertTask | |||||
* @param listInsertCand | |||||
* @param listTaskRel | |||||
* @throws Exception | |||||
*/ | |||||
/* | |||||
private void buildTask(ActivityEntity act, List<Task> listInsertTask, List<CandidateEntity> listInsertCand, List<ActinstRelEntity> listTaskRel, String submit_user) { | |||||
Task task = new Task(); | |||||
listInsertTask.add(task); | |||||
task.init(); | |||||
task.setEntityId(PKGenerator.newId()); | |||||
task.setBillId(procInst.getEntityId()); | |||||
task.setProcDefId(procDef.getEntityId()); | |||||
task.setActId(act.getEntityId()); | |||||
task.setStartTime(UtilDateTime.nowDateTimeString()); | |||||
task.setstatu(FlowConst.ActivityStatu.WAIT.value); | |||||
task.setMake(false); | |||||
task.setSign(false); | |||||
task.setReject(false); | |||||
task.setRetake(false); | |||||
task.setAuto(false); | |||||
ActinstRelEntity rel = new ActinstRelEntity(); | |||||
rel.setEntityId(PKGenerator.newId()); | |||||
rel.setBillId(task.getBillId()); | |||||
rel.setTaskId(task.getEntityId()); | |||||
rel.setBeforeTaskBid(actInst.getEntityId()); | |||||
listTaskRel.add(rel); | |||||
if (act.getActType() != FlowConst.ActivityType.endEvent.value) { | |||||
boolean handler_make = isHandleMakeEx(act); | |||||
Set<String> listHander = new HashSet<>(); | |||||
if (handler_make) { | |||||
listHander.add(procInst.getUserId()); | |||||
} else { | |||||
String hanlder_group = BillFlowWfHelper.getPropStr(procInst.getProcDefId(), act.getEntityId(), FlowConst.ProcProperty.HANDLER); | |||||
int handler_range = BillFlowWfHelper.getPropInt(procInst.getProcDefId(), act.getActId(), FlowConst.ProcProperty.HANDLER_RANGE); | |||||
//获取所有候选人 | |||||
listHander = UserGroupHelper.getUserIdList(hanlder_group, procInst, handler_range, context); | |||||
} | |||||
if (UserBaseEntityBuffer.getInstance().isAdmin(context.getLoginInfo().getUserId()) && UtilPub.isEmpty(listHander)) { | |||||
listHander = new HashSet<>(); | |||||
listHander.add(context.getLoginInfo().getUserId()); | |||||
} | |||||
if (UtilPub.isEmpty(listHander)) { | |||||
throw new DfpException("没有符合条件的主办人!" + act.getActName()); | |||||
} | |||||
for (String user_id : listHander) { | |||||
if (act.getActIgnore() && user_id.equals(submit_user)) continue; | |||||
CandidateEntity cand = new CandidateEntity(); | |||||
cand.init(); | |||||
cand.setEntityId(PKGenerator.newId()); | |||||
cand.setBillId(task.getBillId()); | |||||
cand.setTaskId(task.getEntityId()); | |||||
cand.setUserId(user_id); | |||||
listInsertCand.add(cand); | |||||
} | |||||
if (UtilPub.isEmpty(listInsertCand)) { | |||||
throw new DfpException("没有符合条件的主办人!" + act.getActName()); | |||||
} | |||||
} | |||||
} | |||||
*/ | |||||
/** | |||||
* 取回 | |||||
* | |||||
* @throws Exception | |||||
*/ | |||||
/* | |||||
public void retake(AbsBillWfComponent comp) { | |||||
String user_id = context.getLoginInfo().getUserId(); | |||||
//校验权限,当前人员有权限干不,没权限直接抛异常 | |||||
checkPermission(); | |||||
if (actInst.getStatu() != FlowConst.ActivityStatu.SUBMIT.value && !UserBaseEntityBuffer.getInstance().isAdmin(user_id)) { | |||||
throw new DfpException("当前任务非提交状态,不能取回!"); | |||||
} | |||||
ActinstDao actDao = new ActinstDao(); | |||||
ActivityEntity activityEntity = ActivityEntityBuffer.getInstance().get(actInst.getActId()); | |||||
if (activityEntity.getActType() == FlowConst.ActivityType.endEvent.value) {//从结束取回 | |||||
List<Task> new_acts = actDao.findBeforeTasks(actInst.getEntityId()); | |||||
Task old_act = (Task) actInst.clone(); | |||||
old_act.setEntityId(actInst.getEntityId()); | |||||
actInst = new_acts.get(0); | |||||
actInst.setHandler(user_id); | |||||
actInst.setStartTime(UtilDateTime.nowDateTimeString()); | |||||
actInst.setstatu(FlowConst.ActivityStatu.HANDLE.value); | |||||
if (actInst.isMake()) { | |||||
actInst.setHandler(comp.billEntity.getBillUser()); | |||||
} | |||||
procInst.setTaskId(actInst.getEntityId()); | |||||
procInst.setTaskName(ActivityEntityBuffer.getInstance().getNameById(actInst.getActId())); | |||||
procInst.setstatu(actInst.isMake() ? FlowConst.InstanceStatu.BEGIN.value : FlowConst.InstanceStatu.RUNING.value); | |||||
actDao.update(actInst); | |||||
actDao.delete(old_act); | |||||
new ActinstRelDao().deleteAll("where before_task_bid=?", old_act.getEntityId()); | |||||
new ProcinstDao().update(procInst); | |||||
new_acts.clear(); | |||||
new_acts.add(old_act); | |||||
buildBillLog(FlowConst.FlowOptType.RETAKE.value, actInst, new_acts); | |||||
comp.transCallback(FlowConst.FlowOptType.RETAKE.value, actInst, new_acts); | |||||
} else { | |||||
List<Task> new_acts = actDao.findAfterTasks(actInst.getEntityId()); | |||||
for (Task act : new_acts) { | |||||
if (act.getStatu() != FlowConst.ActivityStatu.WAIT.value) { | |||||
throw new DfpException("后续任务[" + ActivityEntityBuffer.getInstance().getNameById(act.getActId()) + "]已经办理,不能取回!"); | |||||
} | |||||
} | |||||
actInst.setHandler(user_id); | |||||
actInst.setStartTime(UtilDateTime.nowDateTimeString()); | |||||
actInst.setstatu(FlowConst.ActivityStatu.HANDLE.value); | |||||
procInst.setTaskId(actInst.getEntityId()); | |||||
procInst.setTaskName(ActivityEntityBuffer.getInstance().getNameById(actInst.getActId())); | |||||
procInst.setstatu(FlowConst.InstanceStatu.RUNING.value); | |||||
if (actInst.isMake()) procInst.setstatu(FlowConst.InstanceStatu.BEGIN.value); | |||||
actDao.update(actInst); | |||||
actDao.batchDelete(new_acts); | |||||
new ActinstRelDao().deleteAll("where before_task_bid=?", actInst.getEntityId()); | |||||
new ProcinstDao().update(procInst); | |||||
buildBillLog(FlowConst.FlowOptType.RETAKE.value, actInst, new_acts); | |||||
comp.transCallback(FlowConst.FlowOptType.RETAKE.value, actInst, new_acts); | |||||
} | |||||
} | |||||
*/ | |||||
/** | |||||
* 驳回 | |||||
* | |||||
* @throws Exception | |||||
*/ | |||||
/* | |||||
public void reject(AbsBillWfComponent comp) { | |||||
String user_id = context.getLoginInfo().getUserId(); | |||||
//校验权限,当前人员有权限干不,没权限直接抛异常 | |||||
checkPermission(); | |||||
if (actInst.getStatu() == FlowConst.ActivityStatu.SUBMIT.value) { | |||||
throw new DfpException("当前任务已提交,不能驳回!"); | |||||
} | |||||
ActinstDao actDao = new ActinstDao(); | |||||
//获取前置任务,前置任务需要置为被驳回的办理状态,同时,前置任务的其他后置任务需要删除 | |||||
List<Task> new_acts = actDao.findBeforeTasks(actInst.getEntityId()); | |||||
if (UtilPub.isEmpty(new_acts)) { | |||||
throw new DfpException("没有找到前续任务,驳回失败!"); | |||||
} | |||||
//记录需要被删除后续任务的任务id | |||||
StringBuilder sqlIn = new StringBuilder(128); | |||||
//设为被驳回状态 | |||||
for (Task act : new_acts) { | |||||
act.setstatu(FlowConst.ActivityStatu.HANDLE.value); | |||||
act.setReject(true); | |||||
sqlIn.append(",").append(act.getEntityId()); | |||||
} | |||||
actInst.setstatu(FlowConst.ActivityStatu.REJECT.value); | |||||
procInst.setTaskId(new_acts.get(0).getEntityId()); | |||||
procInst.setTaskName(ActivityEntityBuffer.getInstance().getNameById(new_acts.get(0).getActId())); | |||||
if (new_acts.size() == 1 && new_acts.get(0).isMake()) { | |||||
procInst.setstatu(FlowConst.InstanceStatu.BEGIN.value); | |||||
} else { | |||||
procInst.setstatu(FlowConst.InstanceStatu.RUNING.value); | |||||
} | |||||
//删除这些任务的后续任务 | |||||
List<Task> del_acts = actDao.findAfterTasks(sqlIn.substring(1)); | |||||
actDao.batchDelete(del_acts); | |||||
actDao.batchUpdate(new_acts); | |||||
new ActinstRelDao().deleteAll("where before_task_bid in (" + sqlIn.substring(1) + ")"); | |||||
new ProcinstDao().update(procInst); | |||||
buildBillLog(FlowConst.FlowOptType.REJECT.value, actInst, new_acts); | |||||
comp.transCallback(FlowConst.FlowOptType.REJECT.value, actInst, new_acts); | |||||
} | |||||
*/ | |||||
/** | |||||
* 驳回到制单 | |||||
* | |||||
* @throws Exception | |||||
*/ | |||||
/* | |||||
public void rejectToMake(AbsBillWfComponent comp) { | |||||
//校验权限,当前人员有权限干不,没权限直接抛异常 | |||||
checkPermission(); | |||||
if (actInst.getStatu() == FlowConst.ActivityStatu.SUBMIT.value) { | |||||
throw new DfpException("当前任务已提交,不能驳回!"); | |||||
} | |||||
ActinstDao actDao = new ActinstDao(); | |||||
//获取前置任务,前置任务需要置为被驳回的办理状态,同时,前置任务的其他后置任务需要删除 | |||||
Task make_act = actDao.findMakeTask(actInst.getBillId()); | |||||
if (EntityUtil.isNull(make_act)) { | |||||
throw new DfpException("没有找到制单任务,驳回到制单失败!"); | |||||
} | |||||
//设为被驳回状态 | |||||
make_act.setstatu(FlowConst.ActivityStatu.HANDLE.value); | |||||
make_act.setReject(true); | |||||
actInst.setstatu(FlowConst.ActivityStatu.REJECT.value); | |||||
procInst.setTaskId(make_act.getEntityId()); | |||||
procInst.setTaskName(ActivityEntityBuffer.getInstance().getNameById(make_act.getActId())); | |||||
procInst.setstatu(FlowConst.InstanceStatu.BEGIN.value); | |||||
actDao.update(make_act); | |||||
//删除非制单步骤 | |||||
actDao.deleteAll("where bill_id = ? and task_id <> ? ", make_act.getBillId(), make_act.getEntityId()); | |||||
new ActinstRelDao().deleteAll("where bill_id = ? and task_id <> ?", make_act.getBillId(), make_act.getEntityId()); | |||||
new ProcinstDao().update(procInst); | |||||
//删除候选人 | |||||
new CandidateDao().deleteAll(" where bill_id = ? and task_id <> ?", make_act.getBillId(), make_act.getEntityId()); | |||||
List<Task> make_acts = new ArrayList<>(); | |||||
make_acts.add(make_act); | |||||
buildBillLog(FlowConst.FlowOptType.REJECT.value, actInst, make_acts); | |||||
comp.transCallback(FlowConst.FlowOptType.REJECT.value, actInst, make_acts); | |||||
} | |||||
*/ | |||||
/** | |||||
* 办理 | |||||
* | |||||
* @throws Exception | |||||
*/ | |||||
/* | |||||
public void handler(AbsBillWfComponent comp) { | |||||
String user_id = context.getLoginInfo().getUserId(); | |||||
//校验权限,当前人员有权限干不,没权限直接抛异常 | |||||
checkPermission(); | |||||
if (actInst.getStatu() != FlowConst.ActivityStatu.WAIT.value) { | |||||
throw new DfpException("当前任务非待办状态,不能办理失败!"); | |||||
} | |||||
ActinstDao actDao = new ActinstDao(); | |||||
actInst.setHandler(user_id); | |||||
actInst.setStartTime(UtilDateTime.nowDateTimeString()); | |||||
actInst.setstatu(FlowConst.ActivityStatu.HANDLE.value); | |||||
procInst.setTaskId(actInst.getEntityId()); | |||||
procInst.setTaskName(ActivityEntityBuffer.getInstance().getNameById(actInst.getActId())); | |||||
procInst.setstatu(FlowConst.InstanceStatu.RUNING.value); | |||||
actDao.update(actInst); | |||||
new ProcinstDao().update(procInst); | |||||
buildBillLog(FlowConst.FlowOptType.HANDLER.value, actInst, null); | |||||
// comp.transCallback(FlowConst.FlowOptType.RETAKE.value, act_inst, null); | |||||
} | |||||
*/ | |||||
/** | /** | ||||
* 状态变更,构建日志 | * 状态变更,构建日志 | ||||
*/ | */ | ||||
protected void buildBillLog(final String flow_opt, TaskEntity srcTask, List<TaskEntity> dstTasks) { | |||||
protected void buildBillLog(final String flow_opt, Task srcTask, List<Task> dstTasks) { | |||||
/*LogEntity logEntity = new LogEntity(); | /*LogEntity logEntity = new LogEntity(); | ||||
logEntity.setSuggestion(context.getDfpRequest().getParams().getStrIgnoreNull("suggestion")); | logEntity.setSuggestion(context.getDfpRequest().getParams().getStrIgnoreNull("suggestion")); | ||||
logEntity.setFlowOpt(flow_opt); | logEntity.setFlowOpt(flow_opt); | ||||
@@ -193,12 +927,12 @@ public class FlowInstance { | |||||
} | } | ||||
if (UtilPub.isNotEmpty(dstTasks)) { | if (UtilPub.isNotEmpty(dstTasks)) { | ||||
sbDst = new StringBuilder(); | sbDst = new StringBuilder(); | ||||
for (ActinstEntity a : dstTasks) { | |||||
for (Task a : dstTasks) { | |||||
sbDst.append("/").append(ActivityEntityBuffer.getInstance().getNameById(a.getActId())); | sbDst.append("/").append(ActivityEntityBuffer.getInstance().getNameById(a.getActId())); | ||||
} | } | ||||
dst = sbDst.substring(1); | dst = sbDst.substring(1); | ||||
} | } | ||||
if (flow_opt == CmEnum.FlowOptType.RETAKE.value) { | |||||
if (flow_opt == FlowConst.FlowOptType.RETAKE.value) { | |||||
logEntity.setInfo(dst + "->" + src); | logEntity.setInfo(dst + "->" + src); | ||||
logEntity.setStepName(step_name); | logEntity.setStepName(step_name); | ||||
} else if (dst != null) { | } else if (dst != null) { | ||||
@@ -1,17 +1,20 @@ | |||||
package cc.smtweb.system.bpm.web.engine.flow; | package cc.smtweb.system.bpm.web.engine.flow; | ||||
import cc.smtweb.framework.core.common.SwMap; | |||||
import cc.smtweb.framework.core.db.DbEngine; | import cc.smtweb.framework.core.db.DbEngine; | ||||
import cc.smtweb.framework.core.db.EntityDao; | |||||
import cc.smtweb.framework.core.db.EntityHelper; | import cc.smtweb.framework.core.db.EntityHelper; | ||||
import cc.smtweb.framework.core.db.cache.ModelTableCache; | |||||
import cc.smtweb.framework.core.db.vo.ModelTable; | |||||
import cc.smtweb.framework.core.exception.BizException; | |||||
import cc.smtweb.framework.core.mvc.service.AbstractCompProvider; | import cc.smtweb.framework.core.mvc.service.AbstractCompProvider; | ||||
import cc.smtweb.framework.core.mvc.service.SqlNamedPara; | |||||
import cc.smtweb.framework.core.util.CommUtil; | |||||
import cc.smtweb.system.bpm.web.design.flow.FlowConst; | |||||
import cc.smtweb.system.bpm.web.design.form.ModelForm; | import cc.smtweb.system.bpm.web.design.form.ModelForm; | ||||
import cc.smtweb.system.bpm.web.design.form.ModelFormHelper; | import cc.smtweb.system.bpm.web.design.form.ModelFormHelper; | ||||
import cc.smtweb.system.bpm.web.design.form.define.PageDataset; | |||||
import cc.smtweb.system.bpm.web.design.form.define.PageDatasets; | |||||
import cc.smtweb.system.bpm.web.engine.dynPage.DynPageHelper; | |||||
import cc.smtweb.system.bpm.web.engine.flow.entity.ProcInst; | |||||
import cc.smtweb.system.bpm.web.engine.flow.entity.Task; | |||||
import cc.smtweb.system.bpm.web.engine.flow.entity.TaskRel; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
/** | /** | ||||
* Created by Akmm at 2022/5/26 18:40 | * Created by Akmm at 2022/5/26 18:40 | ||||
@@ -28,5 +31,58 @@ public class FlowProvider extends AbstractCompProvider { | |||||
}); | }); | ||||
} | } | ||||
//根据id,获取流程实例 | |||||
public ProcInst findProcInst(long billId) { | |||||
return doGetData("p_" + billId, () -> { | |||||
EntityDao<ProcInst> bdao = DbEngine.getInstance().findDao(ProcInst.class); | |||||
ProcInst bean = bdao.queryEntity(billId); | |||||
if (bean == null) throw new BizException("没有找到指定流程实例(id=" + billId + ")!"); | |||||
EntityHelper.loadBeanText(bean.getTableName(), bean.getData(), null); | |||||
return bean; | |||||
}); | |||||
} | |||||
//根据id,获取流程实例 | |||||
public Task findTask(long taskId) { | |||||
return doGetData("a_" + taskId, () -> { | |||||
EntityDao<Task> bdao = DbEngine.getInstance().findDao(Task.class); | |||||
Task bean = bdao.queryEntity(taskId); | |||||
if (bean == null) throw new BizException("没有找到指定流程任务(id=" + taskId + ")!"); | |||||
EntityHelper.loadBeanText(bean.getTableName(), bean.getData(), null); | |||||
return bean; | |||||
}); | |||||
} | |||||
//获取指定任务的前置任务 | |||||
public Task findBeforeTask(long taskId) { | |||||
return doGetData("ab_" + taskId, () -> { | |||||
EntityDao<Task> bdao = DbEngine.getInstance().findDao(Task.class); | |||||
List<Task> list = bdao.queryEx(" t," + EntityHelper.getSchemaTableName(TaskRel.ENTITY_NAME) + " r " + | |||||
"where t.task_id=r.before_task_bid and r.task_id = ?", taskId); | |||||
if (CommUtil.isEmpty(list)) throw new BizException("没有找到指定流程前置任务(id=" + taskId + ")!"); | |||||
Task bean = list.get(0); | |||||
EntityHelper.loadBeanText(bean.getTableName(), bean.getData(), null); | |||||
return bean; | |||||
}); | |||||
} | |||||
//获取指定任务的前置任务 | |||||
public List<Task> findBeforeTasks(String taskIds) { | |||||
EntityDao<Task> bdao = DbEngine.getInstance().findDao(Task.class); | |||||
List<Task> list = bdao.queryEx(" t," + EntityHelper.getSchemaTableName(TaskRel.ENTITY_NAME) + " r " + | |||||
"where t.task_id=r.before_task_bid and r.task_id in (" + taskIds + ")"); | |||||
if (CommUtil.isEmpty(list)) return new ArrayList<>(); | |||||
return list; | |||||
} | |||||
//根据id,获取流程实例 | |||||
public List<Task> findCurTask(long billId) { | |||||
return doGetData("ac_" + billId, () -> { | |||||
EntityDao<Task> bdao = DbEngine.getInstance().findDao(Task.class); | |||||
List<Task> list = bdao.queryWhere("bill_id = ? and statu<?", billId, FlowConst.ActivityStatu.SUBMIT.value); | |||||
if (list == null) return new ArrayList<>(); | |||||
return list; | |||||
}); | |||||
} | |||||
} | } |
@@ -1,108 +0,0 @@ | |||||
package cc.smtweb.system.bpm.web.engine.flow; | |||||
import cc.smtweb.framework.core.annotation.SwBody; | |||||
import cc.smtweb.framework.core.common.R; | |||||
import cc.smtweb.framework.core.common.SwMap; | |||||
import cc.smtweb.framework.core.mvc.service.AbstractCompService; | |||||
import cc.smtweb.framework.core.mvc.service.AbstractHandler; | |||||
import cc.smtweb.framework.core.session.UserSession; | |||||
import cc.smtweb.system.bpm.web.engine.dynPage.DynPageDelHandler; | |||||
import cc.smtweb.system.bpm.web.engine.dynPage.DynPageLoadHandler; | |||||
import cc.smtweb.system.bpm.web.engine.dynPage.DynPageSaveHandler; | |||||
import cc.smtweb.system.bpm.web.engine.dynPage.DynPageService; | |||||
/** | |||||
* Created by Akmm at 2022/5/24 14:21 | |||||
* 工作流 | |||||
*/ | |||||
public class FlowService extends DynPageService { | |||||
public final static String TYPE_FLOW = "flow"; | |||||
@Override | |||||
protected AbstractHandler createHandler(String type) { | |||||
switch (type) { | |||||
case TYPE_LOAD: | |||||
return new DynPageLoadHandler(); | |||||
case TYPE_SAVE: | |||||
return new DynPageSaveHandler(); | |||||
case TYPE_DEL: | |||||
return new DynPageDelHandler(); | |||||
} | |||||
return null; | |||||
} | |||||
protected R flowHandler(SwMap params, UserSession us, IFlowWorker worker) { | |||||
try { | |||||
FlowHandler handler = (FlowHandler)getHandler(params, us, TYPE_FLOW); | |||||
return worker.doWork(handler); | |||||
} catch (Exception e) { | |||||
return R.error("操作失败!", e); | |||||
} | |||||
} | |||||
/** | |||||
* 办理,签收 | |||||
* | |||||
* @throws Exception | |||||
*/ | |||||
public void handle(@SwBody SwMap params, UserSession us) { | |||||
flowHandler(params, us, FlowHandler::handle); | |||||
} | |||||
/** | |||||
* 提交 | |||||
* | |||||
* @throws Exception | |||||
*/ | |||||
public void submit(@SwBody SwMap params, UserSession us) { | |||||
flowHandler(params, us, FlowHandler::handle); | |||||
} | |||||
/** | |||||
* 提交 | |||||
* | |||||
* @throws Exception | |||||
*/ | |||||
public void checkSubmit(@SwBody SwMap params, UserSession us) { | |||||
} | |||||
/** | |||||
* 作废 | |||||
* | |||||
* @throws Exception | |||||
*/ | |||||
public void disuse(@SwBody SwMap params, UserSession us) { | |||||
} | |||||
/** | |||||
* 取消提交 | |||||
* | |||||
* @throws Exception | |||||
*/ | |||||
public void retake(@SwBody SwMap params, UserSession us) { | |||||
} | |||||
/** | |||||
* 驳回 | |||||
* | |||||
* @throws Exception | |||||
*/ | |||||
public void reject(@SwBody SwMap params, UserSession us) { | |||||
} | |||||
public void rejectToMake(@SwBody SwMap params, UserSession us) { | |||||
} | |||||
interface IFlowWorker { | |||||
R doWork(FlowHandler handler); | |||||
} | |||||
} |
@@ -1,4 +1,4 @@ | |||||
package cc.smtweb.system.bpm.web.engine.flow.define; | |||||
package cc.smtweb.system.bpm.web.engine.flow.entity; | |||||
import cc.smtweb.framework.core.annotation.SwTable; | import cc.smtweb.framework.core.annotation.SwTable; | ||||
import cc.smtweb.framework.core.db.impl.DefaultEntity; | import cc.smtweb.framework.core.db.impl.DefaultEntity; | ||||
@@ -8,10 +8,10 @@ import cc.smtweb.framework.core.db.impl.DefaultEntity; | |||||
* 候选信息人 | * 候选信息人 | ||||
*/ | */ | ||||
@SwTable("WF_CANDIDATE") | @SwTable("WF_CANDIDATE") | ||||
public class CandidateEntity extends DefaultEntity { | |||||
public class Candidate extends DefaultEntity { | |||||
public static final String ENTITY_NAME = "WF_CANDIDATE"; | public static final String ENTITY_NAME = "WF_CANDIDATE"; | ||||
public CandidateEntity() { | |||||
public Candidate() { | |||||
super(ENTITY_NAME); | super(ENTITY_NAME); | ||||
} | } | ||||
@@ -1,4 +1,4 @@ | |||||
package cc.smtweb.system.bpm.web.engine.flow.define; | |||||
package cc.smtweb.system.bpm.web.engine.flow.entity; | |||||
import cc.smtweb.framework.core.annotation.SwTable; | import cc.smtweb.framework.core.annotation.SwTable; | ||||
import cc.smtweb.framework.core.db.impl.DefaultEntity; | import cc.smtweb.framework.core.db.impl.DefaultEntity; | ||||
@@ -8,10 +8,10 @@ import cc.smtweb.framework.core.db.impl.DefaultEntity; | |||||
* 候选信息人 | * 候选信息人 | ||||
*/ | */ | ||||
@SwTable("WF_CARE") | @SwTable("WF_CARE") | ||||
public class CareEntity extends DefaultEntity { | |||||
public class Care extends DefaultEntity { | |||||
public static final String ENTITY_NAME = "WF_CARE"; | public static final String ENTITY_NAME = "WF_CARE"; | ||||
public CareEntity() { | |||||
public Care() { | |||||
super(ENTITY_NAME); | super(ENTITY_NAME); | ||||
} | } | ||||
@@ -1,4 +1,4 @@ | |||||
package cc.smtweb.system.bpm.web.engine.flow.define; | |||||
package cc.smtweb.system.bpm.web.engine.flow.entity; | |||||
import cc.smtweb.framework.core.annotation.SwTable; | import cc.smtweb.framework.core.annotation.SwTable; | ||||
import cc.smtweb.framework.core.db.impl.DefaultEntity; | import cc.smtweb.framework.core.db.impl.DefaultEntity; | ||||
@@ -8,10 +8,10 @@ import cc.smtweb.framework.core.db.impl.DefaultEntity; | |||||
* 审批意见 | * 审批意见 | ||||
*/ | */ | ||||
@SwTable("WF_COMMENT") | @SwTable("WF_COMMENT") | ||||
public class CommentEntity extends DefaultEntity { | |||||
public class Comment extends DefaultEntity { | |||||
public static final String ENTITY_NAME = "WF_COMMENT"; | public static final String ENTITY_NAME = "WF_COMMENT"; | ||||
public CommentEntity() { | |||||
public Comment() { | |||||
super(ENTITY_NAME); | super(ENTITY_NAME); | ||||
} | } | ||||
@@ -1,4 +1,4 @@ | |||||
package cc.smtweb.system.bpm.web.engine.flow.define; | |||||
package cc.smtweb.system.bpm.web.engine.flow.entity; | |||||
import cc.smtweb.framework.core.annotation.SwTable; | import cc.smtweb.framework.core.annotation.SwTable; | ||||
import cc.smtweb.framework.core.db.impl.DefaultEntity; | import cc.smtweb.framework.core.db.impl.DefaultEntity; | ||||
@@ -8,10 +8,10 @@ import cc.smtweb.framework.core.db.impl.DefaultEntity; | |||||
* 流程实例 | * 流程实例 | ||||
*/ | */ | ||||
@SwTable("WF_PROCINST") | @SwTable("WF_PROCINST") | ||||
public class ProcinstEntity extends DefaultEntity { | |||||
public class ProcInst extends DefaultEntity { | |||||
public static final String ENTITY_NAME = "WF_PROCINST"; | public static final String ENTITY_NAME = "WF_PROCINST"; | ||||
public ProcinstEntity() { | |||||
public ProcInst() { | |||||
super(ENTITY_NAME); | super(ENTITY_NAME); | ||||
} | } | ||||
@@ -1,4 +1,4 @@ | |||||
package cc.smtweb.system.bpm.web.engine.flow.define; | |||||
package cc.smtweb.system.bpm.web.engine.flow.entity; | |||||
import cc.smtweb.framework.core.annotation.SwTable; | import cc.smtweb.framework.core.annotation.SwTable; | ||||
import cc.smtweb.framework.core.db.impl.DefaultEntity; | import cc.smtweb.framework.core.db.impl.DefaultEntity; | ||||
@@ -8,10 +8,10 @@ import cc.smtweb.framework.core.db.impl.DefaultEntity; | |||||
* 会签信息 | * 会签信息 | ||||
*/ | */ | ||||
@SwTable("WF_SIGN") | @SwTable("WF_SIGN") | ||||
public class SignEntity extends DefaultEntity { | |||||
public class Sign extends DefaultEntity { | |||||
public static final String ENTITY_NAME = "WF_SIGN"; | public static final String ENTITY_NAME = "WF_SIGN"; | ||||
public SignEntity() { | |||||
public Sign() { | |||||
super(ENTITY_NAME); | super(ENTITY_NAME); | ||||
} | } | ||||
@@ -1,4 +1,4 @@ | |||||
package cc.smtweb.system.bpm.web.engine.flow.define; | |||||
package cc.smtweb.system.bpm.web.engine.flow.entity; | |||||
import cc.smtweb.framework.core.annotation.SwTable; | import cc.smtweb.framework.core.annotation.SwTable; | ||||
import cc.smtweb.framework.core.db.impl.DefaultEntity; | import cc.smtweb.framework.core.db.impl.DefaultEntity; | ||||
@@ -8,10 +8,10 @@ import cc.smtweb.framework.core.db.impl.DefaultEntity; | |||||
* 活动实例 | * 活动实例 | ||||
*/ | */ | ||||
@SwTable("WF_TASK") | @SwTable("WF_TASK") | ||||
public class TaskEntity extends DefaultEntity { | |||||
public class Task extends DefaultEntity { | |||||
public static final String ENTITY_NAME = "WF_TASK"; | public static final String ENTITY_NAME = "WF_TASK"; | ||||
public TaskEntity() { | |||||
public Task() { | |||||
super(ENTITY_NAME); | super(ENTITY_NAME); | ||||
} | } | ||||
@@ -1,4 +1,4 @@ | |||||
package cc.smtweb.system.bpm.web.engine.flow.define; | |||||
package cc.smtweb.system.bpm.web.engine.flow.entity; | |||||
import cc.smtweb.framework.core.annotation.SwTable; | import cc.smtweb.framework.core.annotation.SwTable; | ||||
import cc.smtweb.framework.core.db.impl.DefaultEntity; | import cc.smtweb.framework.core.db.impl.DefaultEntity; | ||||
@@ -8,10 +8,10 @@ import cc.smtweb.framework.core.db.impl.DefaultEntity; | |||||
* 活动之间的关系 | * 活动之间的关系 | ||||
*/ | */ | ||||
@SwTable("WF_CARE") | @SwTable("WF_CARE") | ||||
public class TaskRelEntity extends DefaultEntity { | |||||
public class TaskRel extends DefaultEntity { | |||||
public static final String ENTITY_NAME = "WF_CARE"; | public static final String ENTITY_NAME = "WF_CARE"; | ||||
public TaskRelEntity() { | |||||
public TaskRel() { | |||||
super(ENTITY_NAME); | super(ENTITY_NAME); | ||||
} | } | ||||
@@ -1,6 +1,7 @@ | |||||
package cc.smtweb.system.bpm.web.engine.model.listcard.single; | package cc.smtweb.system.bpm.web.engine.model.listcard.single; | ||||
import cc.smtweb.framework.core.annotation.SwBody; | import cc.smtweb.framework.core.annotation.SwBody; | ||||
import cc.smtweb.framework.core.annotation.SwService; | |||||
import cc.smtweb.framework.core.common.R; | import cc.smtweb.framework.core.common.R; | ||||
import cc.smtweb.framework.core.common.SwMap; | import cc.smtweb.framework.core.common.SwMap; | ||||
import cc.smtweb.framework.core.mvc.service.*; | import cc.smtweb.framework.core.mvc.service.*; | ||||
@@ -12,6 +13,7 @@ import cc.smtweb.system.bpm.web.engine.dynPage.DynPageService; | |||||
* Created by Akmm at 2022-08-12 15:37 | * Created by Akmm at 2022-08-12 15:37 | ||||
* 单页面简单列表卡片服务类 | * 单页面简单列表卡片服务类 | ||||
*/ | */ | ||||
@SwService | |||||
public class LCSingleService extends DynPageService { | public class LCSingleService extends DynPageService { | ||||
public final static String TYPE_MODEL_LIST = "modelList"; | public final static String TYPE_MODEL_LIST = "modelList"; | ||||
public final static String TYPE_MODEL_ADD = "modelAdd"; | public final static String TYPE_MODEL_ADD = "modelAdd"; | ||||
@@ -359,6 +359,11 @@ public class EntityDao<T> extends AbstractEntityDao<T> { | |||||
return list; | return list; | ||||
} | } | ||||
public T queryEntityWhere(String sqlWhere, Object... params) { | |||||
List<T> list = queryWhere(sqlWhere, params); | |||||
if (CommUtil.isEmpty(list)) return null; | |||||
return list.get(0); | |||||
} | |||||
/** | /** | ||||
* 查询对象所有数据,返回列表 | * 查询对象所有数据,返回列表 | ||||
*/ | */ | ||||
@@ -374,6 +379,19 @@ public class EntityDao<T> extends AbstractEntityDao<T> { | |||||
return list; | return list; | ||||
} | } | ||||
//原sql(select fields from table)后追加一段自定义,一般用于join | |||||
public List<T> queryEx(String sqlAdd, Object... params) { | |||||
StringBuilder sb = new StringBuilder(); | |||||
handleSelect(sb, null); | |||||
if (StringUtils.isNotEmpty(sqlAdd)) { | |||||
sb.append(sqlAdd); | |||||
} | |||||
List<T> list = jdbcEngine.query(sb.toString(), type, params); | |||||
setTableName(list); | |||||
return list; | |||||
} | |||||
public List<Long> queryIdListWhere(String sqlWhere, Object... params) { | public List<Long> queryIdListWhere(String sqlWhere, Object... params) { | ||||
StringBuilder sb = new StringBuilder(); | StringBuilder sb = new StringBuilder(); | ||||
handleSelect(sb, modelTable.getIdField()); | handleSelect(sb, modelTable.getIdField()); | ||||
@@ -1,13 +1,711 @@ | |||||
{ | { | ||||
"config": { | |||||
"model": "LC_SINGLE", | |||||
"props": { | |||||
"masterTable": "2", | |||||
"masterTable_text": "目录定义" | |||||
}, | |||||
"form": | |||||
[ | |||||
{ | |||||
"page": { | |||||
"id": "p744256811959324672", | |||||
"type": "fx-page", | |||||
"props": { | |||||
"title": "模型测试列表", | |||||
"key": "744256811959324673" | |||||
} | |||||
}, | |||||
"graph": { | |||||
"shape": "panel", | |||||
"id": "root_panel", | |||||
"type": "fx-split-panel", | |||||
"props": { | |||||
"horizontal": false, | |||||
"shadow": "" | |||||
}, | |||||
"children": [ | |||||
{ | |||||
"id": "744256811959324674", | |||||
"type": "fx-form-panel", | |||||
"shape": "panel", | |||||
"props": { | |||||
"size": "50", | |||||
"label": "查询条件", | |||||
"colNum": 2, | |||||
"alignY": "center", | |||||
"paddingLeft": 20, | |||||
"paddingRight": 20, | |||||
"shadow": "" | |||||
}, | |||||
"children": [ | |||||
{ | |||||
"id": "id744256811959324675", | |||||
"type": "fx-title", | |||||
"props": { | |||||
"label": "模型测试列表", | |||||
"fontSize": 15, | |||||
"color": "#313131", | |||||
"fontWeight": "bold", | |||||
"showPrefix": true, | |||||
"prefixWidth": 5, | |||||
"prefixHeight": 15, | |||||
"prefixColor": "#1E90FF" | |||||
} | |||||
}, | |||||
{ | |||||
"id": "id744256811959324676", | |||||
"type": "fx-button-group", | |||||
"props": { | |||||
"menus": [], | |||||
"textAlign": "right" | |||||
}, | |||||
"slots": { | |||||
"default": [ | |||||
{ | |||||
"type": "fx-button", | |||||
"props": { | |||||
"label": "新增", | |||||
"leftIcon": "plus", | |||||
"type": "primary", | |||||
"action": "button:add", | |||||
"link": false, | |||||
"linkType": "dialog", | |||||
"fxLink": "dialog:editDialog", | |||||
"fxLink_text": "ttttt", | |||||
}, | |||||
"id": "id744256811959324677" | |||||
} | |||||
] | |||||
} | |||||
} | |||||
] | |||||
}, | |||||
{ | |||||
"id": "744256811959324678", | |||||
"type": "fx-form-panel", | |||||
"shape": "panel", | |||||
"props": { | |||||
"size": "", | |||||
"label": "列表", | |||||
"colNum": 0, | |||||
"paddingLeft": 20, | |||||
"paddingRight": 20, | |||||
"shadow": "" | |||||
}, | |||||
"children": [{ | |||||
"id": "id744256811959324679", | |||||
"type": "fx-table", | |||||
"props": { | |||||
"label": "表格", | |||||
"border": true, | |||||
"stripe": true, | |||||
"showHeader": true, | |||||
"fit": true, | |||||
"dataset": "ds_182a5ea30e6", | |||||
"actionWidth": 120 | |||||
}, | |||||
"slots": { | |||||
"default": [ | |||||
{ | |||||
"id": "id744256811959324680", | |||||
"type": "fx-table-column", | |||||
"props": { | |||||
"field": "id_182a5ea30fe", | |||||
"label": "ID" | |||||
} | |||||
}, | |||||
{ | |||||
"id": "id744256811959324681", | |||||
"type": "fx-table-column", | |||||
"props": { | |||||
"field": "id_182a5ea30ff", | |||||
"label": "父ID" | |||||
} | |||||
}, | |||||
{ | |||||
"id": "id744256811959324682", | |||||
"type": "fx-table-column", | |||||
"props": { | |||||
"field": "id_182a5ea3100", | |||||
"label": "级次码" | |||||
} | |||||
}, | |||||
{ | |||||
"id": "id744256811959324683", | |||||
"type": "fx-table-column", | |||||
"props": { | |||||
"field": "id_182a5ea3101", | |||||
"label": "所属项目" | |||||
} | |||||
}, | |||||
{ | |||||
"id": "id744256811959324684", | |||||
"type": "fx-table-column", | |||||
"props": { | |||||
"field": "id_182a5ea3102", | |||||
"label": "编码" | |||||
} | |||||
}, | |||||
{ | |||||
"id": "id744256811959324685", | |||||
"type": "fx-table-column", | |||||
"props": { | |||||
"field": "id_182a5ea3103", | |||||
"label": "编码" | |||||
} | |||||
}, | |||||
{ | |||||
"id": "id744256811959324686", | |||||
"type": "fx-table-column", | |||||
"props": { | |||||
"field": "id_182a5ea3104", | |||||
"label": "创建人" | |||||
} | |||||
}, | |||||
{ | |||||
"id": "id744256811959324687", | |||||
"type": "fx-table-column", | |||||
"props": { | |||||
"field": "id_182a5ea3105", | |||||
"label": "最后更新人" | |||||
} | |||||
}, | |||||
{ | |||||
"id": "id744256811959324688", | |||||
"type": "fx-table-column", | |||||
"props": { | |||||
"field": "id_182a5ea3106", | |||||
"label": "创建时间" | |||||
} | |||||
}, | |||||
{ | |||||
"id": "id744256811959324689", | |||||
"type": "fx-table-column", | |||||
"props": { | |||||
"field": "id_182a5ea3107", | |||||
"label": "最后更新时间" | |||||
} | |||||
} | |||||
], | |||||
"button": [ | |||||
{ | |||||
"id": "id744256811959324690", | |||||
"type": "fx-button", | |||||
"props": { | |||||
"label": "编辑", | |||||
"type": "primary", | |||||
"leftIcon": "edit", | |||||
"action": "button:edit", | |||||
"link": false, | |||||
"text": true, | |||||
"linkType": "dialog", | |||||
"fxLink": "dialog:editDialog", | |||||
"fxLink_text": "ttttt", | |||||
"dataset": "" | |||||
} | |||||
}, | |||||
{ | |||||
"id": "id744256811959324691", | |||||
"type": "fx-button", | |||||
"props": { | |||||
"label": "删除", | |||||
"type": "danger", | |||||
"leftIcon": "delete-themes", | |||||
"action": "button:remove", | |||||
"preAction": "", | |||||
"link": false, | |||||
"text": true, | |||||
"confirm": "", | |||||
"nextAction": "button:search", | |||||
"dataset": "" | |||||
} | |||||
} | |||||
] | |||||
}, | |||||
"events": {} | |||||
} | |||||
] | |||||
}, | |||||
{ | |||||
"id": "744256811959324692", | |||||
"type": "fx-form-panel", | |||||
"shape": "panel", | |||||
"props": { | |||||
"size": "15", | |||||
"backgroundColor": "transparent" | |||||
}, | |||||
"children": [] | |||||
} | |||||
] | |||||
} | |||||
} | |||||
,{ | |||||
"page": { | "page": { | ||||
"list": "bpm.sTestMList" | |||||
"id": "id744256811959324693", | |||||
"type": "fx-dialog", | |||||
"props": { | |||||
"title": "ttttt", | |||||
"key": "editDialog", | |||||
"fontSize": 16, | |||||
"color": "#313131", | |||||
"fontWeight": "bold", | |||||
"showPrefix": true, | |||||
"prefixWidth": 5, | |||||
"prefixHeight": 16, | |||||
"prefixColor": "#1E90FF" | |||||
}, | |||||
"events": {} | |||||
}, | |||||
"graph": { | |||||
"shape": "panel", | |||||
"id": "root_panel", | |||||
"type": "fx-split-panel", | |||||
"props": { | |||||
"horizontal": false, | |||||
"shadow": "never" | |||||
}, | |||||
"children": [ | |||||
{ | |||||
"id": "744256811959324694", | |||||
"type": "fx-split-panel", | |||||
"shape": "panel", | |||||
"props": { | |||||
"horizontal": false, | |||||
"scroll": true | |||||
}, | |||||
"children": [ | |||||
{ | |||||
"id": "744256811959324695", | |||||
"type": "fx-form-panel", | |||||
"shape": "panel", | |||||
"props": { | |||||
"size": "0", | |||||
"paddingTop": 15, | |||||
"colNum": 2 | |||||
}, | |||||
"children": [ | |||||
{ | |||||
"id": "id744256811959324696", | |||||
"type": "fx-text", | |||||
"props": { | |||||
"label": "ID", | |||||
"type": "text", | |||||
"dataset": "ds_182a5ea30e9", | |||||
"field": "id_182a5ea30f1", | |||||
"required": "", | |||||
"placeholder": "请输入ID", | |||||
"labelWidth": 100, | |||||
"readonly": false, | |||||
"affixError": true | |||||
}, | |||||
"events": {} | |||||
} | |||||
,{ | |||||
"id": "id744256811959324697", | |||||
"type": "fx-placeholder", | |||||
"props": { | |||||
"label": "占位" | |||||
}, | |||||
"layout": { | |||||
"row": 1 | |||||
} | |||||
} | |||||
, | |||||
{ | |||||
"id": "id744256811959324698", | |||||
"type": "fx-text", | |||||
"props": { | |||||
"label": "父ID", | |||||
"type": "text", | |||||
"dataset": "ds_182a5ea30e9", | |||||
"field": "id_182a5ea30f3", | |||||
"required": "", | |||||
"placeholder": "请输入父ID", | |||||
"labelWidth": 100, | |||||
"readonly": false, | |||||
"affixError": true | |||||
}, | |||||
"events": {} | |||||
} | |||||
,{ | |||||
"id": "id744256811959324699", | |||||
"type": "fx-placeholder", | |||||
"props": { | |||||
"label": "占位" | |||||
}, | |||||
"layout": { | |||||
"row": 1 | |||||
} | |||||
} | |||||
, | |||||
{ | |||||
"id": "id744256811959324700", | |||||
"type": "fx-text", | |||||
"props": { | |||||
"label": "级次码", | |||||
"type": "text", | |||||
"dataset": "ds_182a5ea30e9", | |||||
"field": "id_182a5ea30f4", | |||||
"required": "", | |||||
"maxlength": 100, | |||||
"placeholder": "请输入级次码", | |||||
"labelWidth": 100, | |||||
"readonly": false, | |||||
"affixError": true | |||||
}, | |||||
"events": {} | |||||
} | |||||
,{ | |||||
"id": "id744256811959324701", | |||||
"type": "fx-placeholder", | |||||
"props": { | |||||
"label": "占位" | |||||
}, | |||||
"layout": { | |||||
"row": 1 | |||||
} | |||||
} | |||||
, | |||||
{ | |||||
"id": "id744256811959324702", | |||||
"type": "fx-text", | |||||
"props": { | |||||
"label": "所属项目", | |||||
"type": "text", | |||||
"dataset": "ds_182a5ea30e9", | |||||
"field": "id_182a5ea30f5", | |||||
"required": "", | |||||
"placeholder": "请输入所属项目", | |||||
"labelWidth": 100, | |||||
"readonly": false, | |||||
"affixError": true | |||||
}, | |||||
"events": {} | |||||
} | |||||
,{ | |||||
"id": "id744256811959324703", | |||||
"type": "fx-placeholder", | |||||
"props": { | |||||
"label": "占位" | |||||
}, | |||||
"layout": { | |||||
"row": 1 | |||||
} | |||||
} | |||||
, | |||||
{ | |||||
"id": "id744256811959324704", | |||||
"type": "fx-text", | |||||
"props": { | |||||
"label": "编码", | |||||
"type": "text", | |||||
"dataset": "ds_182a5ea30e9", | |||||
"field": "id_182a5ea30f6", | |||||
"required": "", | |||||
"maxlength": 32, | |||||
"placeholder": "请输入编码", | |||||
"labelWidth": 100, | |||||
"readonly": false, | |||||
"affixError": true | |||||
}, | |||||
"events": {} | |||||
} | |||||
,{ | |||||
"id": "id744256811959324705", | |||||
"type": "fx-placeholder", | |||||
"props": { | |||||
"label": "占位" | |||||
}, | |||||
"layout": { | |||||
"row": 1 | |||||
} | |||||
} | |||||
, | |||||
{ | |||||
"id": "id744256811959324706", | |||||
"type": "fx-text", | |||||
"props": { | |||||
"label": "编码", | |||||
"type": "text", | |||||
"dataset": "ds_182a5ea30e9", | |||||
"field": "id_182a5ea30f7", | |||||
"required": "", | |||||
"maxlength": 100, | |||||
"placeholder": "请输入编码", | |||||
"labelWidth": 100, | |||||
"readonly": false, | |||||
"affixError": true | |||||
}, | |||||
"events": {} | |||||
} | |||||
,{ | |||||
"id": "id744256811959324707", | |||||
"type": "fx-placeholder", | |||||
"props": { | |||||
"label": "占位" | |||||
}, | |||||
"layout": { | |||||
"row": 1 | |||||
} | |||||
} | |||||
, | |||||
{ | |||||
"id": "id744256811959324708", | |||||
"type": "fx-text", | |||||
"props": { | |||||
"label": "创建人", | |||||
"type": "text", | |||||
"dataset": "ds_182a5ea30e9", | |||||
"field": "id_182a5ea30f8", | |||||
"required": "", | |||||
"placeholder": "请输入创建人", | |||||
"labelWidth": 100, | |||||
"readonly": false, | |||||
"affixError": true | |||||
}, | |||||
"events": {} | |||||
} | |||||
,{ | |||||
"id": "id744256811959324709", | |||||
"type": "fx-placeholder", | |||||
"props": { | |||||
"label": "占位" | |||||
}, | |||||
"layout": { | |||||
"row": 1 | |||||
} | |||||
} | |||||
, | |||||
{ | |||||
"id": "id744256811959324710", | |||||
"type": "fx-text", | |||||
"props": { | |||||
"label": "最后更新人", | |||||
"type": "text", | |||||
"dataset": "ds_182a5ea30e9", | |||||
"field": "id_182a5ea30f9", | |||||
"required": "", | |||||
"placeholder": "请输入最后更新人", | |||||
"labelWidth": 100, | |||||
"readonly": false, | |||||
"affixError": true | |||||
}, | |||||
"events": {} | |||||
} | |||||
,{ | |||||
"id": "id744256811959324711", | |||||
"type": "fx-placeholder", | |||||
"props": { | |||||
"label": "占位" | |||||
}, | |||||
"layout": { | |||||
"row": 1 | |||||
} | |||||
} | |||||
, | |||||
{ | |||||
"id": "id744256811959324712", | |||||
"type": "fx-datetime", | |||||
"props": { | |||||
"label": "创建时间", | |||||
"type": "text", | |||||
"dataset": "ds_182a5ea30e9", | |||||
"field": "id_182a5ea30fa", | |||||
"required": "", | |||||
"placeholder": "请输入创建时间", | |||||
"labelWidth": 100, | |||||
"readonly": false, | |||||
"affixError": true | |||||
}, | |||||
"events": {} | |||||
} | |||||
,{ | |||||
"id": "id744256811959324713", | |||||
"type": "fx-placeholder", | |||||
"props": { | |||||
"label": "占位" | |||||
}, | |||||
"layout": { | |||||
"row": 1 | |||||
} | |||||
} | |||||
, | |||||
{ | |||||
"id": "id744256811959324714", | |||||
"type": "fx-datetime", | |||||
"props": { | |||||
"label": "最后更新时间", | |||||
"type": "text", | |||||
"dataset": "ds_182a5ea30e9", | |||||
"field": "id_182a5ea30fb", | |||||
"required": "", | |||||
"placeholder": "请输入最后更新时间", | |||||
"labelWidth": 100, | |||||
"readonly": false, | |||||
"affixError": true | |||||
}, | |||||
"events": {} | |||||
} | |||||
] | |||||
}, | |||||
{ | |||||
"id": "744256811959324715", | |||||
"type": "fx-form-panel", | |||||
"shape": "panel", | |||||
"props": {}, | |||||
"children": [] | |||||
} | |||||
] | |||||
}, | |||||
{ | |||||
"id": "744256811959324716", | |||||
"type": "fx-form-panel", | |||||
"shape": "panel", | |||||
"props": { | |||||
"size": "0" | |||||
}, | |||||
"children": [ | |||||
{ | |||||
"id": "id744256811959324717", | |||||
"type": "fx-divider", | |||||
"props": { | |||||
"label": "", | |||||
"contentPosition": "center", | |||||
"direction": "horizontal" | |||||
} | |||||
} | |||||
] | |||||
}, | |||||
{ | |||||
"id": "744256811959324718", | |||||
"type": "fx-form-panel", | |||||
"shape": "panel", | |||||
"props": { | |||||
"size": "50", | |||||
"alignY": "center", | |||||
"paddingRight": 20 | |||||
}, | |||||
"children": [ | |||||
{ | |||||
"id": "id744256811959324719", | |||||
"type": "fx-button-group", | |||||
"props": { | |||||
"menus": [], | |||||
"textAlign": "right" | |||||
}, | |||||
"slots": { | |||||
"default": [ | |||||
{ | |||||
"type": "fx-button", | |||||
"props": { | |||||
"label": "保存", | |||||
"leftIcon": "save", | |||||
"type": "success", | |||||
"action": "button:save", | |||||
}, | |||||
"id": "id744256811959324720" | |||||
}, | |||||
{ | |||||
"type": "fx-button", | |||||
"props": { | |||||
"label": "关闭", | |||||
"leftIcon": "close", | |||||
"action": "button:closeDialog", | |||||
}, | |||||
"id": "id744256811959324721" | |||||
} | |||||
] | |||||
} | |||||
} | |||||
] | |||||
} | |||||
] | |||||
} | |||||
} | |||||
], | |||||
"model": [ | |||||
{ | |||||
"dataset": "ds_182a5ea30e6", | |||||
"label": "主数据集", | |||||
"fields": [ | |||||
{ | |||||
"id": "id_182a5ea30fe", | |||||
"field": "mc_id" }, | |||||
{ | |||||
"id": "id_182a5ea30ff", | |||||
"field": "mc_parent_id" }, | |||||
{ | |||||
"id": "id_182a5ea3100", | |||||
"field": "mc_level_code" }, | |||||
{ | |||||
"id": "id_182a5ea3101", | |||||
"field": "mc_prj_id" }, | |||||
{ | |||||
"id": "id_182a5ea3102", | |||||
"field": "mc_code" }, | |||||
{ | |||||
"id": "id_182a5ea3103", | |||||
"field": "mc_name" }, | |||||
{ | |||||
"id": "id_182a5ea3104", | |||||
"field": "mc_create_uid" }, | |||||
{ | |||||
"id": "id_182a5ea3105", | |||||
"field": "mc_update_uid" }, | |||||
{ | |||||
"id": "id_182a5ea3106", | |||||
"field": "mc_create_at" }, | |||||
{ | |||||
"id": "id_182a5ea3107", | |||||
"field": "mc_update_at" } | |||||
], | |||||
"filters": [ | |||||
] | |||||
}, | |||||
{ | |||||
"dataset": "ds_182a5ea30e9", | |||||
"label": "卡片数据集", | |||||
"fields": [ | |||||
{ | |||||
"id": "id_182a5ea30f1", | |||||
"field": "mc_id" }, | |||||
{ | |||||
"id": "id_182a5ea30f3", | |||||
"field": "mc_parent_id" }, | |||||
{ | |||||
"id": "id_182a5ea30f4", | |||||
"field": "mc_level_code" }, | |||||
{ | |||||
"id": "id_182a5ea30f5", | |||||
"field": "mc_prj_id" }, | |||||
{ | |||||
"id": "id_182a5ea30f6", | |||||
"field": "mc_code" }, | |||||
{ | |||||
"id": "id_182a5ea30f7", | |||||
"field": "mc_name" }, | |||||
{ | |||||
"id": "id_182a5ea30f8", | |||||
"field": "mc_create_uid" }, | |||||
{ | |||||
"id": "id_182a5ea30f9", | |||||
"field": "mc_update_uid" }, | |||||
{ | |||||
"id": "id_182a5ea30fa", | |||||
"field": "mc_create_at" }, | |||||
{ | |||||
"id": "id_182a5ea30fb", | |||||
"field": "mc_update_at" } | |||||
], | |||||
"filters": [ | |||||
{ | |||||
"id": "fid_182a5ea30f2", | |||||
"field": "id", | |||||
"required": false, | |||||
"type": "input" | |||||
} | |||||
] | |||||
} | } | ||||
}, | |||||
"pageType": "list" | |||||
} | |||||
], | |||||
"option": { | |||||
"widgetRef": ["737684234579218432","736544100974596096"], | |||||
"vars": [] | |||||
} | |||||
} |