From c309ee4276ea3e3f930c496769054fe1c7479a36 Mon Sep 17 00:00:00 2001 From: yaoq Date: Fri, 29 Jul 2022 10:51:10 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=A8=E6=88=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bpm/web/engine/dynPage/DynPageDelHandler.java | 8 +-- .../system/bpm/web/sys/user/user/UserHandler.java | 70 +++++++++++++++++----- .../bpm/web/sys/user/user/UserPartyCache.java | 25 ++++++-- .../system/bpm/web/sys/user/user/UserRole.java | 46 ++++++++++++++ .../bpm/web/sys/user/user/UserRoleCache.java | 67 +++++++++++++++++++++ .../smtweb/framework/core/cache/AbstractCache.java | 18 +++++- .../framework/core/cache/AbstractEntityCache.java | 24 ++++++-- .../cc/smtweb/framework/core/db/EntityDao.java | 14 +++-- 8 files changed, 237 insertions(+), 35 deletions(-) create mode 100644 smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/user/UserRole.java create mode 100644 smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/user/UserRoleCache.java diff --git a/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/dynPage/DynPageDelHandler.java b/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/dynPage/DynPageDelHandler.java index e46d2b3..d8b37e1 100644 --- a/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/dynPage/DynPageDelHandler.java +++ b/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/engine/dynPage/DynPageDelHandler.java @@ -46,7 +46,7 @@ public class DynPageDelHandler extends AbstractDynPageHandler { if (table == null) throw new BizException("没有找到指定的的表定义:" + pageDataSet.name + "!"); EntityDao dao = DbEngine.getInstance().findDao(table.getName()); dao.deleteEntity(id); - localDel(id); + localDel(id, table); } @Override @@ -56,17 +56,17 @@ public class DynPageDelHandler extends AbstractDynPageHandler { AbstractCache cache = CacheManager.getIntance().getCache(table.getName()); cache.remove(id); } - localDelSuccess(id); + localDelSuccess(id, table); } }); return R.success(); } - protected void localDel(long id) { + protected void localDel(long id, ModelTable table) { } - protected void localDelSuccess(long id) { + protected void localDelSuccess(long id, ModelTable table) { } diff --git a/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/user/UserHandler.java b/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/user/UserHandler.java index e976ce1..6ab7643 100644 --- a/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/user/UserHandler.java +++ b/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/user/UserHandler.java @@ -3,12 +3,16 @@ package cc.smtweb.system.bpm.web.sys.user.user; import cc.smtweb.framework.core.common.SwMap; import cc.smtweb.framework.core.db.DbEngine; import cc.smtweb.framework.core.db.impl.DefaultEntity; +import cc.smtweb.framework.core.db.vo.ModelTable; +import cc.smtweb.framework.core.util.PubUtil; import cc.smtweb.system.bpm.web.design.form.define.PageDataset; import cc.smtweb.system.bpm.web.engine.dynPage.DynPageDelHandler; import cc.smtweb.system.bpm.web.engine.dynPage.DynPageListHandler; import cc.smtweb.system.bpm.web.engine.dynPage.DynPageLoadHandler; import cc.smtweb.system.bpm.web.engine.dynPage.DynPageSaveHandler; +import java.util.ArrayList; +import java.util.List; import java.util.Set; /** @@ -19,12 +23,25 @@ public class UserHandler { static class UserSaveHandler extends DynPageSaveHandler { private UserStatu userStatu; + private List roleList; @Override protected DefaultEntity readBeanFromPage(PageDataset pageDataSet, SwMap data) { if (pageDataSet.name.equals("userPartyCard")) { - String userRoles = data.readString("sup_roles"); - return readBeanFromPage(pageDataSet, data); + roleList = new ArrayList<>(); + Set userRoles = data.readLongSet("sup_roles"); + DefaultEntity bean = super.readBeanFromPage(pageDataSet, data); + if (PubUtil.isEmpty(userRoles)) { + return bean; + } + userRoles.forEach(k -> { + UserRole userRole = new UserRole(); + userRole.init(); + userRole.setEntityId(DbEngine.getInstance().nextId()); + userRole.setSupId(bean.getEntityId()); + userRole.setRoleId(k); + roleList.add(userRole); + }); } return super.readBeanFromPage(pageDataSet, data); } @@ -32,13 +49,22 @@ public class UserHandler { @Override protected void saveBean(DefaultEntity bean) { super.saveBean(bean); - userStatu = UserStatuCache.getInstance().get(bean.getEntityId()); - if (userStatu == null || userStatu.isEmpty()) { - userStatu = new UserStatu(); - userStatu.init(); - userStatu.setEntityId(bean.getEntityId()); - DbEngine.getInstance().findDao(UserStatu.ENTITY_NAME).insertEntity(userStatu); - UserStatuCache.getInstance().put(userStatu); + if (bean instanceof User) { + userStatu = UserStatuCache.getInstance().get(bean.getEntityId()); + if (userStatu == null || userStatu.isEmpty()) { + userStatu = new UserStatu(); + userStatu.init(); + userStatu.setEntityId(bean.getEntityId()); + DbEngine.getInstance().findDao(UserStatu.ENTITY_NAME).insertEntity(userStatu); + UserStatuCache.getInstance().put(userStatu); + } + } + if (bean instanceof UserParty) { + Set ur = UserRoleCache.getInstance().getIdByUser(((UserParty) bean).getUserId()); + DbEngine.getInstance().findDao(UserRole.ENTITY_NAME).deleteEntity(ur); + DbEngine.getInstance().findDao(UserRole.ENTITY_NAME).batchInsertEntity(roleList); + UserRoleCache.getInstance().removeList(ur); + UserRoleCache.getInstance().putList(roleList); } } } @@ -46,14 +72,30 @@ public class UserHandler { static class UserDelHandler extends DynPageDelHandler { @Override - protected void localDel(long id) { - super.localDel(id); - DbEngine.getInstance().findDao(UserStatu.ENTITY_NAME).deleteEntity(id); + protected void localDel(long id, ModelTable table) { + super.localDel(id, table); + if (table.getName().equals(User.ENTITY_NAME)) { + DbEngine.getInstance().findDao(UserStatu.ENTITY_NAME).deleteEntity(id); + DbEngine.getInstance().findDao(UserParty.ENTITY_NAME).deleteEntity(UserPartyCache.getInstance().getIdByUser(id)); + DbEngine.getInstance().findDao(UserRole.ENTITY_NAME).deleteEntity(UserRoleCache.getInstance().getIdByUser(id)); + } + if (table.getName().equals(UserParty.ENTITY_NAME)) { + DbEngine.getInstance().findDao(UserParty.ENTITY_NAME).deleteEntity(id); + DbEngine.getInstance().findDao(UserRole.ENTITY_NAME).deleteEntity(UserRoleCache.getInstance().getByS(id)); + } } @Override - protected void localDelSuccess(long id) { - UserStatuCache.getInstance().remove(id); + protected void localDelSuccess(long id, ModelTable table) { + if (table.getName().equals(User.ENTITY_NAME)) { + UserStatuCache.getInstance().remove(id); + UserPartyCache.getInstance().removeList(UserPartyCache.getInstance().getIdByUser(id)); + UserRoleCache.getInstance().removeList(UserRoleCache.getInstance().getIdByUser(id)); + } + if (table.getName().equals(UserParty.ENTITY_NAME)) { + UserPartyCache.getInstance().remove(id); + UserRoleCache.getInstance().removeList(UserRoleCache.getInstance().getByS(id)); + } } } diff --git a/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/user/UserPartyCache.java b/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/user/UserPartyCache.java index 90e296d..e68dcff 100644 --- a/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/user/UserPartyCache.java +++ b/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/user/UserPartyCache.java @@ -3,24 +3,41 @@ package cc.smtweb.system.bpm.web.sys.user.user; import cc.smtweb.framework.core.annotation.SwCache; import cc.smtweb.framework.core.cache.AbstractEntityCache; import cc.smtweb.framework.core.cache.CacheManager; +import cc.smtweb.framework.core.util.PubUtil; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; +import java.util.HashSet; import java.util.Set; /** - * Created by 1 at 2022-07-28 20:05:08 + * Created by 1 at 2022-07-29 09:25:43 * 实体【[用户机构关系](SYS_USER_PARTY)】的缓存类 */ @SwCache(ident = "SYS_USER_PARTY", title = "用户机构关系") public class UserPartyCache extends AbstractEntityCache { + //缓存key:按用户缓存 + public final static String mk_u = "u"; public static UserPartyCache getInstance() { return CacheManager.getIntance().getCache(UserPartyCache.class); } public UserPartyCache() { + //缓存key:按用户缓存 + regList(mk_u, "sup_user_id"); } + //缓存key:按用户缓存 + public final Set getByU(String key) { + return getListByKey(mk_u, key); + } + + public final Set getIdByUser(Long key) { + Set ids = new HashSet<>(); + Set set = getByU(String.valueOf(key)); + if (PubUtil.isEmpty(set)) return ids; + set.forEach(bean -> { + ids.add(bean.getEntityId()); + }); + return ids; + } } diff --git a/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/user/UserRole.java b/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/user/UserRole.java new file mode 100644 index 0000000..08c605d --- /dev/null +++ b/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/user/UserRole.java @@ -0,0 +1,46 @@ +package cc.smtweb.system.bpm.web.sys.user.user; + +import cc.smtweb.framework.core.annotation.SwTable; +import cc.smtweb.framework.core.common.SwMap; +import cc.smtweb.framework.core.db.impl.DefaultEntity; + +/** + * Created by 1 at 2022-07-29 09:25:43 + * 实体【[用户角色关系](SYS_USER_ROLE)】的Entity类 + */ +@SwTable("SYS_USER_ROLE") +public class UserRole extends DefaultEntity { + public static final String ENTITY_NAME = "SYS_USER_ROLE"; + + public UserRole() { + super(ENTITY_NAME); + } + + /** 主键 */ + public long getId() { + return getLong("sur_id"); + } + + /** 主键 */ + public void setId(long sur_id) { + put("sur_id", sur_id); + } + /** 机构关系 */ + public long getSupId() { + return getLong("sur_sup_id"); + } + + /** 机构关系 */ + public void setSupId(long sur_sup_id) { + put("sur_sup_id", sur_sup_id); + } + /** 角色 */ + public long getRoleId() { + return getLong("sur_role_id"); + } + + /** 角色 */ + public void setRoleId(long sur_role_id) { + put("sur_role_id", sur_role_id); + } +} diff --git a/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/user/UserRoleCache.java b/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/user/UserRoleCache.java new file mode 100644 index 0000000..acef6f1 --- /dev/null +++ b/smtweb-framework/bpm/src/main/java/cc/smtweb/system/bpm/web/sys/user/user/UserRoleCache.java @@ -0,0 +1,67 @@ +package cc.smtweb.system.bpm.web.sys.user.user; + +import cc.smtweb.framework.core.annotation.SwCache; +import cc.smtweb.framework.core.cache.AbstractEntityCache; +import cc.smtweb.framework.core.cache.CacheManager; +import cc.smtweb.framework.core.util.PubUtil; + +import java.util.HashSet; +import java.util.Set; + +/** + * Created by 1 at 2022-07-29 09:25:43 + * 实体【[用户角色关系](SYS_USER_ROLE)】的缓存类 + */ +@SwCache(ident = "SYS_USER_ROLE", title = "用户角色关系") +public class UserRoleCache extends AbstractEntityCache { + //缓存key:按机构关系缓存 + public final static String mk_s = "s"; + + public static UserRoleCache getInstance() { + return CacheManager.getIntance().getCache(UserRoleCache.class); + } + + public UserRoleCache() { + //缓存key:按机构关系缓存 + regList(mk_s, "sur_sup_id"); + } + + //缓存key:按机构关系缓存 + public final Set getByS(String key) { + return getListByKey(mk_s, key); + } + + public final Set getByS(Long key) { + Set ids = new HashSet<>(); + Set set = getByS(String.valueOf(key)); + if (PubUtil.isEmpty(set)) return ids; + set.forEach(bean -> { + ids.add(bean.getEntityId()); + }); + return ids; + } + + public final Set getIdByUser(Long key) { + return getIdByUser(String.valueOf(key)); + } + + public final Set getIdByUser(String key) { + Set roleSet = new HashSet<>(); + Set upSet = UserPartyCache.getInstance().getListIdByKey(UserPartyCache.mk_u, key); + if (PubUtil.isEmpty(upSet)) return roleSet; + upSet.forEach(k -> { + Set urSet = getListIdByKey(mk_s, String.valueOf(k)); + if (PubUtil.isEmpty(urSet)) return; + roleSet.addAll(upSet); + }); + return roleSet; + } + + public final Set getSetByUser(String key) { + Set set = new HashSet<>(); + getIdByUser(key).forEach(k -> { + set.add(get(k)); + }); + return set; + } +} diff --git a/smtweb-framework/core/src/main/java/cc/smtweb/framework/core/cache/AbstractCache.java b/smtweb-framework/core/src/main/java/cc/smtweb/framework/core/cache/AbstractCache.java index 8ba38ba..973dd57 100644 --- a/smtweb-framework/core/src/main/java/cc/smtweb/framework/core/cache/AbstractCache.java +++ b/smtweb-framework/core/src/main/java/cc/smtweb/framework/core/cache/AbstractCache.java @@ -5,6 +5,7 @@ import cc.smtweb.framework.core.cache.redis.RedisBroadcastEvent; import cc.smtweb.framework.core.cache.redis.RedisManager; import cc.smtweb.framework.core.common.SwConsts; import cc.smtweb.framework.core.util.CommUtil; +import cc.smtweb.framework.core.util.PubUtil; import com.github.benmanes.caffeine.cache.Caffeine; import com.github.benmanes.caffeine.cache.LoadingCache; import com.github.benmanes.caffeine.cache.Scheduler; @@ -260,7 +261,7 @@ public abstract class AbstractCache implements ISwCache< for (Map.Entry> entry : mapListRegEx.entrySet()) { String[] keys = entry.getValue().getKey(oldbean); - for (String k: keys) { + for (String k : keys) { doRemoveList(entry.getKey(), k, bean); } } @@ -287,7 +288,7 @@ public abstract class AbstractCache implements ISwCache< for (Map.Entry> entry : mapListRegEx.entrySet()) { String[] keys = entry.getValue().getKey(value); - for (String k: keys) { + for (String k : keys) { doUpdateList(entry.getKey(), k, value); } } @@ -345,6 +346,12 @@ public abstract class AbstractCache implements ISwCache< } } + public final void putList(Collection list) { + list.forEach(bean -> { + put(bean); + }); + } + /** * 将对象重置为修改前的值,用于取出修改后,事务提交失败 * @@ -445,6 +452,13 @@ public abstract class AbstractCache implements ISwCache< publishRemove(key); } + public void removeList(Collection key) { + if (PubUtil.isEmpty(key)) return; + key.forEach(k -> { + remove(k); + }); + } + public void remove(long key) { remove(String.valueOf(key)); } diff --git a/smtweb-framework/core/src/main/java/cc/smtweb/framework/core/cache/AbstractEntityCache.java b/smtweb-framework/core/src/main/java/cc/smtweb/framework/core/cache/AbstractEntityCache.java index 744b0a1..aa464f4 100644 --- a/smtweb-framework/core/src/main/java/cc/smtweb/framework/core/cache/AbstractEntityCache.java +++ b/smtweb-framework/core/src/main/java/cc/smtweb/framework/core/cache/AbstractEntityCache.java @@ -4,8 +4,11 @@ import cc.smtweb.framework.core.common.SwConsts; import cc.smtweb.framework.core.db.DbEngine; import cc.smtweb.framework.core.db.EntityDao; import cc.smtweb.framework.core.db.impl.DefaultEntity; +import cc.smtweb.framework.core.util.PubUtil; +import java.util.HashSet; import java.util.List; +import java.util.Set; /** * Created by Akmm at 2022/6/16 15:53 @@ -18,11 +21,11 @@ public class AbstractEntityCache extends AbstractCache< private String getCacheKey(T bean, String fields) { String[] fs = fields.split(","); - String ret = ""; - for (String f: fs) { - ret += SwConsts.SPLIT_CHAR + bean.getStr(f); - } - return ret.substring(SwConsts.SPLIT_CHAR.length()); + String ret = ""; + for (String f : fs) { + ret += SwConsts.SPLIT_CHAR + bean.getStr(f); + } + return ret.substring(SwConsts.SPLIT_CHAR.length()); } /** @@ -51,4 +54,15 @@ public class AbstractEntityCache extends AbstractCache< EntityDao dao = DbEngine.getInstance().findDao(pTypeClass); return dao.query(); } + + + public final Set getListIdByKey(String rk, String key) { + Set idSet = new HashSet<>(); + Set beanSet = getListByKey(rk, key); + if (PubUtil.isEmpty(beanSet)) return idSet; + beanSet.forEach(bean -> { + idSet.add(bean.getEntityId()); + }); + return idSet; + } } diff --git a/smtweb-framework/core/src/main/java/cc/smtweb/framework/core/db/EntityDao.java b/smtweb-framework/core/src/main/java/cc/smtweb/framework/core/db/EntityDao.java index 8318c2c..59381ff 100644 --- a/smtweb-framework/core/src/main/java/cc/smtweb/framework/core/db/EntityDao.java +++ b/smtweb-framework/core/src/main/java/cc/smtweb/framework/core/db/EntityDao.java @@ -1,14 +1,14 @@ package cc.smtweb.framework.core.db; import cc.smtweb.framework.core.common.SwEnum; -import cc.smtweb.framework.core.exception.BizException; -import cc.smtweb.framework.core.exception.SwException; import cc.smtweb.framework.core.db.dao.AbstractEntityDao; import cc.smtweb.framework.core.db.dao.EntityColumn; import cc.smtweb.framework.core.db.impl.DefaultEntity; import cc.smtweb.framework.core.db.jdbc.JdbcEngine; import cc.smtweb.framework.core.db.vo.ModelField; +import cc.smtweb.framework.core.exception.BizException; import cc.smtweb.framework.core.util.CommUtil; +import cc.smtweb.framework.core.util.PubUtil; import lombok.Getter; import org.apache.commons.lang3.StringUtils; @@ -68,11 +68,11 @@ public class EntityDao extends AbstractEntityDao { return updateEntity(entity, null, null); } Set excludeFields = new HashSet<>(exfields.length); - for (String f: exfields) { + for (String f : exfields) { excludeFields.add(f.toLowerCase()); } StringBuilder fields = new StringBuilder(512); - for (ModelField field: modelTable.getFields()) { + for (ModelField field : modelTable.getFields()) { if (!excludeFields.contains(field.getName())) { fields.append(",").append(field.getName()); } @@ -240,7 +240,8 @@ public class EntityDao extends AbstractEntityDao { return jdbcEngine.update(sb.toString(), params); } - public int deleteEntity(List ids) { + public int deleteEntity(Collection ids) { + if (PubUtil.isEmpty(ids)) return 0; return deleteEntity(" where " + modelTable.getIdField() + " in (" + CommUtil.getSqlInIds(ids) + ")"); } @@ -252,7 +253,7 @@ public class EntityDao extends AbstractEntityDao { private void setTableName(List list) { if (!list.isEmpty() && list.get(0) instanceof DefaultEntity) { - for (T bean: list) { + for (T bean : list) { ((DefaultEntity) bean).setTableName(this.tableName); } } @@ -347,6 +348,7 @@ public class EntityDao extends AbstractEntityDao { /** * 检查表字段是否违反唯一索引 + * * @param bean * @param fields */