From 10f2cb4cd26416ff370643738ec70cb79df33d6b Mon Sep 17 00:00:00 2001 From: zhenggm Date: Tue, 16 Aug 2022 16:30:39 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=EF=BC=9ALC=5FSINGLE=E6=A8=A1?= =?UTF-8?q?=E5=9E=8Bengine?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/listcard/single/LCSingleDelHandler.java | 84 ++++++++ .../model/listcard/single/LCSingleHelper.java | 33 ++++ .../model/listcard/single/LCSingleLoadHandler.java | 92 +++++++++ .../model/listcard/single/LCSingleSaveHandler.java | 212 +++++++++++++++++++++ .../model/listcard/single/LCSingleService.java | 56 ++++++ .../bpm/src/main/resources/config/application.yaml | 22 ++- smtweb-framework/pom.xml | 1 - 7 files changed, 489 insertions(+), 11 deletions(-) create mode 100644 smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/listcard/single/LCSingleDelHandler.java create mode 100644 smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/listcard/single/LCSingleHelper.java create mode 100644 smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/listcard/single/LCSingleLoadHandler.java create mode 100644 smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/listcard/single/LCSingleSaveHandler.java diff --git a/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/listcard/single/LCSingleDelHandler.java b/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/listcard/single/LCSingleDelHandler.java new file mode 100644 index 0000000..d1f976c --- /dev/null +++ b/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/listcard/single/LCSingleDelHandler.java @@ -0,0 +1,84 @@ +package cc.smtweb.system.bpm.web.engine.model.listcard.single; + +import cc.smtweb.framework.core.cache.AbstractCache; +import cc.smtweb.framework.core.cache.CacheManager; +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; +import cc.smtweb.framework.core.db.EntityHelper; +import cc.smtweb.framework.core.db.cache.ModelTableCache; +import cc.smtweb.framework.core.db.impl.DefaultEntity; +import cc.smtweb.framework.core.db.jdbc.AbsDbWorker; +import cc.smtweb.framework.core.db.vo.ModelTable; +import cc.smtweb.framework.core.exception.BizException; +import cc.smtweb.system.bpm.web.design.form.define.PageDataset; +import cc.smtweb.system.bpm.web.design.form.define.PageDatasetFilter; +import cc.smtweb.system.bpm.web.engine.dynPage.AbstractDynPageHandler; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Created by Akmm at 2022/4/21 17:53 + * 删除操作 + */ +public class LCSingleDelHandler extends AbstractDynPageHandler { + /** + * 删除指定数据集,入参{pageId, dataset, id} + * + * @return + */ + public R del() { + long id = params.readLong("id"); + if (id == 0L) throw new BizException("没有收到待删除记录Id(" + id + ")!"); + //数据集 + PageDataset pageDataSet = LCSingleHelper.findCardDataset(datasets); + + checkBean(pageDataSet, id); + + DbEngine.getInstance().doTrans(new AbsDbWorker() { + @Override + public void work() { + ModelTable table = ModelTableCache.getInstance().get(pageDataSet.masterTable); + if (table == null) throw new BizException("没有找到指定的的表定义:" + pageDataSet.name + "!"); + EntityDao dao = DbEngine.getInstance().findDao(table.getName()); + dao.deleteEntity(id); + localDel(id, table); + } + + @Override + public void doAfterDbCommit() { + ModelTable table = ModelTableCache.getInstance().get(pageDataSet.masterTable); + if (table.isNeedCache()) { + AbstractCache cache = CacheManager.getIntance().getCache(table.getName()); + cache.remove(id); + } + localDelSuccess(id, table); + } + }); + return R.success(); + } + + protected void localDel(long id, ModelTable table) { + + } + + protected void localDelSuccess(long id, ModelTable table) { + + } + + /** + * 删除校验 + * + * @param pageDataSet + * @param id + */ + protected void checkBean(PageDataset pageDataSet, long id) { + //校验外键引用关系 + EntityHelper.checkExists(pageDataSet.masterTable, id); + } +} diff --git a/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/listcard/single/LCSingleHelper.java b/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/listcard/single/LCSingleHelper.java new file mode 100644 index 0000000..32fb1ec --- /dev/null +++ b/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/listcard/single/LCSingleHelper.java @@ -0,0 +1,33 @@ +package cc.smtweb.system.bpm.web.engine.model.listcard.single; + +import cc.smtweb.framework.core.common.SwEnum; +import cc.smtweb.framework.core.exception.SwException; +import cc.smtweb.system.bpm.web.design.form.define.PageDataset; +import cc.smtweb.system.bpm.web.design.form.define.PageDatasets; + +/** + * Created by Akmm at 2022-08-16 16:07 + * 常量定义 + */ +public interface LCSingleHelper { + String DATASET_NAME_LIST = "list"; + String DATASET_NAME_CARD = "card"; + + static PageDataset findCardDataset(PageDatasets datasets) { + PageDataset cardDataset = datasets.findByName(DATASET_NAME_CARD); + if (cardDataset == null) throw new SwException("没有找到卡片数据集!"); + if (!SwEnum.DatasetType.FORM.value.equals(cardDataset.type)) {//单表 + throw new SwException("卡片数据集定义错误!"); + } + return cardDataset; + } + + static PageDataset findListDataset(PageDatasets datasets) { + PageDataset cardDataset = datasets.findByName(DATASET_NAME_LIST); + if (cardDataset == null) throw new SwException("没有找到列表数据集!"); + if (!SwEnum.DatasetType.LIST.value.equals(cardDataset.type)) {//列表 + throw new SwException("列表数据集定义错误!"); + } + return cardDataset; + } +} diff --git a/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/listcard/single/LCSingleLoadHandler.java b/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/listcard/single/LCSingleLoadHandler.java new file mode 100644 index 0000000..5021fcc --- /dev/null +++ b/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/listcard/single/LCSingleLoadHandler.java @@ -0,0 +1,92 @@ +package cc.smtweb.system.bpm.web.engine.model.listcard.single; + +import cc.smtweb.framework.core.common.R; +import cc.smtweb.framework.core.common.SwMap; +import cc.smtweb.system.bpm.web.design.form.define.PageDataset; +import cc.smtweb.system.bpm.web.engine.dynPage.AbstractDynPageHandler; +import cc.smtweb.system.bpm.web.engine.dynPage.DynPageHelper; +import cc.smtweb.system.bpm.web.engine.dynPage.DynPageListHandler; +import cc.smtweb.system.bpm.web.engine.dynPage.DynRetBean; + +/** + * Created by Akmm at 2022-08-16 15:43 + */ +public class LCSingleLoadHandler extends AbstractDynPageHandler { + + //新增卡片操作,初始化定义的数据集 + public R add() { + //返回的数据,以dataset.name为key,查出的结果(bean或list)为value + SwMap mapRet = new SwMap(); + PageDataset cardDataset = LCSingleHelper.findCardDataset(datasets); + SwMap data; + //懒加载,给个空对象 + if (cardDataset.lazy) { + data = new SwMap(); + } else { + data = DynPageHelper.createBean(cardDataset); + } + afterAddBean(cardDataset, data); + mapRet.put(cardDataset.name, DynRetBean.createBean(data)); + + return R.success(mapRet); + } + + //新增初始化 - bean + protected void afterAddBean(PageDataset dataset, SwMap bean) { + } + + //加载之后 + protected void afterLoadBean(PageDataset dataset, SwMap bean) { + } + + public R load() { + //过滤条件 + SwMap filter = params.readMap("filter"); + //对应的数据集定义 + PageDataset pageDataSet = LCSingleHelper.findCardDataset(datasets); + + DynRetBean bean = null; + + SwMap data = provider.loadData(filter, pageDataSet); + afterLoadBean(pageDataSet, data); + bean = DynRetBean.createBean(data); + + + return R.success(bean); + } + + protected DynPageListHandler getListWorker(SwMap filter, PageDataset pageDataSet) { + DynPageListHandler listHandler = new DynPageListHandler(form.getId(), filter, pageDataSet); + listHandler.init(params, us); + return listHandler; + } + + /** + * 列表数据 + * @return + */ + public R list() { + //过滤条件 + SwMap filter = params.readMap("filter"); + //对应的数据集定义 + PageDataset pageDataSet = LCSingleHelper.findListDataset(datasets); + + DynRetBean bean = DynRetBean.createList(getListWorker(filter, pageDataSet).buildListData()); + + return R.success(bean); + } + + /** + * 计算分页数据 + * + * @return + */ + public R getTotal() { + //数据集 + PageDataset pageDataSet = LCSingleHelper.findListDataset(datasets); + //过滤条件 + SwMap filter = params.readMap("filter"); + + return getListWorker(filter, pageDataSet).getTotal(); + } +} diff --git a/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/listcard/single/LCSingleSaveHandler.java b/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/listcard/single/LCSingleSaveHandler.java new file mode 100644 index 0000000..5d8063f --- /dev/null +++ b/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/listcard/single/LCSingleSaveHandler.java @@ -0,0 +1,212 @@ +package cc.smtweb.system.bpm.web.engine.model.listcard.single; + +import cc.smtweb.framework.core.cache.AbstractCache; +import cc.smtweb.framework.core.cache.CacheManager; +import cc.smtweb.framework.core.common.R; +import cc.smtweb.framework.core.common.SwEnum; +import cc.smtweb.framework.core.common.SwMap; +import cc.smtweb.framework.core.db.DbEngine; +import cc.smtweb.framework.core.db.EntityDao; +import cc.smtweb.framework.core.db.cache.ModelTableCache; +import cc.smtweb.framework.core.db.impl.DefaultEntity; +import cc.smtweb.framework.core.db.jdbc.AbsDbWorker; +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.TreeHelper; +import cc.smtweb.framework.core.util.StringUtil; +import cc.smtweb.system.bpm.web.design.form.define.PageDataset; +import cc.smtweb.system.bpm.web.design.form.define.PageDatasetFilter; +import cc.smtweb.system.bpm.web.engine.dynPage.AbstractDynPageHandler; +import cc.smtweb.system.bpm.web.engine.dynPage.DynRetBean; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * Created by Akmm at 2022/4/21 17:53 + * 保存操作 + * 入参:{pageId, data:} + */ +public class LCSingleSaveHandler extends AbstractDynPageHandler { + private Map> mapTreeBean = new HashMap<>(); + + protected void setNewId(DefaultEntity bean) { + bean.setEntityId(DbEngine.getInstance().nextId()); + } + + /** + * 保存指定数据集操作,入参:{pageId,dataset:"", data:{form:{},list: {total:0,rows:[]}}, filter:{}} + */ + public R save() { + //数据集 + String dbName = params.readString("dataset"); + SwMap filter = params.readMap("filter"); + //待保存数据 + SwMap data = params.readMap("data"); + if (data == null) throw new BizException("没有收到待保存的的数据:" + dbName + "!"); + //对应的数据集定义 + PageDataset pageDataSet = LCSingleHelper.findCardDataset(datasets); + //读取待保存的bean + DefaultEntity bean = readBeanFromPage(pageDataSet, data.readMap("form")); + if (filter != null && bean.isNew()) {//有过滤条件,将关联的值设上 + setLinkValue(pageDataSet, bean, f -> filter.get(f.name)); + } + checkBean(bean); + + DbEngine.getInstance().doTrans(new AbsDbWorker() { + @Override + public void work() { + saveBean(bean); + } + + @Override + public void doAfterDbCommit() { + afterCommit(bean); + } + + @Override + public void doAfterDbRollback() { + afterRollback(bean); + } + }); + return R.success(DynRetBean.createBean(bean.getData())); + } + + /** + * 从页面获取待保存的bean + * + * @param pageDataSet + * @param data + * @return + */ + 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()); + + EntityDao dao = DbEngine.getInstance().findDao(table.getName()); + DefaultEntity bean; + if (id <= 0L) { + bean = dao.createBean(); + bean.setIsNew(true); + //暂时不考虑list保存的情况 + bean.getData().putAll(data); + setNewId(bean); + } else { + bean = dao.queryEntity(id); + if (bean == null) { + throw new BizException("没有找到待保存的记录:" + table.getName() + "." + id); + } + //暂时不考虑list保存的情况 + bean.getData().putAll(data); + bean.setIsNew(false); + } + + return bean; + } + + /** + * 保存校验 + * + * @param bean + */ + protected void checkBean(DefaultEntity bean) { + ModelTable table = ModelTableCache.getInstance().getByName(bean.getTableName()); + for (ModelField field : table.getFields()) { + String value = bean.getStr(field.getName()); + //非空校验 + if (field.isNotNull() && StringUtils.isEmpty(value)) { + throw new BizException("字段不允许为空:" + field.getTitle()); + } + + //长度校验 + if (StringUtils.isNotEmpty(value)) { + int len = SwEnum.DataType.instance.getByValue(field.getDataType()).dataLength; + if (len > 0 && StringUtil.getStrLenB(value) > len) { + throw new BizException("字段值超长:" + field.getTitle()); + } + } + } + //唯一键校验 + EntityDao dao = DbEngine.getInstance().findDao(bean.getTableName()); + for (ModelIndex mi : table.getIndexes()) { + if (mi.isUnique()) { + dao.checkUnique(bean, mi.getFields().split(",")); + } + } + } + + protected void saveBean(DefaultEntity bean) { + final String tableName = bean.getTableName(); + EntityDao dao = DbEngine.getInstance().findDao(tableName); + if (bean.isNew()) { + dao.insertEntity(bean); + } else { + ModelTable table = ModelTableCache.getInstance().getByName(tableName); + ModelField field = table.findFieldByType(SwEnum.FieldType.UPDATE_USER.value); + if (field != null) bean.put(field.getName(), us.getUserId()); + + dao.updateEntity(bean); + if (table.getType() == SwEnum.TableType.TYPE_TREE.value) { + List listTreeBean = TreeHelper.getTreeHelper(tableName).resetTreeLevel(bean); + mapTreeBean.put(tableName, listTreeBean); + } + } + } + + protected void afterCommit(DefaultEntity bean) { + final String tableName = bean.getTableName(); + ModelTable table = ModelTableCache.getInstance().getByName(tableName); + if (table.isNeedCache()) { + AbstractCache cache = CacheManager.getIntance().getCache(tableName); + List listTreeBean = mapTreeBean.get(tableName); + //树型表,父亲改变了,要多处理下缓存;还有个东东:级次码 + if (listTreeBean != null && !listTreeBean.isEmpty()) { + for (DefaultEntity b : listTreeBean) { + cache.put(b); + } + } else { + cache.put(bean); + } + } + } + + protected void afterRollback(DefaultEntity bean) { + final String tableName = bean.getTableName(); + ModelTable table = ModelTableCache.getInstance().getByName(tableName); + if (table.isNeedCache()) { + AbstractCache cache = CacheManager.getIntance().getCache(tableName); + cache.reset(bean); + } + } + + //将关联的值设上 + protected void setLinkValue(PageDataset pageDataSet, DefaultEntity bean, IGetValue iGetValue) { + ModelTable table = ModelTableCache.getInstance().getByName(bean.getTableName()); + for (PageDatasetFilter f : pageDataSet.filters) { + String v = bean.getStr(f.field); + //有值,就不管 + if (v != null && !v.equals(table.findField(f.field).getDefaultValue())) continue; + + if (SwEnum.FilterType.CONST.value.equals(f.type)) {//常量 + bean.put(f.field, f.value); + } else if (SwEnum.FilterType.PARAM.value.equals(f.type)) {//参数 + bean.put(f.field, f.value); + } else if (SwEnum.FilterType.LINK.value.equals(f.type)) {//参数 + Object value = iGetValue.getValue(f); + if (value != null) { + bean.put(f.field, value); + } + } + } + } + + interface IGetValue { + Object getValue(PageDatasetFilter f); + } +} diff --git a/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/listcard/single/LCSingleService.java b/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/listcard/single/LCSingleService.java index ff9f5f4..c960060 100644 --- a/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/listcard/single/LCSingleService.java +++ b/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/model/listcard/single/LCSingleService.java @@ -1,5 +1,11 @@ package cc.smtweb.system.bpm.web.engine.model.listcard.single; +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.*; +import cc.smtweb.framework.core.session.UserSession; +import cc.smtweb.system.bpm.web.design.form.*; import cc.smtweb.system.bpm.web.engine.dynPage.DynPageService; /** @@ -7,4 +13,54 @@ import cc.smtweb.system.bpm.web.engine.dynPage.DynPageService; * 单页面简单列表卡片服务类 */ public class LCSingleService extends DynPageService { + public final static String TYPE_MODEL_LIST = "modelList"; + public final static String TYPE_MODEL_ADD = "modelAdd"; + public final static String TYPE_MODEL_LOAD = "modelLoad"; + public final static String TYPE_MODEL_SAVE = "modelSave"; + public final static String TYPE_MODEL_DEL = "modelDel"; + + @Override + protected AbstractHandler createHandler(String type) { + switch (type) { + case TYPE_MODEL_LIST: + case TYPE_MODEL_LOAD: + case TYPE_MODEL_ADD: + return new LCSingleLoadHandler(); + case TYPE_MODEL_SAVE: + return new LCSingleSaveHandler(); + case TYPE_MODEL_DEL: + return new LCSingleDelHandler(); + } + return super.createHandler(type); + } + + //保存 + public R modelSave(@SwBody SwMap params, UserSession us) { + return pageHandler(params, us, TYPE_MODEL_SAVE, handler -> ((LCSingleSaveHandler)handler).save()); + } + + //读取 + public R modelLoad(@SwBody SwMap params, UserSession us) { + return pageHandler(params, us, TYPE_LOAD, handler -> ((LCSingleLoadHandler)handler).load()); + } + + //读取 + public R modelAdd(@SwBody SwMap params, UserSession us) { + return pageHandler(params, us, TYPE_LOAD, handler -> ((LCSingleLoadHandler)handler).add()); + } + + //删除 + public R modelDel(@SwBody SwMap params, UserSession us) { + return pageHandler(params, us, TYPE_DEL, handler -> ((LCSingleDelHandler)handler).del()); + } + + //列表数据 + public R modelList(@SwBody SwMap params, UserSession us) { + return pageHandler(params, us, TYPE_LIST, handler -> ((LCSingleLoadHandler)handler).list()); + } + + //列表总记录数及合计栏 + public R modelListTotal(@SwBody SwMap params, UserSession us) { + return pageHandler(params, us, TYPE_LIST, handler -> ((LCSingleLoadHandler)handler).getTotal()); + } } diff --git a/smtweb-framework/bpm/src/main/resources/config/application.yaml b/smtweb-framework/bpm/src/main/resources/config/application.yaml index 00e13f7..44ecf28 100644 --- a/smtweb-framework/bpm/src/main/resources/config/application.yaml +++ b/smtweb-framework/bpm/src/main/resources/config/application.yaml @@ -6,13 +6,13 @@ smtweb: #访问路径,需/结尾 attach-http-path: 'http://bjjt.jujiatech.cn/files/' #此配置原则上可以和local-path一致,可本机路径可ftp附件路径,需/结尾 - attach-path: /jjkj/attach/files/persistent/ + attach-path: /jjkj/attach/ #临时文件路径,需/结尾 - attach-temp-path: /jjkj/attach/files/temp/ + attach-temp-path: /jujia/tomcat_api/webapps/files/tempFile/ #附件上传方式 sftp/ftp/local - attach-type: local + attach-type: sftp #ftp IP地址 - attach-ftp-ip: 127.0.0.1 + attach-ftp-ip: 172.26.60.191 #ftp 端口 attach-ftp-port: 22 #ftp 用户名 @@ -21,7 +21,10 @@ smtweb: attach-ftp-pwd: Bjjt@2021 bpm: debug: true - code-java-path: 'D:\Git\dfpDepository\smtweb2\smtweb-framework' +# 有.idea或pom.xml文件的目录 + code-java-path: 'd:/work/smtweb2/smtweb-framework' +# 读取模式 1-读取pom.xml,要求module名同目录 2-读取.idea/modules.xml + mode: 1 db: type: mysql default: @@ -43,12 +46,11 @@ spring: password: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://139.9.38.43:6032/smt?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false +# url: jdbc:mysql://139.9.38.43:6032/smt?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false + url: jdbc:mysql://127.0.0.1:3306/smt?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false username: root - password: Ncmz@2022_jjkj -# url: jdbc:mysql://127.0.0.1:3306/smt_asp?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false -# username: root -# password: 123456 +# password: Ncmz@2022_jjkj + password: ssqsoft servlet: multipart: max-file-size: 104857600000 diff --git a/smtweb-framework/pom.xml b/smtweb-framework/pom.xml index 99edd0c..38a69dc 100644 --- a/smtweb-framework/pom.xml +++ b/smtweb-framework/pom.xml @@ -27,6 +27,5 @@ core bpm - unit