Преглед на файлове

Merge remote-tracking branch 'origin/4.0' into 4.0

4.0
lip преди 2 години
родител
ревизия
add833bc97
променени са 35 файла, в които са добавени 849 реда и са изтрити 529 реда
  1. +4
    -4
      smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/design/flow/ModelProcLoadHandler.java
  2. +1
    -1
      smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/design/flow/ModelProcSaveHandler.java
  3. +2
    -2
      smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/design/form/ModelFormSaveHandler.java
  4. +6
    -3
      smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/design/preview/PreviewMenuTreeService.java
  5. +1
    -0
      smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/dynPage/DynPageHelper.java
  6. +9
    -9
      smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/dynPage/DynPageSaveHandler.java
  7. +2
    -2
      smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/dynPage/DynRetBean.java
  8. +83
    -41
      smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/flow/FlowInstance.java
  9. +5
    -5
      smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/flow/FlowListener.java
  10. +0
    -15
      smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/flow/FlowLoadHandler.java
  11. +9
    -3
      smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/flow/FlowProvider.java
  12. +3
    -3
      smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/flow/entity/Comment.java
  13. +22
    -0
      smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/flow/listcard/single/FlowDelHandler.java
  14. +5
    -6
      smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/flow/listcard/single/FlowSingleLoadHandler.java
  15. +28
    -10
      smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/flow/listcard/single/FlowSingleSaveHandler.java
  16. +30
    -1
      smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/flow/listcard/single/FlowSingleService.java
  17. +48
    -0
      smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/flow/listcard/single/FlowTransHandler.java
  18. +0
    -1
      smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/listcard/mastersub/LCMsSaveHandler.java
  19. +2
    -2
      smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/listcard/normal/LCNormalDelHandler.java
  20. +12
    -3
      smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/listcard/single/LCSingleDelHandler.java
  21. +4
    -9
      smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/listcard/single/LCSingleLoadHandler.java
  22. +9
    -10
      smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/listcard/single/LCSingleSaveHandler.java
  23. +2
    -2
      smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/base/billType/BillTypeSaveHandler.java
  24. +2
    -2
      smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/base/dict/DictHandler.java
  25. +2
    -3
      smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/area/AreaHandler.java
  26. +5
    -1
      smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/userGroup/UserGroupHelper.java
  27. +473
    -330
      smtweb-framework/bpm/src/main/resources/static/template/default/model_card_flow.ftl
  28. +19
    -3
      smtweb-framework/core/src/main/java/cc/smtweb/framework/core/db/dao/AbstractEntityDao.java
  29. +2
    -2
      smtweb-framework/core/src/main/java/cc/smtweb/framework/core/db/impl/DefaultEntity.java
  30. +4
    -3
      smtweb-framework/core/src/main/java/cc/smtweb/framework/core/mvc/service/AbstractCompService.java
  31. +1
    -0
      smtweb-framework/core/src/main/java/cc/smtweb/framework/core/mvc/service/AbstractLoadHandler.java
  32. +1
    -2
      smtweb-framework/core/src/main/java/cc/smtweb/framework/core/mvc/service/AbstractSaveHandler.java
  33. +17
    -14
      smtweb-framework/core/src/main/java/cc/smtweb/framework/core/mvc/service/DefaultLoadHandler.java
  34. +34
    -35
      smtweb-framework/core/src/main/java/cc/smtweb/framework/core/mvc/service/DefaultSaveHandler.java
  35. +2
    -2
      smtweb-framework/core/src/main/java/cc/smtweb/framework/core/mvc/service/IWorker.java

+ 4
- 4
smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/design/flow/ModelProcLoadHandler.java Целия файл

@@ -1,6 +1,8 @@
package cc.smtweb.system.bpm.web.design.flow;

import cc.smtweb.framework.core.common.R;
import cc.smtweb.framework.core.db.DbEngine;
import cc.smtweb.framework.core.db.EntityDao;
import cc.smtweb.framework.core.exception.BizException;
import cc.smtweb.framework.core.mvc.service.DefaultLoadHandler;

@@ -13,17 +15,15 @@ public class ModelProcLoadHandler extends DefaultLoadHandler<ModelProc> {
}

@Override
protected ModelProc loadComp(long id) {
ModelProc bean = super.loadComp(id);
protected void afterLoad(ModelProc bean) {
bean.getData().remove("prc_content");
return bean;
}


//页面设计 - 加载页面model定义
public R loadModel() {
long id = params.readLong("id");
ModelProc bean = super.loadComp(id);
ModelProc bean = ModelProcCache.getInstance().get(id);
if (bean == null) throw new BizException("没有找到指定定义信息!id=" + id);
return R.success(bean.getContent());
}


+ 1
- 1
smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/design/flow/ModelProcSaveHandler.java Целия файл

@@ -60,7 +60,7 @@ public class ModelProcSaveHandler extends DefaultSaveHandler<ModelProc> {
public R saveModel() {
long id = params.readLong("id");
String data = params.readString("data");
bean = loadComp(id);
bean = ModelProcCache.getInstance().get(id);
if (StringUtils.isEmpty(data)) {
throw new BizException("没有待保存的数据!");
}


+ 2
- 2
smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/design/form/ModelFormSaveHandler.java Целия файл

@@ -75,7 +75,7 @@ public class ModelFormSaveHandler extends DefaultSaveHandler<ModelForm> {
public R saveDataset() {
long id = params.readLong("id");
String data = params.readString("data");
bean = loadComp(id);
bean = ModelFormCache.getInstance().get(id);
if (StringUtils.isEmpty(data)) {
throw new BizException("没有待保存的数据!");
}
@@ -107,7 +107,7 @@ public class ModelFormSaveHandler extends DefaultSaveHandler<ModelForm> {
public R saveModel() {
long id = params.readLong("id");
String data = params.readString("data");
bean = loadComp(id);
bean = ModelFormCache.getInstance().get(id);
if (StringUtils.isEmpty(data)) {
throw new BizException("没有待保存的数据!");
}


+ 6
- 3
smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/design/preview/PreviewMenuTreeService.java Целия файл

@@ -3,6 +3,7 @@ package cc.smtweb.system.bpm.web.design.preview;
import cc.smtweb.framework.core.annotation.SwParam;
import cc.smtweb.framework.core.annotation.SwService;
import cc.smtweb.framework.core.common.R;
import cc.smtweb.framework.core.common.SwConsts;
import cc.smtweb.framework.core.common.SwEnum;
import cc.smtweb.framework.core.db.DbEngine;
import cc.smtweb.framework.core.db.vo.ModelCatalog;
@@ -31,9 +32,11 @@ public class PreviewMenuTreeService {

public R treeAll(@SwParam("module") String module, UserSession us) {
String prj_id = ModelProjectCache.getInstance().getIdByModule(module);
List<MenuVO> menuVOList = buildMenu(prj_id, module, us);
if (PubUtil.isNotEmpty(menuVOList)) {
return R.success(menuVOList);
if(!SwConsts.SYS_DEBUG){
List<MenuVO> menuVOList = buildMenu(prj_id, module, us);
if (PubUtil.isNotEmpty(menuVOList)) {
return R.success(menuVOList);
}
}
List<ModelForm> listForm;
if (StringUtils.isNotEmpty(prj_id)) {


+ 1
- 0
smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/dynPage/DynPageHelper.java Целия файл

@@ -45,6 +45,7 @@ public class DynPageHelper {
ModelTable masterTable = ModelTableCache.getInstance().get(dataSet.masterTable);
EntityDao<DefaultEntity> dao = DbEngine.getInstance().findDao(masterTable.getName());
DefaultEntity bean = dao.createBean();
bean.setEntityId(DbEngine.getInstance().nextId());
return bean.getData();
}



+ 9
- 9
smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/dynPage/DynPageSaveHandler.java Целия файл

@@ -14,6 +14,7 @@ import cc.smtweb.framework.core.db.vo.ModelField;
import cc.smtweb.framework.core.db.vo.ModelIndex;
import cc.smtweb.framework.core.db.vo.ModelTable;
import cc.smtweb.framework.core.exception.BizException;
import cc.smtweb.framework.core.mvc.service.DefaultSaveHandler;
import cc.smtweb.framework.core.mvc.service.TreeHelper;
import cc.smtweb.framework.core.util.StringUtil;
import cc.smtweb.system.bpm.web.design.form.define.PageDataset;
@@ -33,10 +34,6 @@ import java.util.Map;
public class DynPageSaveHandler extends AbstractDynPageHandler {
private Map<String, List<DefaultEntity>> mapTreeBean = new HashMap<>();

protected void setNewId(DefaultEntity bean) {
bean.setEntityId(DbEngine.getInstance().nextId());
}

/**
* 保存指定数据集操作,入参:{pageId,dataset:"", data:{form:{},list: {total:0,rows:[]}}, filter:{}}
*/
@@ -50,6 +47,7 @@ public class DynPageSaveHandler extends AbstractDynPageHandler {
//对应的数据集定义
PageDataset pageDataSet = findDataset(dbName);
if (pageDataSet == null) throw new BizException("没有找到指定的的数据集定义:" + dbName + "!");

//读取待保存的bean
DefaultEntity bean = readBeanFromPage(pageDataSet, data.readMap("form"));
if (filter != null && bean.isNew()) {//有过滤条件,将关联的值设上
@@ -73,6 +71,7 @@ public class DynPageSaveHandler extends AbstractDynPageHandler {
afterRollback(bean);
}
});
bean.removeStatus();
return R.success(DynRetBean.createBean(bean.getData()));
}

@@ -133,6 +132,7 @@ public class DynPageSaveHandler extends AbstractDynPageHandler {
});
Map<String, DynRetBean> mapRet = new HashMap<>(map.size());
for (Map.Entry<String, DefaultEntity> entry : map.entrySet()) {
entry.getValue().getData().remove(DefaultEntity.statusKey);
mapRet.put(entry.getKey(), DynRetBean.createBean(entry.getValue().getData()));
}
return R.success(mapRet);
@@ -148,16 +148,17 @@ public class DynPageSaveHandler extends AbstractDynPageHandler {
protected DefaultEntity readBeanFromPage(PageDataset pageDataSet, SwMap data) {
ModelTable table = ModelTableCache.getInstance().get(pageDataSet.masterTable);
if (table == null) throw new BizException("没有找到待保存的表定义:" + pageDataSet.name);

long id = data.readLong(table.getIdField());
boolean isNew = data.readBool(DefaultEntity.statusKey) || id <= 0L;

EntityDao<DefaultEntity> dao = DbEngine.getInstance().findDao(table.getName());
DefaultEntity bean;
if (id <= 0L) {
bean = dao.createBean();
bean.setIsNew(true);
if (isNew) {
bean = dao.createBean(us.getUserId());
//暂时不考虑list保存的情况
bean.getData().putAll(data);
setNewId(bean);
if (bean.getEntityId() <= 0L) bean.setEntityId(DbEngine.getInstance().nextId());
} else {
bean = dao.queryEntity(id);
if (bean == null) {
@@ -165,7 +166,6 @@ public class DynPageSaveHandler extends AbstractDynPageHandler {
}
//暂时不考虑list保存的情况
bean.getData().putAll(data);
bean.setIsNew(false);
}

return bean;


+ 2
- 2
smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/dynPage/DynRetBean.java Целия файл

@@ -23,8 +23,8 @@ public class DynRetBean {
SwMap form = (SwMap) swMap.clone();
DynRetBean bean = new DynRetBean();
bean.form = form;
bean.form.remove("_def_table_name");
bean.form.remove("_status");
bean.form.remove(DefaultEntity.tableNameKey);
//bean.form.remove(DefaultEntity.statusKey);
return bean;
}



+ 83
- 41
smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/flow/FlowInstance.java Целия файл

@@ -15,14 +15,11 @@ 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.define.Activity;
import cc.smtweb.system.bpm.web.design.flow.define.ProcInfo;
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.*;
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.party.Party;
import cc.smtweb.system.bpm.web.sys.user.party.PartyCache;
import cc.smtweb.system.bpm.web.sys.user.user.UserCache;
import cc.smtweb.system.bpm.web.sys.user.userGroup.UserGroupHelper;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
@@ -46,9 +43,6 @@ public class FlowInstance {
//活动任务
private Task actInst;

//操作类型 新增/编辑/查看
private int opt_mode = FlowConst.OperatorType.VIEW;

//流程执行变量
// public Map<String, String> variables = new HashMap<>();

@@ -59,7 +53,20 @@ public class FlowInstance {

private FlowListener listener;

public FlowInstance(@NonNull FlowListener listener, UserSession us) {
public static FlowInstance createById(UserSession us, FlowListener listener, long billId, long taskId) {
FlowInstance flowInstance = new FlowInstance(listener, us);
flowInstance.load(billId, taskId);
return flowInstance;
}

public static FlowInstance createByBillType(UserSession us, FlowListener listener, long billType) {
FlowInstance flowInstance = new FlowInstance(listener, us);
flowInstance.create(billType);
return flowInstance;
}


private FlowInstance(@NonNull FlowListener listener, UserSession us) {
this.listener = listener;
this.us = us;
}
@@ -67,7 +74,7 @@ public class FlowInstance {
//能否编辑
public boolean canEdit() {
//新增状态可以编辑
if (opt_mode == FlowConst.OperatorType.NEW || procInst.getStatu() == FlowConst.InstanceStatu.BEGIN.value)
if (procDef.isNew() || procInst.getStatu() == FlowConst.InstanceStatu.BEGIN.value)
return true;
return false;
}
@@ -115,10 +122,9 @@ public class FlowInstance {
throw new BizException("对应的流程没有定义有效的活动步骤!");
}

opt_mode = FlowConst.OperatorType.NEW;

procInst = new ProcInst();
procInst.init();
procInst.setIsNew(true);
procInst.setEntityId(DbEngine.getInstance().nextId());
procInst.setPartyId(loginParty.getEntityId());
procInst.setDeptId(loginDept.getEntityId());
@@ -135,6 +141,7 @@ public class FlowInstance {
actInst.setId(procInst.getEntityId());
actInst.setPrcId(procDef.getEntityId());
actInst.setActId(start.getId());
actInst.setActName(start.getLabel());
actInst.setHandler(us.getUserId());
actInst.setStartTime(DateUtil.nowDateTimeLong());
actInst.setStatu(FlowConst.ActivityStatu.HANDLE.value);
@@ -169,8 +176,9 @@ public class FlowInstance {
getTaskDao().updateEntity(actInst);
getProcInstDao().updateEntity(procInst);

updateComment(null, FlowConst.Button.HANDLE.value);
buildBillLog(FlowConst.Button.HANDLE.value, "-", actInst, null);
listener.handle(actInst);
listener.afterHandle(actInst);
}

//从页面参数加载流程实例
@@ -229,7 +237,7 @@ public class FlowInstance {
*/
public List<Task> adjustTasks() {
List<Task> listTask = new ArrayList<>();
if (opt_mode == FlowConst.OperatorType.NEW || procInst.getStatu() == FlowConst.InstanceStatu.DISUSE.value) {
if (procInst.isNew() || procInst.getStatu() == FlowConst.InstanceStatu.DISUSE.value) {
listTask.add(actInst);
return listTask;
}
@@ -299,11 +307,11 @@ public class FlowInstance {

//启动流程
public void save() {
if (opt_mode == FlowConst.OperatorType.NEW) {
if (procInst.isNew()) {
getProcInstDao().insertEntity(procInst);
getTaskDao().insertEntity(actInst);
getCommentDao().insertEntity(createComment(actInst));
buildBillLog(FlowConst.Button.ADD.value, "-", null, null);
opt_mode = FlowConst.OperatorType.EDIT;
} else {
getProcInstDao().updateEntity(procInst);
if (actInst != null) {
@@ -527,7 +535,7 @@ public class FlowInstance {
*
* @throws Exception
*/
public void submit() {
public void submit(String comment) {
long user_id = us.getUserId();
//校验权限,当前人员有权限干不,没权限直接抛异常
checkPermission();
@@ -544,17 +552,18 @@ public class FlowInstance {
//待新增任务
List<Task> listInsertTask = new ArrayList<>();
List<TaskRel> listTaskRel = new ArrayList<>();
List<Comment> listTaskComment = new ArrayList<>();
//待新增任务候选人
List<Candidate> listInsertCand = new ArrayList<>();

for (Activity act : new_acts) {
buildTask(act, listInsertTask, listInsertCand, listTaskRel, user_id);
buildTask(act, listInsertTask, listInsertCand, listTaskRel, listTaskComment);
}

actInst.setHandler(user_id);
actInst.setStartTime(DateUtil.nowDateTimeLong());
actInst.setStatu(FlowConst.ActivityStatu.SUBMIT.value);
actInst.setRetake(true);
actInst.setRetake(false);

if (listInsertTask.size() > 0) {
procInst.setTaskId(listInsertTask.get(0).getEntityId());
@@ -574,26 +583,17 @@ public class FlowInstance {
getTaskDao().batchInsertEntity(listInsertTask);
getCandidateDao().batchInsertEntity(listInsertCand);
getTaskRelDao().batchInsertEntity(listTaskRel);

if (!listTaskComment.isEmpty()) {
getCommentDao().batchInsertEntity(listTaskComment);
}
}
getTaskDao().updateEntity(actInst);
getProcInstDao().updateEntity(procInst);

buildBillLog(FlowConst.Button.SUBMIT.value, "TODO", actInst, listInsertTask);
listener.submit(actInst, listInsertTask);
}


public void checkSubmit() {
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("您不是当前任务的办理人,不允许提交");
}
//comp.checkSubmit(FlowConst.FlowOptType.SUBMIT.value, actInst);
updateComment(comment, FlowConst.Button.SUBMIT.value);
buildBillLog(FlowConst.Button.SUBMIT.value, comment, actInst, listInsertTask);
listener.afterSubmit(actInst, listInsertTask);
}

/**
@@ -623,7 +623,7 @@ public class FlowInstance {
getProcInstDao().updateEntity(procInst);

buildBillLog(FlowConst.Button.DISUSE.value, "TODO", actInst, null);
listener.disuse(actInst);
listener.afterDisuse(actInst);
}

/**
@@ -635,7 +635,7 @@ public class FlowInstance {
* @param listTaskRel
* @throws Exception
*/
private void buildTask(Activity act, List<Task> listInsertTask, List<Candidate> listInsertCand, List<TaskRel> listTaskRel, long submit_user) {
private void buildTask(Activity act, List<Task> listInsertTask, List<Candidate> listInsertCand, List<TaskRel> listTaskRel, List<Comment> listTaskComment) {
Task task = new Task();
listInsertTask.add(task);
task.init();
@@ -643,6 +643,7 @@ public class FlowInstance {
task.setPriId(procInst.getId());
task.setPriId(procDef.getId());
task.setActId(act.getId());
task.setActName(act.getLabel());
task.setStartTime(DateUtil.nowDateTimeLong());
task.setStatu(FlowConst.ActivityStatu.WAIT.value);
task.setMake(false);
@@ -661,8 +662,12 @@ public class FlowInstance {
if (act.getType() != FlowConst.ActivityType.END.value) {
Set<Long> listHander = new HashSet<>();

long hanlder_group = act.getHandler().getUserGroup();
int handler_range = act.getHandler().getFilter();
long hanlder_group = 0L;
int handler_range = 0;
if (act.getHandler() != null) {
hanlder_group = act.getHandler().getUserGroup();
handler_range = act.getHandler().getFilter();
}
//获取所有候选人
listHander = UserGroupHelper.getUserIdList(hanlder_group, procInst, handler_range, us);

@@ -683,6 +688,9 @@ public class FlowInstance {
if (CommUtil.isEmpty(listInsertCand)) {
throw new BizException("没有符合条件的主办人!" + act.getLabel());
}

//创建新的审批意见
listTaskComment.add(createComment(task));
}
}

@@ -724,7 +732,7 @@ public class FlowInstance {
new_acts.clear();
new_acts.add(old_act);
buildBillLog(FlowConst.Button.RETAKE.value, "TODO", actInst, new_acts);
listener.retake(actInst, new_acts);
listener.afterRetake(actInst, new_acts);
// comp.transCallback(FlowConst.Button.RETAKE.value, actInst, new_acts);
} else {
List<Task> new_acts = provider.findAfterTasks(actInst.getId());
@@ -750,7 +758,7 @@ public class FlowInstance {
getProcInstDao().updateEntity(procInst);

buildBillLog(FlowConst.Button.RETAKE.value, "TODO", actInst, new_acts);
listener.retake(actInst, new_acts);
listener.afterRetake(actInst, new_acts);
}
}

@@ -799,7 +807,7 @@ public class FlowInstance {
getProcInstDao().updateEntity(procInst);

buildBillLog(FlowConst.Button.REJECT.value, "TODO", actInst, new_acts);
listener.reject(actInst, new_acts);
listener.afterReject(actInst, new_acts);
// comp.transCallback(FlowConst.FlowOptType.REJECT.value, actInst, new_acts);
}

@@ -843,7 +851,7 @@ public class FlowInstance {
make_acts.add(make_act);

buildBillLog(FlowConst.Button.REJECT.value, "TODO", actInst, make_acts);
listener.reject(actInst, make_acts);
listener.afterReject(actInst, make_acts);
}

/**
@@ -886,8 +894,42 @@ public class FlowInstance {
flowLog.setInfo("-");
}
DbEngine.getInstance().findDao(FlowLog.class).insertEntity(flowLog);
}

/**
* 构建新的审批信息,制单或首次保存、提交创建新任务时创建
*/
protected Comment createComment(Task task) {
ProcInfo procInfo = procDef.getProcInfo();

Comment bean = new Comment();
bean.setId(DbEngine.getInstance().nextId());
bean.setPriId(procInst.getId());
bean.setTskId(task.getId());
bean.setActId(task.getActId());
bean.setActName(procInfo.getActNameById(task.getActId()));
bean.setStartTime(DateUtil.nowDateTimeLong());
bean.setStatu(FlowConst.ActivityStatu.WAIT.value);

return bean;
}

protected void updateComment(String comment, String optType) {
Comment bean = provider.findTaskComment(actInst.getId());
if (bean == null) throw new SwException("没有找到对应的记录(comment)!");
//签收
if (FlowConst.Button.HANDLE.value.equals(optType)) {
bean.setStatu(FlowConst.ActivityStatu.HANDLE.value);
bean.setHandler(us.getUserId());
bean.setHandlerTime(DateUtil.nowDateTimeLong());
} else if (FlowConst.Button.SUBMIT.value.equals(optType)) {
bean.setStatu(FlowConst.ActivityStatu.SUBMIT.value);
bean.setEndTime(DateUtil.nowDateTimeLong());
bean.setComment(comment);
}
getCommentDao().updateEntity(bean);
}

private EntityDao<ProcInst> getProcInstDao() {
return DbEngine.getInstance().findDao(ProcInst.class);


+ 5
- 5
smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/flow/FlowListener.java Целия файл

@@ -13,14 +13,14 @@ public interface FlowListener {
//设置条件计算参数
default void setExprParam(SwMap param) {}
//提交
default void submit(Task srcTask, List<Task> dstTasks) {}
default void afterSubmit(Task srcTask, List<Task> dstTasks) {}
//取回
default void retake(Task srcTask, List<Task> dstTasks) {}
default void afterRetake(Task srcTask, List<Task> dstTasks) {}
//驳回
default void reject(Task srcTask, List<Task> dstTasks) {}
default void afterReject(Task srcTask, List<Task> dstTasks) {}
//办理,签收
default void handle(Task srcTask) {}
default void afterHandle(Task srcTask) {}
//作废
default void disuse(Task srcTask) {}
default void afterDisuse(Task srcTask) {}

}

+ 0
- 15
smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/flow/FlowLoadHandler.java Целия файл

@@ -1,15 +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;
import cc.smtweb.system.bpm.web.engine.dynPage.DynPageLoadHandler;

/**
* Created by Akmm at 2022/4/21 17:53
* 保存指定数据集操作
* 入参:{pageId, data:}
*/
public class FlowLoadHandler extends DynPageLoadHandler {


}

+ 9
- 3
smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/flow/FlowProvider.java Целия файл

@@ -5,6 +5,7 @@ import cc.smtweb.framework.core.db.EntityDao;
import cc.smtweb.framework.core.db.EntityHelper;
import cc.smtweb.framework.core.exception.BizException;
import cc.smtweb.framework.core.mvc.service.AbstractCompProvider;
import cc.smtweb.framework.core.mvc.service.IDataProvider;
import cc.smtweb.framework.core.session.UserSession;
import cc.smtweb.framework.core.util.CommUtil;
import cc.smtweb.system.bpm.web.design.flow.FlowConst;
@@ -40,7 +41,7 @@ public class FlowProvider extends AbstractCompProvider {
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 + ")!");
if (bean == null) return null;
EntityHelper.loadBeanText(bean.getTableName(), bean.getData(), null);
return bean;
});
@@ -98,10 +99,15 @@ public class FlowProvider extends AbstractCompProvider {

//寻找流程的制单任务
public Task findMakeTask(long bill_id) {
return DbEngine.getInstance().findDao(Task.class).queryEntityWhere("where tsk_pri_id = ? and is_make = 1 ", bill_id);
return DbEngine.getInstance().findDao(Task.class).queryEntityWhere(" tsk_pri_id = ? and is_make = 1 ", bill_id);
}

public List<Comment> findComment(long bill_id) {
return DbEngine.getInstance().findDao(Comment.class).queryWhere("where cmt_pri_id=? order by cmt_end_time");
return doGetData("cp_" + bill_id, () -> DbEngine.getInstance().findDao(Comment.class).queryWhere(" cmt_pri_id=? and cmt_statu>? order by cmt_end_time", bill_id, FlowConst.ActivityStatu.WAIT.value));

}

public Comment findTaskComment(long task_id) {
return doGetData("ct_" + task_id, () -> DbEngine.getInstance().findDao(Comment.class).queryEntityWhere(" cmt_tsk_id=?", task_id));
}
}

+ 3
- 3
smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/flow/entity/Comment.java Целия файл

@@ -44,12 +44,12 @@ public class Comment extends DefaultEntity {
put("cmt_tsk_id", cmt_tsk_id);
}
/** 活动id */
public long getActId() {
return getLong("cmt_act_id");
public String getActId() {
return getStr("cmt_act_id");
}

/** 活动id */
public void setActId(long cmt_act_id) {
public void setActId(String cmt_act_id) {
put("cmt_act_id", cmt_act_id);
}
/** 活动名 */


+ 22
- 0
smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/flow/listcard/single/FlowDelHandler.java Целия файл

@@ -0,0 +1,22 @@
package cc.smtweb.system.bpm.web.engine.model.flow.listcard.single;

import cc.smtweb.framework.core.db.vo.ModelTable;
import cc.smtweb.system.bpm.web.engine.flow.FlowInstance;
import cc.smtweb.system.bpm.web.engine.flow.FlowListener;
import cc.smtweb.system.bpm.web.engine.model.listcard.single.LCSingleDelHandler;

/**
* Created by Akmm at 2022-09-01 15:03
* 流程删除
*/
public class FlowDelHandler extends LCSingleDelHandler implements FlowListener {
protected FlowInstance flowInstance;
@Override
protected void localDel(long id, ModelTable table) {
long taskId = params.readLong("taskId");
flowInstance = FlowInstance.createById(us, this, id, taskId);
flowInstance.delete();
super.localDel(id, table);
}
}

+ 5
- 6
smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/flow/listcard/single/FlowSingleLoadHandler.java Целия файл

@@ -30,13 +30,13 @@ public class FlowSingleLoadHandler extends LCSingleLoadHandler implements FlowLi

@Override
protected void afterAdd(SwMap ret, SwMap bean) {
FlowInstance flowInstance = new FlowInstance(this, us);
flowInstance.create(form.getBillType());

flowInstance = FlowInstance.createByBillType(us, this, form.getBillType());
PageDataset cardDataset = LCSingleHelper.findCardDataset(datasets);
ModelTable table = cardDataset.getModelTable();
bean.put(table.getIdField(), flowInstance.getProcInst().getId());

ret.put(cardDataset.name, DynRetBean.createBean(bean));
ret.put(FlowHelper.DATASET_NAME_FLOW, DynRetBean.createBean(flowInstance.getProcInst()));
ret.put(FlowHelper.DATASET_NAME_COMMENT, DynRetBean.createList(SwListData.EMPTY));
}
@@ -54,11 +54,10 @@ public class FlowSingleLoadHandler extends LCSingleLoadHandler implements FlowLi
PageDataset cardDataset = LCSingleHelper.findCardDataset(datasets);

SwMap data = provider.loadData(filter, cardDataset);
ret.put(cardDataset.name, data);
ret.put(cardDataset.name, DynRetBean.createBean(data));

//加载流程信息
FlowInstance flowInstance = new FlowInstance(this, us);
flowInstance.load(id, taskId);
flowInstance = FlowInstance.createById(us,this, id, taskId);

ret.put(FlowHelper.DATASET_NAME_FLOW, DynRetBean.createBean(flowInstance.getProcInst()));
ret.put(FlowHelper.DATASET_NAME_COMMENT, DynRetBean.createList(SwListData.create(flowInstance.loadComment(), 0)));


+ 28
- 10
smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/flow/listcard/single/FlowSingleSaveHandler.java Целия файл

@@ -4,7 +4,9 @@ import cc.smtweb.framework.core.common.R;
import cc.smtweb.framework.core.common.SwMap;
import cc.smtweb.framework.core.db.impl.DefaultEntity;
import cc.smtweb.framework.core.exception.BizException;
import cc.smtweb.framework.core.mvc.service.SwListData;
import cc.smtweb.system.bpm.web.design.form.define.PageDataset;
import cc.smtweb.system.bpm.web.engine.dynPage.DynRetBean;
import cc.smtweb.system.bpm.web.engine.flow.FlowHelper;
import cc.smtweb.system.bpm.web.engine.flow.FlowInstance;
import cc.smtweb.system.bpm.web.engine.flow.FlowListener;
@@ -18,12 +20,6 @@ public class FlowSingleSaveHandler<T extends DefaultEntity> extends LCSingleSave
protected FlowInstance flowInstance;

@Override
public R save() {

return super.save();
}

@Override
protected T readBeanFromPage(PageDataset pageDataSet, SwMap pageData) {
T bean = super.readBeanFromPage(pageDataSet, pageData);

@@ -35,14 +31,14 @@ public class FlowSingleSaveHandler<T extends DefaultEntity> extends LCSingleSave
data = data.readMap("form");
if (data == null) throw new BizException("没有找到待保存的流程数据!");

FlowInstance flowInstance = new FlowInstance(this, us);
if (bean.isNew()) {
flowInstance.create(form.getBillType());
flowInstance = FlowInstance.createByBillType(us, this, form.getBillType());
} else {
flowInstance.load(id, taskId);
flowInstance = FlowInstance.createById(us,this, id, taskId);
}
flowInstance.readFromPage(data);

flowInstance.getProcInst().setIsNew(bean.isNew());
flowInstance.setBillInfo(getBillCode(), getBillInfo(), getBillUrl());
return bean;
}

@@ -51,4 +47,26 @@ public class FlowSingleSaveHandler<T extends DefaultEntity> extends LCSingleSave
super.saveBean(bean);
flowInstance.save();
}

@Override
protected void afterSave(SwMap ret, T bean) {
super.afterSave(ret, bean);
ret.put(FlowHelper.DATASET_NAME_FLOW, DynRetBean.createBean(flowInstance.getProcInst()));
ret.put(FlowHelper.DATASET_NAME_COMMENT, DynRetBean.createList(SwListData.EMPTY));
}

//单据编号
protected String getBillCode() {
return "";
}

//单据信息,在待办中显示
protected String getBillInfo() {
return "";
}

//单据url,待办中跳链
protected String getBillUrl() {
return "";
}
}

+ 30
- 1
smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/flow/listcard/single/FlowSingleService.java Целия файл

@@ -1,7 +1,13 @@
package cc.smtweb.system.bpm.web.engine.model.flow.listcard.single;

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.SwMap;
import cc.smtweb.framework.core.db.impl.DefaultEntity;
import cc.smtweb.framework.core.mvc.service.AbstractHandler;
import cc.smtweb.framework.core.mvc.service.IWorker;
import cc.smtweb.framework.core.session.UserSession;
import cc.smtweb.system.bpm.web.engine.model.listcard.single.LCSingleDelHandler;
import cc.smtweb.system.bpm.web.engine.model.listcard.single.LCSingleLoadHandler;
import cc.smtweb.system.bpm.web.engine.model.listcard.single.LCSingleSaveHandler;
@@ -13,6 +19,13 @@ import cc.smtweb.system.bpm.web.engine.model.listcard.single.LCSingleService;
*/
@SwService
public class FlowSingleService extends LCSingleService {
public static final String TYPE_FLOW = "flow";
@Override
protected AbstractHandler createHandler(String type) {
if (TYPE_FLOW.equals(type)) return new FlowTransHandler();
return super.createHandler(type);
}

@Override
protected LCSingleSaveHandler getSaveHandler() {
return new FlowSingleSaveHandler();
@@ -25,6 +38,22 @@ public class FlowSingleService extends LCSingleService {

@Override
protected LCSingleDelHandler getDelHandler() {
return super.getDelHandler();
return new FlowDelHandler();
}

protected R flowHandler(SwMap params, UserSession us, IWorker<FlowTransHandler> worker) {
try {
FlowTransHandler handler = (FlowTransHandler)getHandler(params, us, TYPE_FLOW);
return worker.doWork(handler);
} catch (Exception e) {
return R.error("操作失败!", e);
}
}
public R submit(@SwBody SwMap params, UserSession us) {
return flowHandler(params, us, FlowTransHandler::submit);
}

public R retake(@SwBody SwMap params, UserSession us) {
return flowHandler(params, us, FlowTransHandler::submit);
}
}

+ 48
- 0
smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/flow/listcard/single/FlowTransHandler.java Целия файл

@@ -0,0 +1,48 @@
package cc.smtweb.system.bpm.web.engine.model.flow.listcard.single;

import cc.smtweb.framework.core.common.R;
import cc.smtweb.framework.core.common.SwMap;
import cc.smtweb.framework.core.mvc.service.SwListData;
import cc.smtweb.system.bpm.web.engine.dynPage.AbstractDynPageHandler;
import cc.smtweb.system.bpm.web.engine.dynPage.DynRetBean;
import cc.smtweb.system.bpm.web.engine.flow.FlowHelper;
import cc.smtweb.system.bpm.web.engine.flow.FlowInstance;
import cc.smtweb.system.bpm.web.engine.flow.FlowListener;
import cc.smtweb.system.bpm.web.engine.flow.entity.Task;

import java.util.List;

/**
* Created by Akmm at 2022-09-01 15:03
* 流程流转
*/
public class FlowTransHandler extends AbstractDynPageHandler implements FlowListener{
//流程id
protected long billId;
//任务id
protected long taskId;
protected FlowInstance flowInstance;

private void loadFlowInstance() {
if (flowInstance == null) {
billId = params.readLong("id");
taskId = params.readLong("taskId");
flowInstance = FlowInstance.createById(us, this, billId, taskId);
}
}

private SwMap buildRetData() {
SwMap ret = new SwMap();
ret.put(FlowHelper.DATASET_NAME_FLOW, DynRetBean.createBean(flowInstance.getProcInst()));
ret.put(FlowHelper.DATASET_NAME_COMMENT, DynRetBean.createList(SwListData.EMPTY));
return ret;
}

public R submit() {
loadFlowInstance();
flowInstance.submit(params.readString("comment"));
return R.success(buildRetData());
}

}

+ 0
- 1
smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/listcard/mastersub/LCMsSaveHandler.java Целия файл

@@ -122,7 +122,6 @@ public class LCMsSaveHandler extends LCSingleSaveHandler {
bean.setIsNew(true);
//暂时不考虑list保存的情况
bean.getData().putAll(data);
setNewId(bean);
} else {
bean = dao.queryEntity(id);
if (bean == null) {


+ 2
- 2
smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/listcard/normal/LCNormalDelHandler.java Целия файл

@@ -29,7 +29,7 @@ public class LCNormalDelHandler extends LCSingleDelHandler {
//数据集
String dataSet = params.readString("dataset");
PageDataset delDataSet = this.datasets.findByName(dataSet);
Assert.notNull(delDataSet,"未获取到数据集:"+dataSet);
Assert.notNull(delDataSet, "未获取到数据集:" + dataSet);
//
checkBean(delDataSet, id);
//
@@ -50,7 +50,7 @@ public class LCNormalDelHandler extends LCSingleDelHandler {
AbstractCache cache = CacheManager.getIntance().getCache(table.getName());
cache.remove(id);
}
localDelSuccess(id, table);
afterCommit(id, table);
}
});
return R.success();


+ 12
- 3
smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/listcard/single/LCSingleDelHandler.java Целия файл

@@ -57,17 +57,26 @@ public class LCSingleDelHandler extends AbstractDynPageHandler {
AbstractCache cache = CacheManager.getIntance().getCache(table.getName());
cache.remove(id);
}
localDelSuccess(id, table);
afterCommit(id, table);
}

@Override
public void doAfterDbRollback() {
afterRollback(id);
}
});
return R.success();
}

protected void localDel(long id, ModelTable table) {
//回调:::删除之后
protected void localDel(long id, ModelTable table) {}

//回调:::提交成功后
protected void afterCommit(long id, ModelTable table) {
}

protected void localDelSuccess(long id, ModelTable table) {
//回调:::提交失败,事务回滚后
protected void afterRollback(long id) {

}



+ 4
- 9
smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/listcard/single/LCSingleLoadHandler.java Целия файл

@@ -18,14 +18,9 @@ public class LCSingleLoadHandler extends AbstractDynPageHandler {
SwMap ret = new SwMap();
//返回的数据,以dataset.name为key,查出的结果(bean或list)为value
PageDataset cardDataset = LCSingleHelper.findCardDataset(datasets);
SwMap data;
//懒加载,给个空对象
if (cardDataset.lazy) {
data = new SwMap();
} else {
data = DynPageHelper.createBean(cardDataset);
}
ret.put(cardDataset.name, data);
SwMap data = DynPageHelper.createBean(cardDataset);

ret.put(cardDataset.name, DynRetBean.createBean(data));

afterAdd(ret, data);
return R.success(ret);
@@ -48,7 +43,7 @@ public class LCSingleLoadHandler extends AbstractDynPageHandler {
PageDataset cardDataset = LCSingleHelper.findCardDataset(datasets);

SwMap data = provider.loadData(filter, cardDataset);
ret.put(cardDataset.name, data);
ret.put(cardDataset.name, DynRetBean.createBean(data));

afterLoad(ret, data);
return R.success(ret);


+ 9
- 10
smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/listcard/single/LCSingleSaveHandler.java Целия файл

@@ -35,10 +35,6 @@ import java.util.Map;
public class LCSingleSaveHandler<T extends DefaultEntity> extends AbstractDynPageHandler {
private Map<String, List<T>> mapTreeBean = new HashMap<>();

protected void setNewId(T bean) {
bean.setEntityId(DbEngine.getInstance().nextId());
}

/**
* 保存指定数据集操作,入参:{pageId,dataset:"", data:{form:{},list: {total:0,rows:[]}}, filter:{}}
*/
@@ -74,9 +70,14 @@ public class LCSingleSaveHandler<T extends DefaultEntity> extends AbstractDynPag
afterRollback(bean);
}
});
return R.success(LCSingleHelper.buildRetData(pageDataSet.name, bean.getData()));
bean.removeStatus();
SwMap ret = LCSingleHelper.buildRetData(pageDataSet.name, bean.getData());
afterSave(ret, bean);
return R.success(ret);
}

protected void afterSave(SwMap ret, T bean) {}

/**
* 从页面获取待保存的bean
*
@@ -93,17 +94,15 @@ public class LCSingleSaveHandler<T extends DefaultEntity> extends AbstractDynPag
data = data.readMap("form");
if (data == null) throw new BizException("没有找到待保存的表数据:" + pageDataSet.name);

long id = data.readLong(table.getIdField());

boolean isNew = data.readBool(DefaultEntity.statusKey);
EntityDao<T> dao = DbEngine.getInstance().findDao(table.getName());
T bean;
if (id <= 0L) {
if (isNew) {
bean = dao.createBean();
bean.setIsNew(true);
//暂时不考虑list保存的情况
bean.getData().putAll(data);
setNewId(bean);
} else {
long id = data.readLong(table.getIdField());
bean = dao.queryEntity(id);
if (bean == null) {
throw new BizException("没有找到待保存的记录:" + table.getName() + "." + id);


+ 2
- 2
smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/base/billType/BillTypeSaveHandler.java Целия файл

@@ -9,9 +9,9 @@ import org.apache.commons.lang3.StringUtils;
* Created by Akmm at 2022-08-25 19:11
*/
public class BillTypeSaveHandler extends LCSingleSaveHandler<BillType> {
//id=code
@Override
protected void setNewId(BillType bean) {
protected void checkBean(BillType bean) {
super.checkBean(bean);
if (StringUtils.isEmpty(bean.getCode())) {
throw new BizException("编码不能为空!");
}


+ 2
- 2
smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/base/dict/DictHandler.java Целия файл

@@ -13,7 +13,8 @@ public class DictHandler {
static class DictSaveHandler extends DynPageSaveHandler {

@Override
protected void setNewId(DefaultEntity bean) {
protected void checkBean(DefaultEntity bean) {
super.checkBean(bean);
//字典 id用 类型id+编码
if (bean instanceof Dict) {
Dict dict = (Dict) bean;
@@ -26,7 +27,6 @@ public class DictHandler {
dictType.setEntityId(NumberUtil.getLongIgnoreErr(dictType.getCode()));
return;
}
super.setNewId(bean);
}
}
}

+ 2
- 3
smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/area/AreaHandler.java Целия файл

@@ -14,12 +14,11 @@ import cc.smtweb.system.bpm.web.engine.dynPage.DynPageSaveHandler;
public class AreaHandler {
static class AreaSaveHandler extends DynPageSaveHandler {
@Override
protected void setNewId(DefaultEntity bean) {
protected void checkBean(DefaultEntity bean) {
super.checkBean(bean);
if (bean instanceof Area) {
Area area = (Area) bean;
area.setEntityId(NumberUtil.getLongIgnoreErr(area.getCode()));
} else {
super.setNewId(bean);
}
}
}


+ 5
- 1
smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/userGroup/UserGroupHelper.java Целия файл

@@ -42,7 +42,11 @@ public class UserGroupHelper {
* @return
*/
public static Set<Long> getUserIdList(long group_id, ProcInst pro_inst, int handle_range, UserSession us) {
if (group_id <= 0L) return null;//未设置分组,默认true
if (group_id <= 0L) {
Set<Long> set = new HashSet<>();
set.add(1L);
return set;//未设置分组,默认所有
}
return null;
/*
List<UserGroupItemEntity> items = UserGroupItemEntityBuffer.getInstance().getListByGroup(group_id);


+ 473
- 330
smtweb-framework/bpm/src/main/resources/static/template/default/model_card_flow.ftl Целия файл

@@ -1,5 +1,7 @@
<#--<#assign group_num =layout.flow[0].fields?size / param.group_num>-->
{
"version": 6,
<#-- "group_num":${group_num?ceiling},-->
"form": [
{
"page": {
@@ -75,34 +77,46 @@
{
"type": "fx-button",
"props": {
"name": "button:delete",
"label": "删除",
"leftIcon": "delete",
"action": "button:delCard"
},
"id": "${newId()}"
"id": "${newId()}",
"vars": {
"$ref": "$ref"
}
},
{
"id": "${newId()}",
"type": "fx-button",
"props": {
"name": "button:new",
"label": "新增",
"type": "primary",
"leftIcon": "plus",
"action": "button:addCard"
},
"vars": {
"$ref": "$ref"
}
},
{
"id": "id182e345bb7b",
"type": "fx-button",
"props": {
"label": "返回",
"type": "success",
"size": "default",
"action": "button:backList",
"leftIcon": "list-top"
},
"events": {}
}
{
"id": "${newId()}",
"type": "fx-button",
"props": {
"name": "button:return",
"label": "返回",
"type": "success",
"size": "default",
"action": "button:backList",
"leftIcon": "list-top"
},
"events": {},
"vars": {
"$ref": "$ref"
}
}
]
}
}
@@ -112,25 +126,6 @@
},
{
"id": "${newId()}",
"type": "fx-form-panel",
"shape": "panel",
"props": {
"size": "0"
},
"children": [
{
"id": "${newId()}",
"type": "fx-divider",
"props": {
"label": "",
"contentPosition": "center",
"direction": "horizontal"
}
}
]
},
{
"id": "${newId()}",
"type": "fx-split-panel",
"shape": "panel",
"props": {
@@ -140,262 +135,235 @@
"name": "s12"
},
"children": [
{
<#list layout.flow as group>
"id": "${newId()}",
"type": "fx-form-panel",
"shape": "panel",
"props": {
"size": "0",
<#if param.col lte 1>
"gridTemplateColumns": "1fr 2fr",
<#elseif param.col gte 2>
"gridTemplateColumns": "1fr 1fr 1fr",
</#if>
"paddingTop": 32
},
<#assign fields = group.fields>
"children": [
<#list fields as field>
{
"id": "id${newId()}",
<#if (field.readonly = true)>
"type": "fx-text",
<#else>
"type": "${field.editor}",
</#if>
"props": {
"label": "${field.label}",
"type": "text",
"dataset": "${field.dataset}",
"required": "${field.required}",
"field": "${field.id}",
<#if field.maxlength gt 0>
"maxlength": ${field.maxlength},
</#if>
<#if field.lookup??>
"lookup": {
<#list field.lookup as k, v>
"${k}": "${v}" <#if k_has_next>,</#if>
</#list>
},
</#if>
"placeholder": "请输入内容",
<#if (param.col = 2)>
"tips": "${field.desc}",
</#if>
"labelWidth": 100,
<#if (field.readonly = true)>
"readonly": true,
<#else>
"readonly": false,
</#if>
"affixError": true
},
"events": {}
}
<#if field_has_next>
<#if (param.col lte 1 )>
<#if (field.desc != "")>
,{
"id": "id181d83cdb41",
"type": "fx-label",
"props": {
"label": "${field.desc}",
"labelWidth": 0,
"affixError": true,
"labelAlign": "left"
}
}
<#else>
,{
"id": "id${newId()}",
"type": "fx-placeholder",
"props": {
"label": "占位"
},
"layout": {
"row": 1
}
}
</#if>
</#if>
<#if (param.col = 2 && ((field_index+1) % 2 = 0 ) )>
,{
"id": "id${newId()}",
"type": "fx-placeholder",
"props": {
"label": "占位"
},
"layout": {
"row": 1
}
}
</#if>
,
</#if>
</#list>
]
</#list>
},
<#list layout.card as group>
<#assign field = group.fields>
{
"id": "${newId()}",
"type": "fx-form-panel",
"shape": "panel",
"props": {
"size": "10",
"backgroundColor": "transparent"
"size": "10",
"backgroundColor": "--color-transparent"
},
"children": []
},
{
"id": "${newId()}",
"type": "fx-split-panel",
"type": "fx-form-panel",
"shape": "panel",
"props": {
"size": "48",
"horizontal": true
"size": "0",
<#if param.col lte 1>
"gridTemplateColumns": "1fr 2fr",
<#elseif param.col gte 2>
"gridTemplateColumns": "1fr 1fr 1fr",
</#if>
"paddingTop": 32
},
"children": [
{
"id": "${newId()}",
"type": "fx-form-panel",
"shape": "panel",
"props": {
"size": "",
"label": "",
"colNum": 2,
"alignY": "center",
"paddingLeft": 32,
"paddingRight": 32,
"shadow": "",
"backgroundImage": "bgImg-region-title"
},
"children": [
{
"id": "id${newId()}",
"type": "fx-title",
"props": {
"label": "子表列表配置",
"fontSize": 16,
"color": "#01070D",
"fontWeight": "bold",
"showPrefix": false,
"prefixWidth": 5,
"prefixHeight": 24,
"prefixColor": "#1E90FF"
}
}
]
},
{
"id": "id${newId()}",
"type": "fx-form-panel",
"shape": "panel",
"props": {
"alignX": "center",
"size": "150",
"alignY": "center",
"backgroundImage": "bgImg-region-title"
},
"children": [
{
"id": "id${newId()}",
"type": "fx-button",
"props": {
"label": "新增",
"type": "primary",
"action": "button:addRow",
"size": "default",
"linkType": "dialog",
"leftIcon": "plus",
"fxLink": "dialog:cardSubDialog",
"fxLink_text": "子表编辑卡片",
"nextAction": "",
"preAction": "",
"dataset": "${layout.listSub[0].dataset}"
},
"events": {}
}
]
}
]
<#list group.fields as fields>
<#-- <#list num..(group.fields?size?number)!0 as i>-->
{
"id": "id${newId()}",
<#if (fields.readonly = true)>
"type": "fx-text",
<#else>
"type": "${fields.editor}",
</#if>
"props": {
"label": "${fields.label}",
"type": "text",
"dataset": "${fields.dataset}",
"required": "${fields.required}",
"field": "${fields.id}",
<#if fields.maxlength gt 0>
"maxlength": ${fields.maxlength},
</#if>
<#if fields.lookup??>
"lookup": {
<#list fields.lookup as k, v>
"${k}": "${v}" <#if k_has_next>,</#if>
</#list>
},
</#if>
"placeholder": "请输入内容",
<#if (param.col = 2)>
"tips": "${fields.desc}",
</#if>
"labelWidth": 100,
<#if (fields.readonly = true)>
"readonly": true,
<#else>
"readonly": false,
</#if>
"affixError": true
},
"events": {}
}
<#if fields_has_next>
<#if (param.col lte 1 )>
<#if (fields.desc != "")>
,{
"id": "id181d83cdb41",
"type": "fx-label",
"props": {
"label": "${fields.desc}",
"labelWidth": 0,
"affixError": true,
"labelAlign": "left"
}
}
<#else>
,{
"id": "id${newId()}",
"type": "fx-placeholder",
"props": {
"label": "占位"
},
"layout": {
"row": 1
}
}
</#if>
</#if>
<#if (param.col = 2 && ((fields_index+1) % 2 = 0 ) )>
,{
"id": "id${newId()}",
"type": "fx-placeholder",
"props": {
"label": "占位"
},
"layout": {
"row": 1
}
}
</#if>
,
</#if>
</#list>
]

},
<#-- <#if i+1 lt param.group_num?number>-->
<#-- ,-->
<#-- </#if>-->
<#-- </#list>-->
</#list>
<#list layout.flow as group>
<#assign field = group.fields>
{
"id": "${newId()}",
"type": "fx-form-panel",
"shape": "panel",
"props": {
"size": "10",
"backgroundColor": "--color-transparent"
},
"children": []
},
{

"id": "${newId()}",
"type": "fx-form-panel",
"shape": "panel",
"props": {
"size": "400",
"label": "列表",
"colNum": 0,
"paddingLeft": 20,
"paddingRight": 20,
"shadow": "",
"paddingTop": 0
"size": "0",
<#if param.col lte 1>
"gridTemplateColumns": "1fr 2fr",
<#elseif param.col gte 2>
"gridTemplateColumns": "1fr 1fr 1fr",
</#if>
"paddingTop": 32
},
"children": [
<#list group.fields as fields>
<#-- <#list num..(group.fields?size?number)!0 as i>-->
{
"id": "id${newId()}",
"type": "fx-table",
<#if (fields.readonly = true)>
"type": "fx-text",
<#else>
"type": "${fields.editor}",
</#if>
"props": {
"label": "${fields.label}",
"type": "text",
"dataset": "${fields.dataset}",
"required": "${fields.required}",
"field": "${fields.id}",
<#if fields.maxlength gt 0>
"maxlength": ${fields.maxlength},
</#if>
<#if fields.lookup??>
"lookup": {
<#list fields.lookup as k, v>
"${k}": "${v}" <#if k_has_next>,</#if>
</#list>
},
</#if>
"placeholder": "请输入内容",
<#if (param.col = 2)>
"tips": "${fields.desc}",
</#if>
"labelWidth": 100,
<#if (fields.readonly = true)>
"readonly": true,
<#else>
"readonly": false,
</#if>
"affixError": true
},
"events": {}
}
<#if fields_has_next>
<#if (param.col lte 1 )>
<#if (fields.desc != "")>
,{
"id": "id181d83cdb41",
"type": "fx-label",
"props": {
"label": "${fields.desc}",
"labelWidth": 0,
"affixError": true,
"labelAlign": "left"
}
}
<#else>
,{
"id": "id${newId()}",
"type": "fx-placeholder",
"props": {
"label": "表格",
"border": true,
"stripe": true,
"showHeader": true,
"fit": true,
"dataset": "${group.dataset}",
"actionWidth": 150
"label": "占位"
},
"slots": {
"default": [
<#list layout.comment[0].fields as field>
{
"id": "id${newId()}",
"type": "fx-table-column",
"props": {
"field": "${field.id}",
"label": "${field.label}"
}
}
<#if field_has_next>,</#if>
</#list>
],
"button": [
{
"id": "id${newId()}",
"type": "fx-button",
"props": {
"label": "编辑",
"type": "text",
"leftIcon": "edit",
"action": "button:edit",
"dataset": "${layout.listSub[0].dataset}",
"link": true,
"linkType": "",
"nextAction": "",
"fxLink": ""
}
},
{
"id": "id${newId()}",
"type": "fx-button",
"props": {
"label": "删除",
"type": "text",
"leftIcon": "delete-themes",
"action": "button:remove",
"preAction": "",
"link": true,
"confirm": ""
}
}
]
"layout": {
"row": 1
}
}
</#if>
</#if>
<#if (param.col = 2 && ((fields_index+1) % 2 = 0 ) )>
,{
"id": "id${newId()}",
"type": "fx-placeholder",
"props": {
"label": "占位"
},
"events": {}
"layout": {
"row": 1
}
}
</#if>
,
</#if>
</#list>
]

}
<#-- <#if i+1 lt param.group_num?number>-->
<#-- ,-->
<#-- </#if>-->
<#-- </#list>-->
</#list>
]
},
{
@@ -418,94 +386,269 @@
"alignX": "center"
},
"children": [
{
"id": "${newId()}",
"type": "fx-button-group",
"props": {
"menus": []
},
"slots": {
"default": [
{
"type": "fx-button",
"props": {
"name": "button:save-and-new",
"label": "保存并新增",
"type": "primary",
"action": "button:saveAddCard",
"linkType": "curr"
},
"id": "${newId()}",
"vars": {
"$ref": "$ref"
}
},
{
"type": "fx-button",
"props": {
"name": "button:save",
"label": "保存",
"type": "success",
"action": "button:saveCard"
},
"id": "${newId()}",
"vars": {
"$ref": "$ref"
}
},
{
"type": "fx-button",
"props": {
"name": "button:submit",
"label": "提交",
"type": "primary",
"action": "button:submit"
},
"id": "${newId()}",
"vars": {
"$ref": "$ref"
}
},
{
"type": "fx-button",
"props": {
"name": "button:retake",
"label": "取回",
"type": "info",
"action": "button:retake"
},
"id": "${newId()}",
"vars": {
"$ref": "$ref"
}
},
{
"type": "fx-button",
"props": {
"name": "button:reject",
"label": "驳回",
"type": "warning",
"action": "button:reject"
},
"id": "${newId()}",
"vars": {
"$ref": "$ref"
}
},
{
"type": "fx-button",
"props": {
"name": "button:disuse",
"label": "作废",
"type": "danger",
"action": "button:cancel"
},
"id": "${newId()}",
"vars": {
"$ref": "$ref"
}
},
{
"type": "fx-button",
"props": {
"name": "button:interrupt",
"label": "终止",
"type": "danger",
"action": "button:interrupt"
},
"id": "${newId()}",
"vars": {
"$ref": "$ref"
}
}
]
}
}
]
},
{
"id": "${newId()}",
"type": "fx-button-group",
"type": "fx-form-panel",
"shape": "panel",
"props": {
"menus": []
"size": "16",
"backgroundColor": "--color-transparent"
},
"slots": {
"default": [
"children": []
}
]
}
},
{
"page": {
"id": "id182f81da2e3",
"type": "fx-dialog",
"props": {
"title": "审批意见",
"key": "dlgOpt",
"width": "450px",
"height": "260px",
"showPrefix": true
},
"events": {}
},
"graph": {
"shape": "panel",
"id": "root_panel",
"type": "fx-split-panel",
"props": {
"horizontal": false,
"shadow": "never"
},
"children": [
{
"id": "182f81da2e6",
"type": "fx-split-panel",
"shape": "panel",
"props": {
"horizontal": false
},
"children": [
{
"type": "fx-button",
"shape": "panel",
"id": "form_panel",
"type": "fx-form-panel",
"props": {
"label": "保存并新增",
"type": "primary",
"action": "button:saveAddCard",
"linkType": "curr"
"colNum": 1,
"paddingTop": 24,
"size": "0"
},
"id": "${newId()}"
"children": [
{
"id": "id182f81da30b",
"type": "fx-select",
"props": {
"label": "备选意见",
"clearable": true,
"labelWidth": 100,
"affixError": true,
"size": "default"
},
"events": {}
},
{
"id": "id182f81da30e",
"type": "fx-textarea",
"props": {
"label": "处理意见",
"maxlength": 200,
"placeholder": "请输入内容",
"labelWidth": 100,
"affixError": true,
"size": "default",
"dataset": "ds_182edc699cc",
"field": "id_182edc699cd",
"rows": 4
},
"events": {}
}
]
},
{
"type": "fx-button",
"props": {
"label": "保存",
"leftIcon": "save",
"type": "success",
"action": "button:saveCard"
},
"id": "${newId()}"
},{
"type": "fx-button",
"props": {
"label": "提交",
"leftIcon": "save",
"type": "success",
"action": "button:submit"
},
"id": "${newId()}"
},{
"type": "fx-button",
"props": {
"label": "取回",
"leftIcon": "save",
"type": "success",
"action": "button:retake"
},
"id": "${newId()}"
},{
"type": "fx-button",
"props": {
"label": "驳回",
"leftIcon": "save",
"type": "success",
"action": "button:reject"
},
"id": "${newId()}"
},{
"type": "fx-button",
"props": {
"label": "作废",
"leftIcon": "save",
"type": "success",
"action": "button:cancel"
},
"id": "${newId()}"
},{
"type": "fx-button",
"id": "182f81da311",
"type": "fx-form-panel",
"shape": "panel",
"props": {},
"children": []
}
]
},
{
"id": "182f81da2e7",
"type": "fx-form-panel",
"shape": "panel",
"props": {
"size": "0"
},
"children": [
{
"id": "id182f81da2e8",
"type": "fx-divider",
"props": {
"label": "终止",
"leftIcon": "save",
"type": "success",
"action": "button:interrupt"
},
"id": "${newId()}"
"label": "",
"contentPosition": "center",
"direction": "horizontal"
}
}
]
}
}
]
]
},
{
"id": "${newId()}",
{
"id": "182f81da2e4",
"type": "fx-form-panel",
"shape": "panel",
"props": {
"size": "16",
"backgroundColor": "--color-transparent"
"size": "50",
"alignX": "end",
"alignY": "center",
"paddingRight": 10
},
"children": []
}
"children": [
{
"id": "id182f81da303",
"type": "fx-button-group",
"props": {
"showDropdown": false
},
"slots": {
"default": [
{
"type": "fx-button",
"props": {
"label": "确认",
"leftIcon": "correct",
"type": "primary",
"action": "button:dlgDynConfirm",
"linkType": ""
},
"id": "id182f81da304",
"events": {}
},
{
"type": "fx-button",
"props": {
"label": "取消",
"leftIcon": "error",
"action": "button:closeDialog"
},
"id": "id182f81da308",
"events": {}
}
],
"dropdown": []
}
}
]
}
]
}
}


+ 19
- 3
smtweb-framework/core/src/main/java/cc/smtweb/framework/core/db/dao/AbstractEntityDao.java Целия файл

@@ -5,6 +5,7 @@ import cc.smtweb.framework.core.annotation.SwColumnForeign;
import cc.smtweb.framework.core.annotation.SwTable;
import cc.smtweb.framework.core.cache.CacheManager;
import cc.smtweb.framework.core.common.SwEnum;
import cc.smtweb.framework.core.db.DbEngine;
import cc.smtweb.framework.core.exception.SwException;
import cc.smtweb.framework.core.db.cache.ModelTableCache;
import cc.smtweb.framework.core.db.impl.DefaultEntity;
@@ -66,8 +67,8 @@ public abstract class AbstractEntityDao<T> {

tableName = table.value();
modelTable = ModelTableCache.getInstance().getByName(tableName);
if(null == modelTable){
log.error("未找到缓存表结构:"+tableName);
if (null == modelTable) {
log.error("未找到缓存表结构:" + tableName);
}
if (DefaultEntity.class.isAssignableFrom(type)) {
for (ModelField field : modelTable.getFields()) {
@@ -292,7 +293,7 @@ public abstract class AbstractEntityDao<T> {

private EntityColumn findIdColumn() {
ModelField field = modelTable.findIdField();
EntityColumn idColumn = field != null ? columns.get(field.getName()) : null;
EntityColumn idColumn = field != null ? columns.get(field.getName()): null;
if (idColumn == null) {
throw new DbException(tableName + " not define id column");
}
@@ -402,11 +403,26 @@ public abstract class AbstractEntityDao<T> {
DefaultEntity b = (DefaultEntity) bean;
b.init();
b.setTableName(this.tableName);
b.setIsNew(true);
}
return bean;
} catch (Exception e) {
throw new SwException(e);
}
}

public T createBean(long userId) {
T b = createBean();
if (b instanceof DefaultEntity) {
DefaultEntity bean = (DefaultEntity) b;
ModelTable table = ModelTableCache.getInstance().getByName(tableName);
ModelField field = table.findFieldByType(SwEnum.FieldType.CREATE_USER.value);
if (field != null) bean.put(field.getName(), userId);
field = table.findFieldByType(SwEnum.FieldType.UPDATE_USER.value);
if (field != null) bean.put(field.getName(), userId);
}
return b;

}
}


+ 2
- 2
smtweb-framework/core/src/main/java/cc/smtweb/framework/core/db/impl/DefaultEntity.java Целия файл

@@ -16,8 +16,8 @@ import java.io.Serializable;
*/
public class DefaultEntity extends BaseBean implements Serializable, Cloneable {
//表名
private final static String tableNameKey = "_def_table_name";
private final static String statusKey = "_status";
public final static String tableNameKey = "_def_table_name";
public final static String statusKey = "_status";

public DefaultEntity() {
}


+ 4
- 3
smtweb-framework/core/src/main/java/cc/smtweb/framework/core/mvc/service/AbstractCompService.java Целия файл

@@ -2,6 +2,7 @@ package cc.smtweb.framework.core.mvc.service;

import cc.smtweb.framework.core.annotation.SwBody;
import cc.smtweb.framework.core.common.R;
import cc.smtweb.framework.core.db.impl.DefaultEntity;
import cc.smtweb.framework.core.exception.BizException;
import cc.smtweb.framework.core.exception.SwException;
import cc.smtweb.framework.core.common.SwMap;
@@ -41,17 +42,17 @@ public abstract class AbstractCompService {

//保存
public R save(@SwBody SwMap params, UserSession us) {
return pageHandler(params, us, TYPE_SAVE, handler -> ((AbstractSaveHandler)handler).save());
return pageHandler(params, us, TYPE_SAVE, handler -> ((DefaultSaveHandler)handler).save());
}

//树,换爹
public R trcp(@SwBody SwMap params, UserSession us) {
return pageHandler(params, us, TYPE_SAVE, handler -> ((AbstractSaveHandler)handler).changeParent());
return pageHandler(params, us, TYPE_SAVE, handler -> ((DefaultSaveHandler)handler).changeParent());
}

//读取
public R load(@SwBody SwMap params, UserSession us) {
return pageHandler(params, us, TYPE_LOAD, handler -> ((AbstractLoadHandler)handler).load());
return pageHandler(params, us, TYPE_LOAD, handler -> ((DefaultLoadHandler)handler).load());
}

//删除


+ 1
- 0
smtweb-framework/core/src/main/java/cc/smtweb/framework/core/mvc/service/AbstractLoadHandler.java Целия файл

@@ -5,6 +5,7 @@ import cc.smtweb.framework.core.common.R;
/**
* Created by Akmm at 2022/3/2 19:44
*/
@Deprecated
public abstract class AbstractLoadHandler<T> extends AbstractHandler {

public R load() {


+ 1
- 2
smtweb-framework/core/src/main/java/cc/smtweb/framework/core/mvc/service/AbstractSaveHandler.java Целия файл

@@ -10,12 +10,11 @@ import lombok.extern.slf4j.Slf4j;
* 保存
*/
@Slf4j
@Deprecated
public abstract class AbstractSaveHandler<T> extends AbstractHandler {
protected T bean;
protected boolean isNew;



public R save() {
long id = readId();



+ 17
- 14
smtweb-framework/core/src/main/java/cc/smtweb/framework/core/mvc/service/DefaultLoadHandler.java Целия файл

@@ -1,5 +1,6 @@
package cc.smtweb.framework.core.mvc.service;

import cc.smtweb.framework.core.common.R;
import cc.smtweb.framework.core.common.SwEnum;
import cc.smtweb.framework.core.db.DbEngine;
import cc.smtweb.framework.core.db.EntityDao;
@@ -12,25 +13,27 @@ import cc.smtweb.framework.core.db.vo.ModelTable;
* Created by Akmm at 2022/3/2 19:52
* 默认实体实现
*/
public class DefaultLoadHandler<T extends DefaultEntity> extends AbstractLoadHandler<T> {
public class DefaultLoadHandler<T extends DefaultEntity> extends AbstractHandler {
protected String tableName;

public DefaultLoadHandler(String tableName) {
this.tableName = tableName;
public R load() {
long id = params.readLong("id", 0L);
T bean;
final EntityDao<T> dao = DbEngine.getInstance().findDao(tableName);
if (id <= 0L) {
bean = dao.createBean(us.getUserId());
bean.setEntityId(DbEngine.getInstance().nextId());
} else {
bean = dao.queryEntity(id);
}
afterLoad(bean);
return R.success(bean);
}

@Override
protected T createComp() {
final EntityDao<T> dao = DbEngine.getInstance().findDao(tableName);
T bean = dao.createBean();
ModelTable table = ModelTableCache.getInstance().getByName(tableName);
ModelField field = table.findFieldByType(SwEnum.FieldType.CREATE_USER.value);
if (field != null) bean.put(field.getName(), us.getUserId());
return bean;
public DefaultLoadHandler(String tableName) {
this.tableName = tableName;
}

@Override
protected T loadComp(long id) {
return new DefaultProvider<T>(tableName).getBean(id);
protected void afterLoad(T bean) {
}
}

+ 34
- 35
smtweb-framework/core/src/main/java/cc/smtweb/framework/core/mvc/service/DefaultSaveHandler.java Целия файл

@@ -22,8 +22,9 @@ import java.util.List;
* Created by Akmm at 2022/3/2 19:52
* 默认实体实现
*/
public class DefaultSaveHandler<T extends DefaultEntity> extends AbstractSaveHandler<T> {
public class DefaultSaveHandler<T extends DefaultEntity> extends AbstractHandler{
protected String tableName;
protected T bean;

private List<T> listTreeBean = null;

@@ -31,41 +32,44 @@ public class DefaultSaveHandler<T extends DefaultEntity> extends AbstractSaveHan
this.tableName = tableName;
}

@Override
protected T createComp() {
final EntityDao<T> dao = DbEngine.getInstance().findDao(tableName);
T bean = dao.createBean();
ModelTable table = ModelTableCache.getInstance().getByName(tableName);
ModelField field = table.findFieldByType(SwEnum.FieldType.CREATE_USER.value);
if (field != null) bean.put(field.getName(), us.getUserId());
field = table.findFieldByType(SwEnum.FieldType.UPDATE_USER.value);
if (field != null) bean.put(field.getName(), us.getUserId());
return bean;
}

@Override
protected long readId() {
public R save() {
ModelTable table = ModelTableCache.getInstance().getByName(tableName);
return params.readLong(table.getIdField());
}
long id = params.readLong(table.getIdField());
boolean isNew = params.readBool(DefaultEntity.statusKey) || id <= 0L;
final EntityDao<T> dao = DbEngine.getInstance().findDao(tableName);
if (isNew) {
bean = dao.createBean(us.getUserId());
} else {
bean = dao.queryEntity(id);
}
readFromPage();
if (bean.getEntityId() <= 0L) bean.setEntityId(DbEngine.getInstance().nextId());
checkValid();
DbEngine.getInstance().doTrans(new AbsDbWorker() {
@Override
public void work(){
saveDb();
}

@Override
protected void setNewId() {
bean.setEntityId(DbEngine.getInstance().nextId());
}
@Override
public void doAfterDbCommit(){
saveSuccess();
}

@Override
protected T loadComp(long id) {
return new DefaultProvider<T>(tableName).getBean(id);
@Override
public void doAfterDbRollback(){
saveFailed();
}
});
bean.removeStatus();
return R.success(bean);
}

@Override
protected void readFromPage() {
bean.readFromMap(params);
bean.setIsNew(isNew);
}

@Override
protected void checkValid() {
ModelTable table = ModelTableCache.getInstance().getByName(tableName);
for (ModelField field : table.getFields()) {
@@ -85,10 +89,9 @@ public class DefaultSaveHandler<T extends DefaultEntity> extends AbstractSaveHan
}
}

@Override
protected void saveDb() {
EntityDao<T> dao = DbEngine.getInstance().findDao(tableName);
if (isNew) {
if (bean.isNew()) {
insertBean(dao);
} else {
ModelTable table = ModelTableCache.getInstance().getByName(tableName);
@@ -113,9 +116,7 @@ public class DefaultSaveHandler<T extends DefaultEntity> extends AbstractSaveHan
}


@Override
protected void saveSuccess() {
super.saveSuccess();
ModelTable table = ModelTableCache.getInstance().getByName(tableName);
if (table.isNeedCache()) {
AbstractCache<T> cache = CacheManager.getIntance().getCache(tableName);
@@ -130,9 +131,7 @@ public class DefaultSaveHandler<T extends DefaultEntity> extends AbstractSaveHan
}
}

@Override
protected void saveFailed() {
super.saveFailed();
ModelTable table = ModelTableCache.getInstance().getByName(tableName);
if (table.isNeedCache()) {
AbstractCache<T> cache = CacheManager.getIntance().getCache(tableName);
@@ -148,11 +147,12 @@ public class DefaultSaveHandler<T extends DefaultEntity> extends AbstractSaveHan
long id = params.readLong("id");
long parentId = params.readLong("parent_id");

final EntityDao<T> dao = DbEngine.getInstance().findDao(tableName);
AbstractCache<T> cache = CacheManager.getIntance().getCache(tableName);
if (table.isNeedCache()) {
bean = cache.get(id);
} else {
bean = loadComp(id);
bean = dao.queryEntity(id);
}
TreeHelper.getTreeHelper(tableName).checkParent(bean);
//不考虑没有级次码等情况,这个在表设计时校验
@@ -162,7 +162,6 @@ public class DefaultSaveHandler<T extends DefaultEntity> extends AbstractSaveHan
DbEngine.getInstance().doTrans(new AbsDbWorker() {
@Override
public void work() {
EntityDao dao = DbEngine.getInstance().findDao(tableName);
listTreeBean = TreeHelper.getTreeHelper(tableName).resetTreeLevel(bean);
dao.updateEntity(bean, fieldParentId.getName());
}


+ 2
- 2
smtweb-framework/core/src/main/java/cc/smtweb/framework/core/mvc/service/IWorker.java Целия файл

@@ -6,6 +6,6 @@ import cc.smtweb.framework.core.common.R;
* Created by Akmm at 2022/3/2 19:01
* 所有handler的接口
*/
public interface IWorker {
R doWork(AbstractHandler handler);
public interface IWorker<T extends AbstractHandler> {
R doWork(T handler);
}

Зареждане…
Отказ
Запис