| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527 |
- package jnpf.base.util.visualUtil;
- import cn.hutool.core.bean.BeanUtil;
- import cn.hutool.core.collection.CollectionUtil;
- import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
- import com.google.common.collect.ImmutableMap;
- import jnpf.base.UserInfo;
- import jnpf.base.entity.*;
- import jnpf.base.model.module.PropertyJsonModel;
- import jnpf.base.model.online.AuthFlieds;
- import jnpf.base.model.online.PerColModels;
- import jnpf.base.model.online.VisualMenuModel;
- import jnpf.base.service.*;
- import jnpf.constant.JnpfConst;
- import jnpf.exception.WorkFlowException;
- import jnpf.util.*;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Component;
- import java.util.*;
- import java.util.stream.Collectors;
- /**
- * 功能发布
- *
- * @author JNPF开发平台组
- * @version V3.4
- * @copyright 引迈信息技术有限公司(https://www.jnpfsoft.com)
- * @date 2022/4/7
- */
- @Component
- public class PubulishUtil {
- @Autowired
- private ModuleService moduleService;
- @Autowired
- private ModuleButtonService moduleButtonService;
- @Autowired
- private ModuleColumnService moduleColumnService;
- @Autowired
- private ModuleFormService moduleFormService;
- @Autowired
- private ModuleDataAuthorizeService moduleDataAuthorizeService;
- @Autowired
- private ModuleDataAuthorizeSchemeService moduleDataAuthorizeSchemeService;
- @Autowired
- private SystemService systemService;
- /**
- * 功能类型
- */
- private final static Integer Type = 3;
- /**
- * pc父级菜单 默认
- */
- private static final String pcCate = "功能示例";
- /**
- * app父级菜单 默认
- */
- private static final String appCate = "移动应用";
- /**
- * pc端分类
- */
- private static final String pcCategory = JnpfConst.WEB;
- /**
- * app端分类
- */
- private static final String appCategory = JnpfConst.APP;
- /**
- * pc父级菜单id 默认
- */
- private String parentId;
- /**
- * app父级菜单id
- */
- private String appParentId;
- /**
- * 图标
- */
- private final static String icon = "icon-ym icon-ym-webForm";
- private final static List<String> symbol = new ArrayList() {{
- add("@userId");
- add("@organizeId");
- }};
- private final static Map<Integer, String> pcAddress = ImmutableMap.of(3, "model", 8, "portal", 10, "report", 11, "form");
- public void publishMenu(VisualMenuModel visualMenuModel) throws WorkFlowException {
- UserInfo userInfo = UserProvider.getUser();
- List<ModuleEntity> moduleList = moduleService.getModuleList(visualMenuModel.getId());
- ModuleEntity moduleEntity = new ModuleEntity();
- PerColModels pcPerCols = visualMenuModel.getPcPerCols() != null ? visualMenuModel.getPcPerCols() : new PerColModels();
- PerColModels appPerCols = visualMenuModel.getAppPerCols() != null ? visualMenuModel.getAppPerCols() : new PerColModels();
- moduleEntity.setCategory(pcCategory);
- moduleEntity.setFullName(visualMenuModel.getFullName());
- moduleEntity.setEnCode(visualMenuModel.getEnCode());
- moduleEntity.setIcon(icon);
- moduleEntity.setType(visualMenuModel.getType());
- moduleEntity.setModuleId(visualMenuModel.getId());
- PropertyJsonModel jsonModel = new PropertyJsonModel();
- jsonModel.setModuleId(visualMenuModel.getId());
- jsonModel.setIconBackgroundColor("");
- jsonModel.setIsTree(0);
- jsonModel.setWebType(visualMenuModel.getWebType());
- moduleEntity.setPropertyJson(JsonUtil.getObjectToString(jsonModel));
- moduleEntity.setSortCode((999L));
- moduleEntity.setEnabledMark(1);
- moduleEntity.setCreatorTime(DateUtil.getNowDate());
- moduleEntity.setCreatorUserId(userInfo.getUserId());
- String address = pcAddress.get(visualMenuModel.getType());
- moduleEntity.setUrlAddress(address + "/" + visualMenuModel.getEnCode());
- if (Objects.equals(visualMenuModel.getType(), 11)) {
- moduleEntity.setPageAddress(visualMenuModel.getWebAddress());
- }
- if (1 == visualMenuModel.getPc()) {
- List<Integer> pcAuth = visualMenuModel.getPcAuth();
- if (pcAuth == null || pcAuth.size() == 0 || pcAuth.size() != 4) {
- pcAuth = Arrays.asList(0, 0, 0, 0);
- }
- moduleEntity.setIsButtonAuthorize(pcAuth.get(0));
- moduleEntity.setIsColumnAuthorize(pcAuth.get(1));
- moduleEntity.setIsDataAuthorize(pcAuth.get(2));
- moduleEntity.setIsFormAuthorize(pcAuth.get(3));
- List<ModuleEntity> pcModuleList = moduleList.stream().filter(module -> pcCategory.equals(module.getCategory())).collect(Collectors.toList());
- //是否生成过菜单
- if (pcModuleList.size() > 0) {
- for (ModuleEntity entity : pcModuleList) {
- //变更权限
- if (pcPerCols != null) alterPer(entity, pcPerCols);
- //更新菜单
- entity.setPropertyJson(JsonUtil.getObjectToString(jsonModel));
- entity.setIsButtonAuthorize(pcAuth.get(0));
- entity.setIsColumnAuthorize(pcAuth.get(1));
- entity.setIsDataAuthorize(pcAuth.get(2));
- entity.setIsFormAuthorize(pcAuth.get(3));
- entity.setUrlAddress(moduleEntity.getUrlAddress());
- entity.setPageAddress(moduleEntity.getPageAddress());
- moduleService.update(entity.getId(), entity);
- }
- }
- this.createMenu(moduleEntity, visualMenuModel, pcPerCols, true);
- }
- Map<Integer, String> appAddress = ImmutableMap.of(3, "dynamicModel", 8, "visualPortal", 11, "form");
- moduleEntity.setCategory(appCategory);
- String portalAddress = appAddress.get(visualMenuModel.getType());
- String urlAddress = StringUtil.isNotEmpty(portalAddress) ? "/pages/apply/" + portalAddress + "/index?id=" + visualMenuModel.getId() : visualMenuModel.getEnCode();
- moduleEntity.setUrlAddress(urlAddress);
- if (Objects.equals(visualMenuModel.getType(), 11)) {
- moduleEntity.setUrlAddress(visualMenuModel.getAppAddress());
- moduleEntity.setPageAddress(visualMenuModel.getAppAddress());
- }
- if (1 == visualMenuModel.getApp()) {
- List<Integer> appAuth = visualMenuModel.getAppAuth();
- if (appAuth == null || appAuth.size() == 0 || appAuth.size() != 4) {
- appAuth = Arrays.asList(0, 0, 0, 0);
- }
- moduleEntity.setIsButtonAuthorize(appAuth.get(0));
- moduleEntity.setIsColumnAuthorize(appAuth.get(1));
- moduleEntity.setIsDataAuthorize(appAuth.get(2));
- moduleEntity.setIsFormAuthorize(appAuth.get(3));
- List<ModuleEntity> appModuleList = moduleList.stream().filter(module -> appCategory.equals(module.getCategory())).collect(Collectors.toList());
- if (appModuleList.size() > 0) {
- for (ModuleEntity entity : appModuleList) {
- //变更权限
- if (appPerCols != null) alterPer(entity, appPerCols);
- //更新菜单
- entity.setPropertyJson(JsonUtil.getObjectToString(jsonModel));
- entity.setIsButtonAuthorize(appAuth.get(0));
- entity.setIsColumnAuthorize(appAuth.get(1));
- entity.setIsDataAuthorize(appAuth.get(2));
- entity.setIsFormAuthorize(appAuth.get(3));
- entity.setUrlAddress(moduleEntity.getUrlAddress());
- entity.setPageAddress(moduleEntity.getPageAddress());
- moduleService.update(entity.getId(), entity);
- }
- }
- this.createMenu(moduleEntity, visualMenuModel, appPerCols, false);
- }
- }
- /**
- * 创建菜单验证
- *
- * @param moduleEntity
- * @return
- */
- private void createMenu(ModuleEntity moduleEntity, VisualMenuModel visualMenuModel, PerColModels perCols, Boolean isPc) throws WorkFlowException {
- List<ModuleEntity> list = new ArrayList<>();
- List<String> parentIds;
- if (isPc) {
- parentIds = visualMenuModel.getPcModuleParentId();
- } else {
- parentIds = visualMenuModel.getAppModuleParentId();
- }
- //创建菜单
- String fullName = moduleEntity.getFullName();
- String enCode = moduleEntity.getEnCode();
- List<ModuleEntity> moduleList = moduleService.getModuleList(visualMenuModel.getId());
- if (CollectionUtil.isEmpty(parentIds) && CollectionUtil.isEmpty(moduleList)) {
- throw new WorkFlowException("上级不能为空");
- }
- for (String pid : parentIds) {
- ModuleEntity saveEnt = BeanUtil.copyProperties(moduleEntity, ModuleEntity.class);
- saveEnt.setId(RandomUtil.uuId());
- String copyNum = UUID.randomUUID().toString().substring(0, 5);
- ModuleEntity pInfo = moduleService.getInfo(pid);
- //查询不到菜单说明上级是系统
- if (pInfo != null) {
- saveEnt.setParentId(pid);
- saveEnt.setSystemId(pInfo.getSystemId());
- } else {
- SystemEntity info = systemService.getInfo(pid);
- if (info == null) {
- throw new WorkFlowException("找不到该上级");
- }
- saveEnt.setParentId("-1");
- saveEnt.setSystemId(pid);
- }
- saveEnt.setFullName(fullName);
- saveEnt.setEnCode(enCode + copyNum);
- if (isPc) {
- String address = pcAddress.get(visualMenuModel.getType());
- saveEnt.setUrlAddress(address + "/" + saveEnt.getEnCode());
- }
- if (moduleService.isExistByFullName(saveEnt, saveEnt.getCategory(), saveEnt.getSystemId())) {
- throw new WorkFlowException("名称重复");
- }
- if (moduleService.isExistByEnCode(saveEnt, saveEnt.getCategory(), saveEnt.getSystemId())) {
- throw new WorkFlowException("编码重复");
- }
- if (perCols != null) batchCreatePermissions(perCols, saveEnt.getId());
- list.add(saveEnt);
- }
- moduleService.saveBatch(list);
- }
- private void batchCreatePermissions(PerColModels perColModels, String moduleId) {
- List<AuthFlieds> buttonPermission = Objects.nonNull(perColModels.getButtonPermission()) ? perColModels.getButtonPermission() : new ArrayList<>();
- List<AuthFlieds> formPermission = Objects.nonNull(perColModels.getFormPermission()) ? perColModels.getFormPermission() : new ArrayList<>();
- List<AuthFlieds> listPermission = Objects.nonNull(perColModels.getListPermission()) ? perColModels.getListPermission() : new ArrayList<>();
- List<ModuleDataAuthorizeSchemeEntity> dataPermissionScheme = Objects.nonNull(perColModels.getDataPermissionScheme()) ? perColModels.getDataPermissionScheme() : new ArrayList<>();
- //按钮
- List<ModuleButtonEntity> buttonEntities = buttonPermission.stream().map(button -> {
- ModuleButtonEntity buttonEntity = new ModuleButtonEntity();
- buttonEntity.setEnabledMark(button.getStatus() ? 1 : 0);
- buttonEntity.setEnCode(button.getEnCode());
- buttonEntity.setFullName(button.getFullName());
- buttonEntity.setParentId("-1");
- buttonEntity.setModuleId(moduleId);
- buttonEntity.setSortCode(0L);
- return buttonEntity;
- }).collect(Collectors.toList());
- //表单权限
- List<ModuleFormEntity> moduleFormEntities = formPermission.stream().map(form -> {
- ModuleFormEntity formEntity = new ModuleFormEntity();
- formEntity.setBindTable(form.getBindTableName());
- formEntity.setEnabledMark(form.getStatus() ? 1 : 0);
- formEntity.setEnCode(form.getEnCode());
- formEntity.setFullName(form.getFullName());
- formEntity.setParentId("-1");
- formEntity.setModuleId(moduleId);
- formEntity.setFieldRule(form.getRule());
- formEntity.setChildTableKey(form.getChildTableKey());
- formEntity.setSortCode(0L);
- return formEntity;
- }).collect(Collectors.toList());
- //列表
- List<ModuleColumnEntity> moduleColumnEntities = listPermission.stream().map(list -> {
- ModuleColumnEntity moduleColumnEntity = new ModuleColumnEntity();
- moduleColumnEntity.setBindTable(list.getBindTableName());
- moduleColumnEntity.setEnabledMark(list.getStatus() ? 1 : 0);
- moduleColumnEntity.setEnCode(list.getEnCode());
- moduleColumnEntity.setFullName(list.getFullName());
- moduleColumnEntity.setParentId("-1");
- moduleColumnEntity.setModuleId(moduleId);
- moduleColumnEntity.setSortCode(0L);
- moduleColumnEntity.setChildTableKey(list.getChildTableKey());
- moduleColumnEntity.setFieldRule(list.getRule());
- return moduleColumnEntity;
- }).collect(Collectors.toList());
- for (ModuleButtonEntity btn : buttonEntities) {
- moduleButtonService.create(btn);
- }
- for (ModuleFormEntity formEntity : moduleFormEntities) {
- moduleFormService.create(formEntity);
- }
- for (ModuleColumnEntity moduleColumnEntity : moduleColumnEntities) {
- moduleColumnService.create(moduleColumnEntity);
- }
- //方案
- for (ModuleDataAuthorizeSchemeEntity moduleDataAuthorizeEntity : dataPermissionScheme) {
- moduleDataAuthorizeEntity.setId(RandomUtil.uuId());
- moduleDataAuthorizeEntity.setModuleId(moduleId);
- moduleDataAuthorizeSchemeService.save(moduleDataAuthorizeEntity);
- }
- //创建全部数据方案
- if (Objects.nonNull(perColModels.getDataPermissionScheme())) {
- Boolean exist = moduleDataAuthorizeSchemeService.isExistAllData(moduleId);
- if (!exist) {
- ModuleDataAuthorizeSchemeEntity moduleDataAuthorizeSchemeEntity = new ModuleDataAuthorizeSchemeEntity();
- moduleDataAuthorizeSchemeEntity.setFullName("全部数据");
- moduleDataAuthorizeSchemeEntity.setEnCode("jnpf_alldata");
- moduleDataAuthorizeSchemeEntity.setAllData(1);
- moduleDataAuthorizeSchemeEntity.setModuleId(moduleId);
- moduleDataAuthorizeSchemeService.create(moduleDataAuthorizeSchemeEntity);
- }
- }
- }
- private void getModuleParentId() {
- QueryWrapper<ModuleEntity> moduleWrapper = new QueryWrapper<>();
- moduleWrapper.lambda().eq(ModuleEntity::getFullName, pcCate).eq(ModuleEntity::getCategory, pcCategory);
- ModuleEntity pcModule = moduleService.getOne(moduleWrapper);
- if (pcModule != null) {
- this.setParentId(pcModule.getId());
- }
- QueryWrapper<ModuleEntity> appWrapper = new QueryWrapper<>();
- appWrapper.lambda().eq(ModuleEntity::getFullName, appCate).eq(ModuleEntity::getCategory, appCategory);
- ModuleEntity appModule = moduleService.getOne(appWrapper);
- if (appModule != null) {
- this.setAppParentId(appModule.getId());
- }
- }
- /**
- * 自动变更权限
- *
- * @param entity
- * @param perColModelSour
- * @return
- */
- private void alterPer(ModuleEntity entity, PerColModels perColModelSour) {
- String moduleMainId = entity.getId();
- PerColModels perColModel = BeanUtil.copyProperties(perColModelSour, PerColModels.class);
- PerColModels perColModels = new PerColModels();
- //列表
- if (perColModel.getListPermission() != null) {
- Map<String, String> colMap = new HashMap<>();
- List<ModuleColumnEntity> columnEntities = moduleColumnService.getList(moduleMainId);
- columnEntities.stream().forEach(col -> colMap.put(col.getEnCode(), col.getId()));
- List<AuthFlieds> listPermission = perColModel.getListPermission() != null ? perColModel.getListPermission() : new ArrayList<>();
- //只变更状态
- List<AuthFlieds> authColList = intersectList1(listPermission, colMap);
- Map<String, Boolean> stateMap = new HashMap<>();
- authColList.stream().forEach(auth -> stateMap.put(auth.getEnCode(), auth.getStatus()));
- for (ModuleColumnEntity columnEntity : columnEntities) {
- if (Objects.nonNull(stateMap.get(columnEntity.getEnCode()))) {
- columnEntity.setEnabledMark(stateMap.get(columnEntity.getEnCode()) ? 1 : 0);
- moduleColumnService.update(columnEntity.getId(), columnEntity);
- }
- }
- //新增
- List<AuthFlieds> authColCreList = intersectList2(listPermission, authColList);
- perColModels.setListPermission(authColCreList);
- }
- //表单
- if (perColModel.getFormPermission() != null) {
- Map<String, String> formMap = new HashMap<>();
- List<ModuleFormEntity> formEntities = moduleFormService.getList(moduleMainId);
- formEntities.stream().forEach(form -> formMap.put(form.getEnCode(), form.getId()));
- List<AuthFlieds> formPermission = perColModel.getFormPermission() != null ? perColModel.getFormPermission() : new ArrayList<>();
- List<AuthFlieds> authFormList = intersectList1(formPermission, formMap);
- Map<String, Boolean> stateFMap = new HashMap<>();
- authFormList.stream().forEach(auth -> stateFMap.put(auth.getEnCode(), auth.getStatus()));
- for (ModuleFormEntity formEntity : formEntities) {
- if (Objects.nonNull(stateFMap.get(formEntity.getEnCode()))) {
- formEntity.setEnabledMark(stateFMap.get(formEntity.getEnCode()) ? 1 : 0);
- moduleFormService.update(formEntity.getId(), formEntity);
- }
- }
- List<AuthFlieds> authFormCreList = intersectList2(formPermission, authFormList);
- perColModels.setFormPermission(authFormCreList);
- }
- //按钮权限
- if (perColModel.getButtonPermission() != null) {
- Map<String, String> btnMap = new HashMap<>();
- List<ModuleButtonEntity> buttonEntities = moduleButtonService.getListByModuleIds(moduleMainId);
- buttonEntities.stream().forEach(btn -> btnMap.put(btn.getEnCode(), btn.getId()));
- List<AuthFlieds> buttonPermission = perColModel.getButtonPermission() != null ? perColModel.getButtonPermission() : new ArrayList<>();
- List<AuthFlieds> authBtnList = intersectList1(buttonPermission, btnMap);
- Map<String, Boolean> stateBMap = new HashMap<>();
- authBtnList.stream().forEach(auth -> stateBMap.put(auth.getEnCode(), auth.getStatus()));
- for (ModuleButtonEntity btnEntity : buttonEntities) {
- if (Objects.nonNull(stateBMap.get(btnEntity.getEnCode()))) {
- btnEntity.setEnabledMark(stateBMap.get(btnEntity.getEnCode()) ? 1 : 0);
- moduleButtonService.update(btnEntity.getId(), btnEntity);
- }
- }
- List<AuthFlieds> authBtnCreList = intersectList2(buttonPermission, authBtnList);
- perColModels.setButtonPermission(authBtnCreList);
- }
- //表单权限方案
- if (perColModel.getDataPermissionScheme() != null) {
- //交集
- List<ModuleDataAuthorizeSchemeEntity> togetherList = new ArrayList<>();
- List<ModuleDataAuthorizeSchemeEntity> dataAuthorizeSchemeList = moduleDataAuthorizeSchemeService.getList(moduleMainId);
- List<ModuleDataAuthorizeSchemeEntity> dataPermissionScheme = perColModel.getDataPermissionScheme();
- List<ModuleDataAuthorizeSchemeEntity> dataPermissionSchemeClone = new ArrayList<>(dataPermissionScheme);
- for (ModuleDataAuthorizeSchemeEntity authFlieds : dataPermissionScheme) {
- for (ModuleDataAuthorizeSchemeEntity schemeEntity : dataAuthorizeSchemeList) {
- if (schemeEntity.getConditionJson() == null) {
- continue;
- }
- if (Objects.equals(-9527l, schemeEntity.getSortCode()) && schemeEntity.getConditionText().contains(authFlieds.getConditionText())) {
- togetherList.add(authFlieds);
- }
- }
- }
- //需要新增 dataPermissionScheme
- dataPermissionScheme.removeAll(togetherList);
- //需要删除
- List<String> collect = dataPermissionSchemeClone.stream().map(ModuleDataAuthorizeSchemeEntity::getDescription).collect(Collectors.toList());
- List<ModuleDataAuthorizeSchemeEntity> deleteSchemeList = new ArrayList<>();
- if (dataAuthorizeSchemeList.size() > 0) {
- for (ModuleDataAuthorizeSchemeEntity item : dataAuthorizeSchemeList) {
- if (!collect.contains(item.getDescription()) && Objects.equals(-9527l, item.getSortCode())) {
- //需要移除的权限方案
- deleteSchemeList.add(item);
- }
- }
- }
- for (ModuleDataAuthorizeSchemeEntity scheme : deleteSchemeList) {
- moduleDataAuthorizeSchemeService.delete(scheme);
- }
- perColModels.setDataPermissionScheme(new ArrayList<>(dataPermissionScheme));
- }
- //新增的权限
- batchCreatePermissions(perColModels, moduleMainId);
- }
- /**
- * 取交集 (不需要变动的数据)
- *
- * @param authFlieds 新提交过来的
- * @param databaseMap 数据库存在数据
- * @return
- */
- private List<AuthFlieds> intersectList1(List<AuthFlieds> authFlieds, Map<String, String> databaseMap) {
- List<AuthFlieds> lastList = new LinkedList<>();
- for (AuthFlieds authFlied : authFlieds) {
- if (databaseMap.containsKey(authFlied.getEnCode())) {
- lastList.add(authFlied);
- }
- }
- return lastList;
- }
- /**
- * 求差集 (需要新增的数据) create
- *
- * @param auth1 新提交过来的
- * @param auth2 与数据库的交集
- * @return
- */
- private List<AuthFlieds> intersectList2(List<AuthFlieds> auth1, List<AuthFlieds> auth2) {
- auth1.removeAll(auth2);
- return auth1;
- }
- /**
- * 求差集 (需要变更的数据) delete
- *
- * @param databaseMap 数据库已存在的数据 <encode,id>
- * @param auth2 与数据库的交集
- * @return
- */
- private Map<String, String> intersectList3(Map<String, String> databaseMap, List<AuthFlieds> auth2) {
- Map<String, String> changeMap = new HashMap<>();
- changeMap.putAll(databaseMap);
- for (AuthFlieds authFlieds : auth2) {
- if (databaseMap.get(authFlieds.getEnCode()) != null) {
- changeMap.remove(authFlieds.getEnCode());
- }
- }
- return changeMap;
- }
- public void setParentId(String parentId) {
- this.parentId = parentId;
- }
- public void setAppParentId(String appParentId) {
- this.appParentId = appParentId;
- }
- public void publishPortalMenu(VisualMenuModel visualMenuModel) {
- }
- }
|