diff --git a/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/CooperationController.java b/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/CooperationController.java new file mode 100644 index 00000000..f6f6b9dc --- /dev/null +++ b/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/CooperationController.java @@ -0,0 +1,311 @@ +package com.actionsoft.apps.coe.pal.cooperation; + +import com.actionsoft.apps.coe.pal.components.web.PALRepositoryTreeWeb; +import com.actionsoft.apps.coe.pal.cooperation.web.CooperationWeb; +import com.actionsoft.bpms.org.dao.User; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.bpms.server.bind.annotation.Controller; +import com.actionsoft.bpms.server.bind.annotation.Mapping; + +/** + * @Created by sunlh + * @Date 2020-12-01 + */ + +@Controller +public class CooperationController { + + /** + * 主页 + * @param uc + * @param mainPage + * @return + */ + @Mapping("com.actionsoft.apps.coe.pal.cooperation_main") + public String mainPage(UserContext uc, String mainPage) { + CooperationWeb web = new CooperationWeb(uc); + return web.mainPage(mainPage); + } + + /** + * 新建、修改小组时查询必要数据 + * @param uc + * @param teamId + * @return + */ + @Mapping("com.actionsoft.apps.coe.pal.cooperation_team_create_or_update_data_query") + public String queryTeamCreateOrUpdateData(UserContext uc, String teamId) { + CooperationWeb web = new CooperationWeb(uc); + return web.queryTeamCreateOrUpdateData(teamId); + } + + /** + * 查询PAL用户树 + * @param uc + * @param pid + * @param parentType + * @return + */ + @Mapping("com.actionsoft.apps.coe.pal.cooperation_pal_user_tree_subjson") + public String queryPalUserTree(UserContext uc, String pid, String parentType) { + CooperationWeb web = new CooperationWeb(uc); + return web.queryPalUserTree(pid, parentType); + } + + /** + * 保存新建、修改的小组信息 + * @param uc + * @param data + * @return + */ + @Mapping("com.actionsoft.apps.coe.pal.cooperation_team_create_or_update_data_save") + public String saveTeamCreateOrUpdateData(UserContext uc, String data) { + CooperationWeb web = new CooperationWeb(uc); + return web.saveTeamCreateOrUpdateData(data); + } + + /** + * 查询当前用户拥有管理权限的小组 + * @param uc + * @return + */ + @Mapping("com.actionsoft.apps.coe.pal.cooperation_manage_team_info_list") + public String queryManageTeamInfoList(UserContext uc) { + CooperationWeb web = new CooperationWeb(uc); + return web.queryManageTeamInfoList(); + } + + /** + * 查询当前用户所在的所有小组 + */ + @Mapping("com.actionsoft.apps.coe.pal.cooperation_manage_joined_team_list_query") + public String queryJoinedTeamList(UserContext uc) { + CooperationWeb web = new CooperationWeb(uc); + return web.queryJoinedTeamList(); + } + + /** + * 对小组进行排序 + */ + @Mapping("com.actionsoft.apps.coe.pal.cooperation_manage_user_team_sort") + public String sortTeam(UserContext uc, String teamIds) { + CooperationWeb web = new CooperationWeb(uc); + return web.sortTeam(teamIds); + } + + /** + * 修改小组的基本信息 + * @param uc + * @param data + * @return + */ + @Mapping("com.actionsoft.apps.coe.pal.cooperation_manage_team_baseinfo_update_save") + public String updateTeamInfo(UserContext uc, String data) { + CooperationWeb web = new CooperationWeb(uc); + return web.updateTeamInfo(data); + } + + /** + * 修改小组状态,停用/启用 + * @param uc + * @param teamId + * @param status 0启用/1停用 + * @return + */ + @Mapping("com.actionsoft.apps.coe.pal.cooperation_manage_team_update_status") + public String updateTeamStatus(UserContext uc, String teamId, int status) { + CooperationWeb web = new CooperationWeb(uc); + return web.updateTeamStatus(teamId, status); + } + + /** + * 解散小组 + * @param uc + * @param teamId + * @return + */ + @Mapping("com.actionsoft.apps.coe.pal.cooperation_manage_team_remove") + public String removeTeam(UserContext uc, String teamId) { + CooperationWeb web = new CooperationWeb(uc); + return web.removeTeam(teamId); + } + + /** + * 退出小组 + * @param uc + * @param teamId + * @return + */ + @Mapping("com.actionsoft.apps.coe.pal.cooperation_manage_team_exit") + public String exitTeam(UserContext uc, String teamId) { + CooperationWeb web = new CooperationWeb(uc); + return web.exitTeam(teamId); + } + + /** + * 查询小组的详细信息,成员信息 + * @param uc + * @param teamId + * @return + */ + @Mapping("com.actionsoft.apps.coe.pal.cooperation_manage_team_detail_query") + public String queryTeamDetail(UserContext uc, String teamId) { + CooperationWeb web = new CooperationWeb(uc); + return web.queryTeamDetail(teamId); + } + + /** + * 查询小组角色列表 + * @param uc + * @param teamId + * @param userIds + * @return + */ + @Mapping("com.actionsoft.apps.coe.pal.cooperation_role_data_query") + public String queryRoleData(UserContext uc, String teamId, String userIds) { + CooperationWeb web = new CooperationWeb(uc); + return web.queryRoleData(teamId, userIds); + } + + /** + * 修改用户的角色保存 + */ + @Mapping("com.actionsoft.apps.coe.pal.cooperation_role_user_update_save") + public String saveUserUpdateRole(UserContext uc, String data) { + CooperationWeb web = new CooperationWeb(uc); + return web.saveUserUpdateRole(data); + } + + /** + * 删除小组角色 + * @param uc + * @param teamId + * @param roleId + * @return + */ + @Mapping("com.actionsoft.apps.coe.pal.cooperation_role_remove") + public String removeCooperationRole(UserContext uc, String teamId, String roleId) { + CooperationWeb web = new CooperationWeb(uc); + return web.removeCooperationRole(teamId, roleId); + } + + /** + * 新增、修改角色信息时查询相关角色信息 + * @param uc + * @param teamId + * @param roleId + * @return + */ + @Mapping("com.actionsoft.apps.coe.pal.cooperation_role_create_or_update_data_query") + public String queryRoleUpdateData(UserContext uc, String teamId, String roleId) { + CooperationWeb web = new CooperationWeb(uc); + return web.queryRoleUpdateData(teamId, roleId); + } + + /** + * 获取设置的小组权限范围内的流程树结构 + * @param uc + * @param wsId + * @param teamId + * @param pid + * @param categorys + * @return + */ + @Mapping("com.actionsoft.apps.coe.pal.cooperation_repository_tree_component_subjson") + public String queryCooperationTeamRepositoryTree(UserContext uc, String wsId, String teamId, String pid, String categorys) { + CooperationWeb web = new CooperationWeb(uc); + return web.queryCooperationTeamRepositoryTree(wsId, teamId, pid, categorys); + } + + /** + * 查询小组权限范围内流程树 + * @param uc + * @param wsId + * @param teamId + * @param rootId + * @param categorys + * @param name + * @return + */ + @Mapping("com.actionsoft.apps.coe.pal.cooperation_repository_tree_component_search") + public String searchCooperationTeamRepositoryTreeData(UserContext uc, String wsId, String teamId, String rootId, String categorys, String name) { + CooperationWeb web = new CooperationWeb(uc); + return web.searchCooperationTeamRepositoryTreeData(wsId, teamId, rootId, categorys, name); + } + + /** + * 查询小组权限范围内所有的子节点 + * @param uc + * @param wsId + * @param teamId + * @param pid + * @return + */ + @Mapping("com.actionsoft.apps.coe.pal.cooperation_repository_all_childern_data_query") + public String searchCooperationTeamRepositoryAllChildrenData(UserContext uc, String wsId, String teamId, String pid) { + CooperationWeb web = new CooperationWeb(uc); + return web.searchCooperationTeamRepositoryAllChildrenData(wsId, teamId, pid); + } + + /** + * 根据版本号查询当前正在使用中的流程名称 + * @param uc + * @param versionIds + * @return + */ + @Mapping("com.actionsoft.apps.coe.pal.cooperation_repository_names_query") + public String queryRepositoryNamesByVersionIds(UserContext uc, String versionIds) { + CooperationWeb web = new CooperationWeb(uc); + return web.queryRepositoryNamesByVersionIds(versionIds); + } + + /** + * 新增/修改角色保存 + * @param uc + * @param data + * @return + */ + @Mapping("com.actionsoft.apps.coe.pal.cooperation_role_create_or_update_data_save") + public String saveRoleUpdateData(UserContext uc, String data) { + CooperationWeb web = new CooperationWeb(uc); + return web.saveRoleUpdateData(data); + } + + /** + * 添加成员,查询未加入小组的PAL用户以及现有的角色列表 + * @param uc + * @param teamId + * @return + */ + @Mapping("com.actionsoft.apps.coe.pal.cooperation_member_add_data_query") + public String queryCooperationAddMemberData(UserContext uc, String teamId) { + CooperationWeb web = new CooperationWeb(uc); + return web.queryCooperationAddMemberData(teamId); + } + + /** + * 添加成员,保存 + * @param uc + * @param data + * @return + */ + @Mapping("com.actionsoft.apps.coe.pal.cooperation_member_add_data_save") + public String saveCooperationAddMemberData(UserContext uc, String data) { + CooperationWeb web = new CooperationWeb(uc); + return web.saveCooperationAddMemberData(data); + } + + /** + * 删除小组成员 + * @param uc + * @param teamId + * @param userIds + * @return + */ + @Mapping("com.actionsoft.apps.coe.pal.cooperation_manage_team_member_remove") + public String removeCooperationMember(UserContext uc, String teamId, String userIds) { + CooperationWeb web = new CooperationWeb(uc); + return web.removeCooperationMember(teamId, userIds); + } + +} diff --git a/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/CooperationQueryAPIManager.java b/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/CooperationQueryAPIManager.java new file mode 100644 index 00000000..f19ada8a --- /dev/null +++ b/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/CooperationQueryAPIManager.java @@ -0,0 +1,226 @@ +package com.actionsoft.apps.coe.pal.cooperation; + + +import com.actionsoft.apps.coe.pal.constant.CoEConstant; +import com.actionsoft.apps.coe.pal.cooperation.util.CooperationUtil; +import com.actionsoft.apps.coe.pal.pal.method.cache.PALMethodCache; +import com.actionsoft.apps.coe.pal.pal.repository.PALRepositoryQueryAPIManager; +import com.actionsoft.apps.coe.pal.pal.repository.cache.PALRepositoryCache; +import com.actionsoft.apps.coe.pal.pal.repository.model.PALRepositoryModel; +import com.actionsoft.apps.coe.pal.pal.repository.util.CoeProcessLevelUtil; +import com.actionsoft.bpms.util.UtilString; +import com.actionsoft.i18n.I18nRes; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +import java.util.*; + +public class CooperationQueryAPIManager { + + private CooperationQueryAPIManager(){ + + } + + public static CooperationQueryAPIManager getInstance() { + return CooperationQueryAPIManager.Inner.instance; + } + + private static class Inner { + private final static CooperationQueryAPIManager instance = new CooperationQueryAPIManager(); + } + + /** + * 获取小组权限范围内的使用中的流程树根节点 + * + * @param wsId + * @param categorys + * @param teamId 小组Id + * @return + */ + public JSONArray getPalRepositoryTreeRoot(String wsId, String categorys, String teamId) { + JSONArray result = new JSONArray(); + List palMethodList; + String[] categoryArray; + if (UtilString.isEmpty(categorys)) {// 不指定分类 + palMethodList = PALMethodCache.getPALMethodList(true); + if (!UtilString.isEmpty(teamId)) { + palMethodList = PALMethodCache.getPALMethodList(true); + List list = new ArrayList<>(); + List list1 = CooperationUtil.getPermRepositoryList(wsId, teamId, null, null, true, false); + for (String str: palMethodList) { + for (PALRepositoryModel model : list1) { + if (model.getMethodCategory().equals(str)) { + list.add(new String(str)); + break; + } + } + } + palMethodList = list; + } + categoryArray = new String[palMethodList.size()]; + palMethodList.toArray(categoryArray); + } else {// 指定分类 + categoryArray = categorys.split(","); + } + for (String category : categoryArray) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("id", category); + jsonObject.put("versionId", category); + String name = I18nRes.findValue(CoEConstant.APP_ID, category); + jsonObject.put("name", name); + JSONObject icon = new JSONObject(); + icon.put("icon", ""); + icon.put("color", "red"); + jsonObject.put("icon", icon); + jsonObject.put("plCategory", category); + List list = CooperationUtil.getPermRepositoryList(wsId, teamId, category, null, true, false); + if (list != null && list.size() > 0) { + jsonObject.put("leaf", false); + } else { + jsonObject.put("leaf", true); + } + result.add(jsonObject); + } + return result; + } + + /** + * 根据pid获取符合条件的子流程数据(小组权限范围内) + * @param wsId + * @param teamId + * @param pid + * @return + */ + public JSONArray getUsedPalRepositoryTreeDataByPidNew(String wsId, String teamId, String pid) { + // 获取符合权限的子流程 + List childrenList = getUsedPalRepositoryModelsByPidNew(wsId, teamId, pid); + CooperationUtil.sortByLevelAndOrderIndex(childrenList); + Map grandChildrenCountMap = new HashMap<>(); + for (PALRepositoryModel chlidModel : childrenList) { + List grandChildrenList = getUsedPalRepositoryModelsByPidNew(wsId, teamId, chlidModel.getId()); + grandChildrenCountMap.put(chlidModel.getId(), grandChildrenList.size()); + } + JSONArray result = list2JsonNew(childrenList, grandChildrenCountMap); + return result; + } + + /** + * 获取某个流程的使用中的子流程(小组权限范围内) + * + * @param wsId + * @param pid + * @return + */ + public List getUsedPalRepositoryModelsByPidNew(String wsId, String teamId, String pid) { + if (UtilString.isEmpty(teamId)) { + return PALRepositoryQueryAPIManager.getInstance().getUsedPalRepositoryModelsByPid(wsId, pid); + } else { + List result = new ArrayList<>(); + // 获取权限versionIds + Set permVerIds = CooperationUtil.getPermRepositoryVersionIds(wsId, teamId, null, null); + if (permVerIds.size() > 0) { + getPermRepositoryByPid(wsId, pid, permVerIds, true, false, new HashSet<>(), result); + } + return result; + } + } + + /** + * 根据父节点获取权限范围内的子流程(小组权限范围内) + * @param wsId + * @param pid + * @param permVersionIds 权限versionIds + * @param isUse + * @param isPublish + * @param verIds 给一个空的Set,防止数据造成的死循环 + * @param result 结果集 + */ + private void getPermRepositoryByPid(String wsId, String pid, Set permVersionIds, boolean isUse, boolean isPublish, Set verIds, List result) { + List childList = PALRepositoryCache.getAllSubModelsByPid(wsId, pid); + if (childList != null && childList.size() > 0) { + for (PALRepositoryModel model : childList) { + if (verIds.contains(model.getVersionId())) { + //防止无限循环 + continue; + } + if (isUse) { + if (model.isUse()) {// 设计中的流程是连贯的,与发布不同 + verIds.add(model.getVersionId()); + if (permVersionIds.contains(model.getVersionId())) { + result.add(model); + } else { + getPermRepositoryByPid(wsId, model.getId(), permVersionIds, isUse, isPublish, verIds, result); + } + } + } else if (isPublish) { + if (model.isPublish() && permVersionIds.contains(model.getVersionId())) { + verIds.add(model.getVersionId()); + result.add(model); + } else { + getPermRepositoryByPid(wsId, model.getId(), permVersionIds, isUse, isPublish, verIds, result); + } + } + } + } + } + + /** + * 新的流程树list转换json方法 + * @param list + * @param childrenCountMap list中的model是否具有子节点map记录 + * @return + */ + private JSONArray list2JsonNew(List list, Map childrenCountMap) { + JSONArray jsonArray = new JSONArray(); + for (PALRepositoryModel model : list) { + JSONObject object = new JSONObject(); + object.put("id", model.getVersionId().trim()); + object.put("plNo", CoeProcessLevelUtil.getProcessLevelNoByUUId(model.getId(), model.getWsId()).trim()); + object.put("name", I18nRes.findValue(CoEConstant.APP_ID, model.getName()).trim()); + object.put("wsId", model.getWsId()); + object.put("isSystemFile", model.isSystemFile()); + object.put("plMethodId", model.getMethodId().trim()); + JSONObject icon = new JSONObject();// vue + if (!"default".equals(model.getMethodId())) { + if (PALMethodCache.getPALMethodModelById(model.getMethodId()) == null) { + object.put("iconFont", ""); + icon.put("icon", ""); + icon.put("color", "#ff9421"); + } else { + object.put("iconFont", ""); + icon.put("icon", ""); + icon.put("color", "#909399"); + } + } else { + object.put("iconFont", ""); + icon.put("icon", ""); + icon.put("color", "#ff9421"); + } + object.put("icon", icon); + List children = null; + if (childrenCountMap.containsKey(model.getId()) && childrenCountMap.get(model.getId()) > 0) { + object.put("leaf", false);// 非叶子节点 + } else { + object.put("leaf", true);// 叶子节点 + } + object.put("plLevel", model.getLevel()); + object.put("plOrdexIndex", model.getOrderIndex()); + object.put("plDiagramUrl", model.getDiagramUrl()); + object.put("isDrops", model.isSystemFile()); + object.put("isPublish", model.isPublish()); + object.put("isStop", model.isStop()); + object.put("isApproval", model.isApproval()); + object.put("ext1", model.getExt1()); + object.put("ext2", model.getExt2()); + object.put("ext3", model.getExt3()); + object.put("ext4", model.getExt4()); + object.put("isUse", model.isUse()); + object.put("plCategory", model.getMethodCategory()); + object.put("versionId", model.getVersionId()); + object.put("orderIndex", model.getOrderIndex()); + object.put("isBottomLevel", model.isBottomLevel()); + jsonArray.add(object); + } + return jsonArray; + } +} diff --git a/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/aslp/ListApps.java b/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/aslp/ListApps.java new file mode 100644 index 00000000..010815d9 --- /dev/null +++ b/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/aslp/ListApps.java @@ -0,0 +1,33 @@ +package com.actionsoft.apps.coe.pal.cooperation.aslp; + +import com.actionsoft.apps.coe.pal.cooperation.extend.CooperationAppManager; +import com.actionsoft.apps.coe.pal.cooperation.extend.CooperationAppProfile; +import com.actionsoft.apps.resource.interop.aslp.ASLP; +import com.actionsoft.bpms.commons.mvc.view.ResponseObject; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +import java.util.List; +import java.util.Map; + +/** + * 列出PAL小组扩展的App + */ +public class ListApps implements ASLP { + + @Override + public ResponseObject call(Map params) { + List list = CooperationAppManager.getList(); + JSONArray jsonArray = new JSONArray(); + for (CooperationAppProfile profile : list) { + JSONObject jo = new JSONObject(); + jo.put("appId", profile.getAppContext().getId()); + jo.put("id", profile.getId()); + jo.put("title", profile.getTitle()); + jo.put("desc", profile.getDesc()); + jsonArray.add(jo); + } + return ResponseObject.newOkResponse().put("apps", jsonArray); + } + +} diff --git a/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/aslp/RegisterApp.java b/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/aslp/RegisterApp.java new file mode 100644 index 00000000..65e4b2ad --- /dev/null +++ b/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/aslp/RegisterApp.java @@ -0,0 +1,32 @@ +package com.actionsoft.apps.coe.pal.cooperation.aslp; + +import com.actionsoft.apps.coe.pal.cooperation.extend.CooperationAppManager; +import com.actionsoft.apps.resource.AppContext; +import com.actionsoft.apps.resource.interop.aslp.ASLP; +import com.actionsoft.bpms.commons.mvc.view.ResponseObject; + +import java.util.Map; + +/** + * 为流程团队扩展App,推荐注册位置放在该App的启动后事件 + * + * @author jack + * + */ +public class RegisterApp implements ASLP { + + @Override + public ResponseObject call(Map params) { + if (params == null) { + return ResponseObject.newErrResponse().err("不接受参数为空的调用!"); + } + AppContext app = (AppContext) params.get("caller"); + String id = (String) params.get("id"); + String title = (String) params.get("title"); + String desc = (String) params.get("desc"); + String deletedClass = (String) params.get("deletedClass"); + CooperationAppManager.register(app, id, title, desc, deletedClass); + return ResponseObject.newOkResponse(); + } + +} diff --git a/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/constant/Constant.java b/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/constant/Constant.java new file mode 100644 index 00000000..b6e210a9 --- /dev/null +++ b/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/constant/Constant.java @@ -0,0 +1,17 @@ +package com.actionsoft.apps.coe.pal.cooperation.constant; + +/** + * @Description TODO + * @Created by sunlh + * @Date 2020-12-01 + */ +public class Constant { + + public final static String APP_ID = "com.actionsoft.apps.coe.pal.cooperation"; + + public final static String SORT_KEY = "sort"; + + public final static String SORT_TEAM_NAME = "team"; + + public final static String TEAMWORK_UPGRADE_LOG = "teamworkUpgradeLog";// 流程团队自动升级日志 +} diff --git a/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/dc/FileProcessor.java b/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/dc/FileProcessor.java new file mode 100644 index 00000000..1cfac795 --- /dev/null +++ b/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/dc/FileProcessor.java @@ -0,0 +1,7 @@ +package com.actionsoft.apps.coe.pal.cooperation.dc; + +import com.actionsoft.bpms.server.fs.AbstFileProcessor; + +public class FileProcessor extends AbstFileProcessor{ + +} diff --git a/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/dto/CooperationManageListTeamDetailDto.java b/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/dto/CooperationManageListTeamDetailDto.java new file mode 100644 index 00000000..1dc8a156 --- /dev/null +++ b/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/dto/CooperationManageListTeamDetailDto.java @@ -0,0 +1,107 @@ +package com.actionsoft.apps.coe.pal.cooperation.dto; + +import com.alibaba.fastjson.JSONObject; + +import java.util.List; + +/** + * @Description 小组信息,成员信息 + * @Created by sunlh + * @Date 2020-12-15 + */ +public class CooperationManageListTeamDetailDto { + + private String userId; + private String teamId; + private String teamName; + private JSONObject teamLogo;// {code:xx,color:xx} + private String teamDesc; + private Boolean run;// 小组状态 + private Boolean teamManager;// 是否小组管理员 + private String wsId; + private String wsName; + private List members; + + public CooperationManageListTeamDetailDto() { + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getTeamId() { + return teamId; + } + + public void setTeamId(String teamId) { + this.teamId = teamId; + } + + public String getTeamName() { + return teamName; + } + + public void setTeamName(String teamName) { + this.teamName = teamName; + } + + public String getTeamDesc() { + return teamDesc; + } + + public void setTeamDesc(String teamDesc) { + this.teamDesc = teamDesc; + } + + public JSONObject getTeamLogo() { + return teamLogo; + } + + public void setTeamLogo(JSONObject teamLogo) { + this.teamLogo = teamLogo; + } + + public Boolean getRun() { + return run; + } + + public void setRun(Boolean run) { + this.run = run; + } + + public Boolean getTeamManager() { + return teamManager; + } + + public void setTeamManager(Boolean teamManager) { + this.teamManager = teamManager; + } + + public String getWsId() { + return wsId; + } + + public void setWsId(String wsId) { + this.wsId = wsId; + } + + public String getWsName() { + return wsName; + } + + public void setWsName(String wsName) { + this.wsName = wsName; + } + + public List getMembers() { + return members; + } + + public void setMembers(List members) { + this.members = members; + } +} diff --git a/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/dto/CooperationManageListTeamMemberDto.java b/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/dto/CooperationManageListTeamMemberDto.java new file mode 100644 index 00000000..3a190ad5 --- /dev/null +++ b/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/dto/CooperationManageListTeamMemberDto.java @@ -0,0 +1,116 @@ +package com.actionsoft.apps.coe.pal.cooperation.dto; + +import org.apache.xpath.operations.Bool; + +/** + * @Description 小组成员 + * @Created by sunlh + * @Date 2020-12-15 + */ +public class CooperationManageListTeamMemberDto { + + private String userId; + private String userName; + private String deptId; + private String deptName; + private String email; + private Boolean close; + + private String teamId; + private String teamName; + private String roleId; + private String roleName; + private int roleType; + + public CooperationManageListTeamMemberDto() { + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getDeptId() { + return deptId; + } + + public void setDeptId(String deptId) { + this.deptId = deptId; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getTeamId() { + return teamId; + } + + public void setTeamId(String teamId) { + this.teamId = teamId; + } + + public String getTeamName() { + return teamName; + } + + public void setTeamName(String teamName) { + this.teamName = teamName; + } + + public String getRoleId() { + return roleId; + } + + public void setRoleId(String roleId) { + this.roleId = roleId; + } + + public String getRoleName() { + return roleName; + } + + public void setRoleName(String roleName) { + this.roleName = roleName; + } + + public int getRoleType() { + return roleType; + } + + public void setRoleType(int roleType) { + this.roleType = roleType; + } + + public Boolean getClose() { + return close; + } + + public void setClose(Boolean close) { + this.close = close; + } + +} diff --git a/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/dto/CooperationManageMainTeamDto.java b/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/dto/CooperationManageMainTeamDto.java new file mode 100644 index 00000000..2df980b6 --- /dev/null +++ b/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/dto/CooperationManageMainTeamDto.java @@ -0,0 +1,67 @@ +package com.actionsoft.apps.coe.pal.cooperation.dto; + +import com.alibaba.fastjson.JSONObject; + +/** + * @Description 个人小组管理小组信息查询 + * @Created by sunlh + * @Date 2020-12-14 + */ +public class CooperationManageMainTeamDto { + private String teamId; + private String teamName; + private JSONObject teamLogo;// {code:xx,color:xx} + private Boolean run;// 小组状态 + private Boolean teamManage;// 是否小组管理员 + + public CooperationManageMainTeamDto() { + } + + public CooperationManageMainTeamDto(String teamId, String teamName, JSONObject teamLogo, Boolean run, Boolean teamManage) { + this.teamId = teamId; + this.teamName = teamName; + this.teamLogo = teamLogo; + this.run = run; + this.teamManage = teamManage; + } + + public String getTeamId() { + return teamId; + } + + public void setTeamId(String teamId) { + this.teamId = teamId; + } + + public String getTeamName() { + return teamName; + } + + public void setTeamName(String teamName) { + this.teamName = teamName; + } + + public JSONObject getTeamLogo() { + return teamLogo; + } + + public void setTeamLogo(JSONObject teamLogo) { + this.teamLogo = teamLogo; + } + + public Boolean getRun() { + return run; + } + + public void setRun(Boolean run) { + this.run = run; + } + + public Boolean getTeamManage() { + return teamManage; + } + + public void setTeamManage(Boolean teamManage) { + this.teamManage = teamManage; + } +} diff --git a/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/dto/CooperationRoleDto.java b/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/dto/CooperationRoleDto.java new file mode 100644 index 00000000..840d07b7 --- /dev/null +++ b/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/dto/CooperationRoleDto.java @@ -0,0 +1,58 @@ +package com.actionsoft.apps.coe.pal.cooperation.dto; + +/** + * @Description 角色信息 + * @Created by sunlh + * @Date 2020-12-15 + */ +public class CooperationRoleDto { + + private String roleId; + private String roleName; + private String roleDesc; + private int roleType; + private String icon; + + public CooperationRoleDto() { + } + + public String getRoleId() { + return roleId; + } + + public void setRoleId(String roleId) { + this.roleId = roleId; + } + + public String getRoleName() { + return roleName; + } + + public void setRoleName(String roleName) { + this.roleName = roleName; + } + + public String getRoleDesc() { + return roleDesc; + } + + public void setRoleDesc(String roleDesc) { + this.roleDesc = roleDesc; + } + + public int getRoleType() { + return roleType; + } + + public void setRoleType(int roleType) { + this.roleType = roleType; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } +} diff --git a/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/extend/CooperationAppManager.java b/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/extend/CooperationAppManager.java new file mode 100644 index 00000000..54df9dc1 --- /dev/null +++ b/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/extend/CooperationAppManager.java @@ -0,0 +1,141 @@ +package com.actionsoft.apps.coe.pal.cooperation.extend; + +import com.actionsoft.apps.coe.pal.cooperation.constant.Constant; +import com.actionsoft.apps.resource.AppContext; +import com.actionsoft.bpms.util.ClassReflect; +import com.actionsoft.bpms.util.UtilString; +import com.actionsoft.sdk.local.SDK; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; + +/** + * 注册和管理小组扩展应用 + */ +public final class CooperationAppManager { + private static List _list = new ArrayList<>(); + + private CooperationAppManager() { + } + + /** + * 注册 + * + * @param app 具体的App实现对象 + * @param id 小组扩展应用的id,应用扩展唯一标识,可以为null,若为null,则默认应用id + * @param title 报表标题,可以为null + * @param desc 应用简单描述(可选),例如鼠标移动时的应用提示 + * @param deletedClass 对方App提供的一个普通Java类路径名,提供一个约定execute(String + * teamId)方法,当小组被删除时回调。开发者可以在这里删除垃圾、配置信息,但不建议删除业务数据信息 + */ + public static void register(AppContext app, String id, String title, String desc, String deletedClass) { + CooperationAppProfile profile = new CooperationAppProfile(); + profile.setDeletedClass(deletedClass); + profile.setId(id); + profile.setTitle(title); + profile.setDesc(desc); + profile.setAppContext(app); + boolean isUpdate = false; + for (CooperationAppProfile p : _list) { + if (p.getId().equals(profile.getId())) { + p = profile; + isUpdate = true; + SDK.getAppAPI().info(SDK.getAppAPI().getAppContext(Constant.APP_ID), "扩展App[" + profile.getTitle() + "]重新被注册"); + break; + } + } + if (!isUpdate) { + _list.add(profile); + SDK.getAppAPI().info(SDK.getAppAPI().getAppContext(Constant.APP_ID), "扩展App[" + profile.getTitle() + "]注册成功"); + } + + // try { + // System.out.println(callMainClass(UserContext.fromUID("admin"), + // profile.getId(), "小组Id")); + // } catch (Exception e) { + // + // } + } + + /** + * 根据id获得profile注册信息 + * + * @param id 注册profile时的Id + * @return 如果没有找到返回null + */ + public static CooperationAppProfile getProfile(String id) { + for (CooperationAppProfile p : _list) { + if (p.getId().equals(id)) { + return p; + } + } + return null; + } + + /** + * 有效的扩展应用App + * + * @return + */ + public static List getList() { + List list = new ArrayList<>(); + for (CooperationAppProfile p : _list) { + if (SDK.getAppAPI().isActive(p.getAppContext().getId())) { + list.add(p); + } + } + list.sort((c1, c2) -> { + return c1.getTitle().compareTo(c2.getTitle()); + }); + return list; + } + + /** + * 通知某个小组已删除,异步执行扩展App的级联删除方法 + * + * @param teamId 小组Id + * @return 如果出现错误,返回错误页面 + */ + public static void signalTeamDeleted(String teamId) { + for (CooperationAppProfile p : _list) { + if (!UtilString.isEmpty(p.getDeletedClass()) && SDK.getAppAPI().isActive(p.getAppContext().getId())) { + SignalTeamDeleted signal = new SignalTeamDeleted(p, teamId); + Thread signalThread = new Thread(signal); + signalThread.setName("com.actionsoft.apps.coe.cooperation Thread(Signal Team Deleted)-" + p.getTitle()); + signalThread.start(); + } + } + } +} + +class SignalTeamDeleted implements Runnable { + private String teamId; + private CooperationAppProfile profile; + + public SignalTeamDeleted(CooperationAppProfile profile, String teamId) { + this.profile = profile; + this.teamId = teamId; + } + + public void run() { + Constructor cons = null; + try { + cons = ClassReflect.getConstructor(profile.getDeletedClass(), null, profile.getAppContext()); + } catch (Exception e) { + e.printStackTrace(); + SDK.getAppAPI().err(profile.getAppContext(), profile.getDeletedClass() + "--" + e.toString()); + } + // 获得该接口实现类实例 + try { + Class deletedClass = profile.getAppContext().getBindClassLoader().loadClass(profile.getDeletedClass()); + Object obj = cons.newInstance(); + Method execute = deletedClass.getMethod("execute", new Class[] { String.class }); + execute.invoke(obj, new Object[] { teamId }); + } catch (Exception e) { + e.printStackTrace(); + SDK.getAppAPI().err(profile.getAppContext(), profile.getDeletedClass() + "--" + e.toString()); + } + } +} \ No newline at end of file diff --git a/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/extend/CooperationAppProfile.java b/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/extend/CooperationAppProfile.java new file mode 100644 index 00000000..803a3cbc --- /dev/null +++ b/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/extend/CooperationAppProfile.java @@ -0,0 +1,99 @@ +package com.actionsoft.apps.coe.pal.cooperation.extend; + +import com.actionsoft.apps.resource.AppContext; +import com.actionsoft.bpms.util.MD5; +import com.actionsoft.bpms.util.UtilString; + +/** + * PAL小组应用扩展描述 + */ +public final class CooperationAppProfile { + private AppContext appContext; + private String id; + private String title; + private String desc; + private String deletedClass; + + public CooperationAppProfile() { + } + + /** + * 该扩展App的Id,若未指定,则以相应的appId + * + * @return id + */ + public String getId() { + if (UtilString.isEmpty(id)) { + return getAppContext().getId(); + } + return id; + } + + public void setId(String id) { + this.id = id; + } + + /** + * 应用简单描述(可选),例如鼠标移动时的应用提示 + * + * @return + */ + public String getDesc() { + if (desc == null) { + desc = ""; + } + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + /** + * 应用对象,如果该应用被停用,该Profile不会出现在可用状态 + * + * @return + */ + public AppContext getAppContext() { + return appContext; + } + + public void setAppContext(AppContext appContext) { + this.appContext = appContext; + } + + /** + * 应用标题 + * + * @return + */ + public String getTitle() { + if (UtilString.isEmpty(title)) { + return appContext.getName(); + } else { + return title; + } + } + + public void setTitle(String title) { + this.title = title; + } + + /** + * 对方App提供的一个普通Java类路径名,提供一个约定execute(String + * teamId)方法,当小组被删除时回调。开发者可以在这里删除垃圾、配置信息,但不建议删除业务数据信息 + * + * @return 可选。一个类路径 + */ + public String getDeletedClass() { + if (deletedClass == null) + deletedClass = ""; + deletedClass = deletedClass.trim(); + return deletedClass; + } + + public void setDeletedClass(String deletedClass) { + this.deletedClass = deletedClass; + } + +} diff --git a/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/plugins/InstallListener.java b/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/plugins/InstallListener.java new file mode 100644 index 00000000..6d501eb2 --- /dev/null +++ b/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/plugins/InstallListener.java @@ -0,0 +1,22 @@ +package com.actionsoft.apps.coe.pal.cooperation.plugins; + +import com.actionsoft.apps.listener.AppListener; +import com.actionsoft.apps.resource.AppContext; + +/** + * @Description 应用安装后事件 + * @Created by sunlh + * @Date 2020-12-28 + */ +public class InstallListener implements AppListener { + + @Override + public void after(AppContext appContext) { + + } + + @Override + public boolean before(AppContext appContext) { + return true; + } +} diff --git a/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/plugins/Plugins.java b/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/plugins/Plugins.java new file mode 100644 index 00000000..66928da5 --- /dev/null +++ b/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/plugins/Plugins.java @@ -0,0 +1,39 @@ +package com.actionsoft.apps.coe.pal.cooperation.plugins; + +import com.actionsoft.apps.coe.pal.cooperation.aslp.ListApps; +import com.actionsoft.apps.coe.pal.cooperation.aslp.RegisterApp; +import com.actionsoft.apps.coe.pal.cooperation.dc.FileProcessor; +import com.actionsoft.apps.listener.PluginListener; +import com.actionsoft.apps.resource.AppContext; +import com.actionsoft.apps.resource.plugin.profile.ASLPPluginProfile; +import com.actionsoft.apps.resource.plugin.profile.AWSPluginProfile; +import com.actionsoft.apps.resource.plugin.profile.AppExtensionProfile; +import com.actionsoft.apps.resource.plugin.profile.DCPluginProfile; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @Created by sunlh + * @Date 2020-12-01 + */ +public class Plugins implements PluginListener { + @Override + public List register(AppContext app) { + List list = new ArrayList<>(); + list.add(new ASLPPluginProfile("registerApp", RegisterApp.class.getName(), "开发者注册流程团队扩展App", null)); + list.add(new ASLPPluginProfile("listApps", ListApps.class.getName(), "列出已注册的流程团队扩展App", null)); + list.add(new DCPluginProfile("teamworkUpgradeLog", FileProcessor.class.getName(), "[流程团队][小组/权限数据]自动更新到[PAL小组]", false, false)); + + Map params2 = new HashMap(); + params2.put("title", "回收站"); + params2.put("id", "recycle");// 回收站标识 + params2.put("desc", "浏览和编辑流程回收站内容"); + params2.put("deletedClass", ""); + list.add(new AppExtensionProfile("PAL小组->回收站", "aslp://com.actionsoft.apps.coe.pal.cooperation/registerApp", params2)); + + return list; + } +} diff --git a/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/plugins/StartListener.java b/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/plugins/StartListener.java new file mode 100644 index 00000000..8b5adb7a --- /dev/null +++ b/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/plugins/StartListener.java @@ -0,0 +1,407 @@ +package com.actionsoft.apps.coe.pal.cooperation.plugins; + +import com.actionsoft.apps.coe.pal.cooperation.CoeCooperationAPIManager; +import com.actionsoft.apps.coe.pal.cooperation.constant.CoeCooperationConst; +import com.actionsoft.apps.coe.pal.cooperation.constant.Constant; +import com.actionsoft.apps.coe.pal.cooperation.model.*; +import com.actionsoft.apps.coe.pal.cooperation.util.LogUtil; +import com.actionsoft.apps.coe.pal.pal.repository.cache.PALRepositoryCache; +import com.actionsoft.apps.coe.pal.pal.repository.model.PALRepositoryModel; +import com.actionsoft.apps.coe.pal.pal.ws.dao.CoeWorkSpaceDaoFactory; +import com.actionsoft.apps.coe.pal.pal.ws.model.CoeWorkSpaceModel; +import com.actionsoft.apps.coe.pal.teamwork.TeamPermAPIManager; +import com.actionsoft.apps.coe.pal.teamwork.cache.TeamMemberPermCache; +import com.actionsoft.apps.coe.pal.teamwork.cache.TeamPermCache; +import com.actionsoft.apps.coe.pal.teamwork.dao.TeamPerm; +import com.actionsoft.apps.coe.pal.teamwork.model.TeamMemberPermExtendModel; +import com.actionsoft.apps.coe.pal.teamwork.model.TeamMemberPermModel; +import com.actionsoft.apps.coe.pal.teamwork.model.TeamPermModel; +import com.actionsoft.apps.lifecycle.api.AppsAPIManager; +import com.actionsoft.apps.listener.AppListener; +import com.actionsoft.apps.resource.AppContext; +import com.actionsoft.apps.resource.plugin.profile.DCPluginProfile; +import com.actionsoft.bpms.commons.login.constant.LoginConst; +import com.actionsoft.bpms.commons.mvc.view.ResponseObject; +import com.actionsoft.bpms.commons.session.SessionImpl; +import com.actionsoft.bpms.org.model.UserModel; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.bpms.server.fs.DCContext; +import com.actionsoft.bpms.server.fs.dc.DCProfileManager; +import com.actionsoft.bpms.util.UUIDGener; +import com.actionsoft.sdk.local.SDK; +import com.actionsoft.sdk.local.api.AppAPI; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.lang.StringUtils; + +import java.io.File; +import java.io.IOException; +import java.sql.Timestamp; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * @Description 启动后事件 + * @Created by sunlh + * @Date 2021-03-16 + */ +public class StartListener implements AppListener { + @Override + public void after(AppContext appContext) { + // 同事圈&流程团队数据自动转换 + new upgradeTeamworkData().autoUpgradeRun(); + } + + /** + * 流程团队数据自动升级 + */ + class upgradeTeamworkData { + private String sid = new SessionImpl().registerSession(LoginConst.SYSTEM_COE, "admin", "0:0:0:0:0:0:0:1", "cn", "pc", true, null).getSessionId(); + private UserContext uc = UserContext.fromSessionId(sid); + private Timestamp time = new Timestamp(System.currentTimeMillis()); + + /** + * 同事圈&流程团队数据自动转换为PAL小组数据 + */ + private void autoUpgradeRun() { + boolean isActive = AppsAPIManager.getInstance().isActive("com.actionsoft.apps.network"); + if (!isActive) { + return; + } + List list = new TeamPerm().query().list(); + if (list == null || list.size() == 0) { + return; + } + + File logFile = createTeamworkUpgradeLogFile();// 创建日志文件 + LogUtil.appendLog("[开始]PAL流程团队 小组-成员-权限 数据自动更新至 PAL小组 " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()), logFile); + LogUtil.appendLog("-------------------------------------------------------------------------------", logFile); + CoeCooperationAPIManager api = CoeCooperationAPIManager.getInstance(); + List wsList = CoeWorkSpaceDaoFactory.createCoeWorkSpace().getCoeWorkSpaceModelRecodesNoPage(); // 所有资产库条数 + // 查询所有工作网络 + Map networkMap = queryAllNetwork(); + for (CoeWorkSpaceModel ws : wsList) { + String wsId = ws.getUUId(); + // 获取设置了权限的小组 + List teamPermModelList = TeamPermCache.getTeamListByWsId(wsId); + if (teamPermModelList != null && teamPermModelList.size() > 0) { + teamPermModelList.sort((t1, t2) -> {return t1.getTeamId().compareTo(t2.getTeamId());}); + List teamIds = new ArrayList<>(); + for (TeamPermModel teamPerm : teamPermModelList) { + if (!teamIds.contains(teamPerm.getTeamId())) { + teamIds.add(teamPerm.getTeamId()); + } + } + for (String teamId : teamIds) { + // 获取同事圈该小组 + JSONObject team = queryTeamById(teamId); + String teamName = team.getString("teamName"); + if (teamName.length() > 36) { + teamName = teamName.substring(0, 36); + } + String teamDesc = team.getString("teamDesc"); + if (teamDesc.length() > 255) { + teamDesc = teamDesc.substring(0, 255); + } + // 创建小组 + CoeCooperationTeamModel newTeam = new CoeCooperationTeamModel(teamId, wsId, networkMap.get(team.getString("networkId")), teamName, null, teamDesc, CoeCooperationConst.TEAM_STATUS_RUN, uc.getUID(), time, uc.getUID(), time); + api.createCooperationTeam(newTeam);// to db + // 记录日志 + LogUtil.appendLog("[成功][创建小组][" + newTeam.getTeamName() + "]", logFile); + // 获取小组数据权限 + Set teamPermVerIds = new HashSet<>();// 小组数据权限 + List palNames = new ArrayList<>(); + List teamPermList = TeamPermCache.getPALListOfTeam(teamId); + if (teamPermList != null && teamPermList.size() > 0) { + for (TeamPermModel model : teamPermList) { + List palList = PALRepositoryCache.getByVersionId(model.getResourceId()); + // 筛选有效的PAL模型 + if (palList != null && palList.size() > 0) { + teamPermVerIds.add(model.getResourceId()); + palNames.add(palList.get(0).getName()); + } + } + } + // 小组权限 + List newTeamPermList = new ArrayList<>(); + for (String verId : teamPermVerIds) { + CoeCooperationTeamPermModel teamPerm = new CoeCooperationTeamPermModel(UUIDGener.getUUID(), teamId, verId); + newTeamPermList.add(teamPerm); + } + if (newTeamPermList.size() > 0) { + api.createCooperationTeamPerms(newTeamPermList);// to db + LogUtil.appendLog("[成功][创建小组模型数据权限][" + StringUtils.join(palNames, ",") + "]", logFile); + } + // 小组角色 + // 创建默认角色 + api.createCooperationDefaultRole(teamId, uc.getUID()); + LogUtil.appendLog("[成功][创建小组默认角色列表][管理员、设计人员、浏览人员]", logFile); + // 查询管理员角色 + CoeCooperationRoleModel manageRole = api.queryCooperationManageRole(teamId); + if (manageRole == null) { + continue; + } + String manageRoleId = manageRole.getId(); + // 每个小组成员创建一个角色(管理员除外) + List newRoleList = new ArrayList<>(); + List newRoleNameList = new ArrayList<>(); + List newRolePermList = new ArrayList<>(); + Map> newRolePermNameMap = new HashMap<>(); + List newMemberList = new ArrayList<>(); + List newMemberNameList = new ArrayList<>(); + JSONArray members = queryTeamMember(teamId);// 获取小组成员 + for (int i = 0; i < members.size(); i++) { + JSONObject member = members.getJSONObject(i); + String userId = member.getString("userId"); + boolean isManage = member.getBooleanValue("isManage"); + if (isManage) {// 管理员直接使用管理员角色 + // 创建成员 + CoeCooperationMemberModel newMember = new CoeCooperationMemberModel(UUIDGener.getUUID(), teamId, userId, manageRoleId, uc.getUID(), time, uc.getUID(), time); + newMemberList.add(newMember); + newMemberNameList.add(userId); + } else { + // 查询权限 + TeamMemberPermModel permModel = TeamMemberPermCache.getByTeamAndUser(teamId, userId); + if (permModel == null) { + continue; + } + String actionType = permModel.getActionType(); + String appPerm = queryRoleAppPerm(actionType); + String actionPerm = queryRoleActionPerm(actionType); + // 创建角色 + String newRoleId = UUIDGener.getUUID(); + UserModel user = SDK.getORGAPI().getUser(userId); + String roleName = (user == null ? userId : user.getUserName()) + "(角色)"; + String roleDesc = "系统根据[流程团队]小组成员权限自动创建的角色"; + CoeCooperationRoleModel newRoleModel = new CoeCooperationRoleModel(newRoleId, teamId, roleName, roleDesc, CoeCooperationConst.ROLE_TYPE_CUSTOM, appPerm, actionPerm, null, uc.getUID(), time, uc.getUID(), time); + newRoleList.add(newRoleModel); + newRoleNameList.add(newRoleModel.getRoleName()); + // 创建角色数据权限 + Set rolePermVerIds = queryRoleDataPerm(teamPermVerIds, permModel.getTeamMemberPermExtendModel()); + newRolePermNameMap.put(roleName + "[" + userId + "]", new ArrayList<>()); + for (String verId : rolePermVerIds) { + CoeCooperationRolePermModel rolePerm = new CoeCooperationRolePermModel(UUIDGener.getUUID(), teamId, newRoleId, verId); + newRolePermList.add(rolePerm); + newRolePermNameMap.get(roleName + "[" + userId + "]").add(PALRepositoryCache.getByVersionId(rolePerm.getPalVersionId()).get(0).getName()); + } + CoeCooperationMemberModel newMember = new CoeCooperationMemberModel(UUIDGener.getUUID(), teamId, userId, newRoleId, uc.getUID(), time, uc.getUID(), time); + newMemberList.add(newMember); + newMemberNameList.add(userId); + } + } + if (newRoleList.size() > 0) { + api.createCooperationRoles(newRoleList);// to db + LogUtil.appendLog("[成功][创建角色列表][" + StringUtils.join(newRoleNameList, ",") + "]", logFile); + } + if (newMemberList.size() > 0) { + api.createCooperationMemebers(newMemberList);// to db + LogUtil.appendLog("[成功][创建小组成员][" + StringUtils.join(newMemberNameList, ",") + "]", logFile); + } + if (newRolePermList.size() > 0) { + api.createCooperationRolePerms(newRolePermList);// to db + LogUtil.appendLog("[成功][创建角色模型数据权限][" + JSON.toJSON(newRolePermNameMap) + "]", logFile); + } + LogUtil.appendLog("-------------------------------------------------------------------------------", logFile); + } + } + } + LogUtil.appendLog("[完成]PAL流程团队 小组-成员-权限 数据自动更新至 PAL小组 " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()), logFile); + // 清空现有流程团队相关数据(不包括同事圈) + LogUtil.appendLog("[开始][删除]PAL流程团队 小组-成员-权限 相关数据(不包括同事圈所有内容)", logFile); + TeamPermAPIManager.getInstance().removeAllPerms(); + LogUtil.appendLog("[完成][删除]PAL流程团队 小组-成员-权限 相关数据(不包括同事圈所有内容)", logFile); + + LogUtil.appendLog("[结束]PAL流程团队数据自动处理完成", logFile); + LogUtil.appendLog("---end---", logFile); + } + + /** + * 获取角色应用权限 + * @param actionType + * @return + */ + private String queryRoleAppPerm(String actionType) { + List appPerm = new ArrayList<>(); + // 流程发布 + if (actionType.contains("p")) { + appPerm.add("com.actionsoft.apps.coe.pal.publisher"); + } + // 报告生成器 + if (actionType.contains("报告生成器")) { + appPerm.add("com.actionsoft.apps.coe.pal.output"); + } + // 关联查询 + if (actionType.contains("关联查询")) { + appPerm.add("com.actionsoft.apps.coe.pal.relationsearch"); + } + // 回收站 + if (actionType.contains("回收站")) { + appPerm.add("recycle"); + } + // ProcessOn + if (actionType.contains("ProcessOn")) { + appPerm.add("com.actionsoft.apps.coe.pal.processon"); + } + // VOC-CTQ + if (actionType.contains("VOC-CTQ")) { + appPerm.add("com.actionsoft.apps.coe.pal.voc.ctq"); + } + return StringUtils.join(appPerm, ","); + } + + /** + * 获取角色操作权限 + * @param actionType + * @return + */ + private String queryRoleActionPerm(String actionType) { + List actionPerm = new ArrayList<>(); + // 新增、修改权限 + if (actionType.contains(CoeCooperationConst.ACTION_WRITE)) { + actionPerm.add(CoeCooperationConst.ACTION_WRITE); + } + // 删除权限 + if (actionType.contains(CoeCooperationConst.ACTION_DELETE)) { + actionPerm.add(CoeCooperationConst.ACTION_DELETE); + } + // 版本管理权限 + if (actionType.contains(CoeCooperationConst.ACTION_VERSION)) { + actionPerm.add(CoeCooperationConst.ACTION_VERSION); + } + return StringUtils.join(actionPerm, ","); + } + + /** + * 获取角色数据权限 + * @param teamPermVerIds + * @param extendModelList + * @return + */ + private Set queryRoleDataPerm(Set teamPermVerIds, List extendModelList) { + Set rolePermVerIds = new HashSet<>();// 角色数据权限 + if (extendModelList != null && extendModelList.size() > 0) { + for (TeamMemberPermExtendModel extend : extendModelList) { + // 必须在小组权限内 + if (teamPermVerIds.contains(extend.getResourceId())) { + rolePermVerIds.add(extend.getResourceId()); + } + } + } + return rolePermVerIds; + } + + /** + * 查询小组成员 + * @param teamId + */ + private JSONArray queryTeamMember(String teamId) { + JSONArray result = new JSONArray(); + // 调用App + String sourceAppId = CoeCooperationConst.COOPERATION_ID; + // aslp服务地址 + String aslp = "aslp://com.actionsoft.apps.network/queryTeamMemberByTeamId"; + // 参数定义列表 + Map params = new HashMap(); + params.put("sid", sid); + //小组ID,必填 + params.put("teamId", teamId); + AppAPI appAPI = SDK.getAppAPI(); + //查询某个小组的成员列表 + ResponseObject ro = appAPI.callASLP(appAPI.getAppContext(sourceAppId), aslp, params); + if (ro.isOk()) { + Map map = (Map) ro.getData(); + JSONArray teamMembers = (JSONArray) map.get("teamMembers"); + for (int i = 0; i < teamMembers.size(); i++) { + JSONObject member = teamMembers.getJSONObject(i); + JSONObject obj = new JSONObject(); + obj.put("userId", member.getString("userId")); + obj.put("createUser", member.getString("createUserId")); + obj.put("createTime", member.getString("createTime")); + obj.put("isManage", "1".equals(member.getString("memberType"))); + result.add(obj); + } + } + return result; + } + + /** + * 查询小组 + * @param teamId + * @return + */ + private JSONObject queryTeamById(String teamId) { + // 调用App + String sourceAppId = CoeCooperationConst.COOPERATION_ID; + // aslp服务地址 + String aslp = "aslp://com.actionsoft.apps.network/queryTeamById"; + // 参数定义列表 + Map params = new HashMap(); + //小组ID,必填 + params.put("teamId", teamId); + params.put("sid", sid); + AppAPI appAPI = SDK.getAppAPI(); + //查询小组信息 + ResponseObject ro = appAPI.callASLP(appAPI.getAppContext(sourceAppId), aslp, params); + // 小组名称,小组简介,分类,logo + if (ro.isOk()) { + // 获取小组工作网络 + Map map = (Map) ro.getData(); + JSONObject team = (JSONObject) map.get("team"); + return team; + } + return new JSONObject(); + } + + /** + * 查询所有工作网络 + * @return + */ + private Map queryAllNetwork() { + Map result = new HashMap<>(); + // 调用App + String sourceAppId = CoeCooperationConst.COOPERATION_ID; + // aslp服务地址 + String aslp = "aslp://com.actionsoft.apps.network/queryAllNetwork"; + // 参数定义列表 + Map params = new HashMap(); + params.put("sid", sid); + AppAPI appAPI = SDK.getAppAPI(); + //查询所有工作网络列表 + ResponseObject ro = appAPI.callASLP(appAPI.getAppContext(sourceAppId), aslp, params); + if (ro.isOk()) { + JSONArray arr = (JSONArray)((Map)ro.getData()).get("networks"); + for (int i = 0; i < arr.size(); i++) { + JSONObject network = arr.getJSONObject(i); + result.put(network.getString("id"), network.getString("networkName")); + } + } + return result; + } + + /** + * 创建流程团队数据权限自动升级日志 + * @return + */ + private File createTeamworkUpgradeLogFile() { + // 创建dc目录 + DCPluginProfile dcProfile = DCProfileManager.getDCProfile(Constant.APP_ID, Constant.TEAMWORK_UPGRADE_LOG); + DCContext dc = new DCContext(uc, dcProfile, Constant.APP_ID, "logs", "upgrade"); + String dirPath = dc.getPath(); + File dir = new File(dirPath); + dir.mkdirs(); + File logFile = new File(dirPath, "upgrade.log"); + try { + logFile.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + } + return logFile; + } + } + + @Override + public boolean before(AppContext appContext) { + return true; + } +} diff --git a/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/plugins/UninstallListener.java b/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/plugins/UninstallListener.java new file mode 100644 index 00000000..811016c5 --- /dev/null +++ b/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/plugins/UninstallListener.java @@ -0,0 +1,23 @@ +package com.actionsoft.apps.coe.pal.cooperation.plugins; + +import com.actionsoft.apps.coe.pal.cooperation.CoeCooperationAPIManager; +import com.actionsoft.apps.listener.AppListener; +import com.actionsoft.apps.resource.AppContext; + +/** + * @Description 卸载后事件 + * @Created by sunlh + * @Date 2020-12-29 + */ +public class UninstallListener implements AppListener { + @Override + public void after(AppContext appContext) { + // 卸载时删除所有小组数据 + CoeCooperationAPIManager.getInstance().removeAllCooperation(); + } + + @Override + public boolean before(AppContext appContext) { + return true; + } +} diff --git a/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/util/CooperationUtil.java b/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/util/CooperationUtil.java new file mode 100644 index 00000000..b030f10d --- /dev/null +++ b/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/util/CooperationUtil.java @@ -0,0 +1,177 @@ +package com.actionsoft.apps.coe.pal.cooperation.util; + +import com.actionsoft.apps.coe.pal.constant.CoEConstant; +import com.actionsoft.apps.coe.pal.cooperation.CoeCooperationAPIManager; +import com.actionsoft.apps.coe.pal.pal.method.PALMethodManager; +import com.actionsoft.apps.coe.pal.pal.method.cache.PALMethodCache; +import com.actionsoft.apps.coe.pal.pal.method.model.PALMethodModel; +import com.actionsoft.apps.coe.pal.pal.repository.cache.PALRepositoryCache; +import com.actionsoft.apps.coe.pal.pal.repository.model.PALRepositoryModel; +import com.actionsoft.bpms.util.UtilString; +import com.actionsoft.i18n.I18nRes; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +import java.util.*; + +public class CooperationUtil { + /** + * 统计个人权限下的模型文件的建模大类和建模方法分类 + * 不作为个人是否有某建模方法判断依据,仅根据已有数据进行统计 + * @param wsId + * @param teamId + */ + public static List getRepositoryCategoryAndMethods(String wsId, String teamId) { + List result = new ArrayList<>(); + List palMethodCategoryList = PALMethodCache.getPALMethodList(true);// 获取建模标准大类 + Set categorys = new HashSet<>(); + Set methods = new HashSet<>(); + if (UtilString.isNotEmpty(teamId)) { + Set versionIds = getPermRepositoryVersionIds(wsId, teamId, null, null); + for (String versionId : versionIds) { + List list = PALRepositoryCache.getByVersionId(versionId); + if (list != null && list.size() > 0) { + PALRepositoryModel model = list.get(0); + categorys.add(model.getMethodCategory()); + methods.add(model.getMethodId()); + } + } + } else { + methods.add("default");// 文件夹分类 + } + for (String category : palMethodCategoryList) { + if (UtilString.isNotEmpty(teamId) && !categorys.contains(category)) { + continue; + } + JSONObject categoryObj = new JSONObject(); + String name = I18nRes.findValue(CoEConstant.APP_ID, category); + categoryObj.put("category", category); + categoryObj.put("id", category); + categoryObj.put("name", name); + categoryObj.put("method", new JSONArray()); + if ("process".equals(category) && methods.contains("default")) {// 文件夹特殊分类特殊处理 + JSONObject methodObj = new JSONObject(); + methodObj.put("app", CoEConstant.APP_ID); + methodObj.put("category", category); + methodObj.put("categoryName", I18nRes.findValue(CoEConstant.APP_ID, category)); + methodObj.put("method", "default"); + methodObj.put("id", "default"); + methodObj.put("name", "文件夹"); + JSONObject icon = PALMethodManager.getInstance().getPALMethodIconById("default"); + methodObj.put("icon", icon); + categoryObj.getJSONArray("method").add(methodObj); + } + List list = PALMethodCache.getPALMethodModelListByMethod(category);// 建模分类 + for (PALMethodModel model : list) { + if (UtilString.isNotEmpty(teamId) && !methods.contains(model.getId())) { + continue; + } + JSONObject methodObj = new JSONObject(); + methodObj.put("app", model.getApp().getId()); + methodObj.put("category", category); + methodObj.put("categoryName", I18nRes.findValue(CoEConstant.APP_ID, category)); + methodObj.put("method", model.getId()); + methodObj.put("id", model.getId()); + methodObj.put("name", I18nRes.findValue(CoEConstant.APP_ID, model.getId())); + JSONObject icon = PALMethodManager.getInstance().getPALMethodIconById(model.getId()); + methodObj.put("icon", icon); + categoryObj.getJSONArray("method").add(methodObj); + } + result.add(categoryObj); + } + return result; + } + + /** + * 获取所有有权限的模型文件的versionId + * @param wsId 资产库Id + * @param teamId 小组Id + * @param category 建模方法大类,可为null + * @param method 模型分类,可为null + * @return + */ + public static Set getPermRepositoryVersionIds(String wsId, String teamId, String category, String method) { + Set result = new HashSet<>(); + Iterator iterator = PALRepositoryCache.getByWsId(wsId); + while (iterator.hasNext()) { + PALRepositoryModel model = iterator.next(); + if (!result.contains(model.getVersionId())) { + if (UtilString.isNotEmpty(method)) {// 先判断建模分类(小)是否符合 + if (model.getMethodId().equals(method)) { + result.add(model.getVersionId()); + } + } else if (UtilString.isNotEmpty(category)){// 再判断建模分类(大)是否符合 + if (model.getMethodCategory().equals(category)) { + result.add(model.getVersionId()); + } + } else { + result.add(model.getVersionId()); + } + } + } + // 小组数据权限范围+该角色(当前用户所属角色)下的数据权限交集 + if (!UtilString.isEmpty(teamId)) { + List permVerList = CoeCooperationAPIManager.getInstance().queryCooperationTeamPermVerIds(teamId); + Set versionIds = new HashSet<>(); + if (result.size() > 0) { + for (String verId : result) { + if (permVerList.contains(verId)) { + versionIds.add(verId); + } + } + } + result = versionIds; + } + return result; + } + + /** + * 获取所有有权限的使用中的模型文件 + * @param wsId 资产库Id + * @param teamId 小组Id + * @param category 建模方法大类,可为null + * @param method 模型分类,可为null + * @return + */ + public static List getPermRepositoryList(String wsId, String teamId, String category, String method, boolean isUse, boolean isPublish) { + List result = new ArrayList<>(); + Set versionIds = getPermRepositoryVersionIds(wsId, teamId, category, method); + for (String versionId : versionIds) { + List list = PALRepositoryCache.getByVersionId(versionId); + if (list != null) { + for (PALRepositoryModel model : list) { + if ((isUse && model.isUse()) || (isPublish && model.isPublish())) { + result.add(model); + } + } + } + } + return result; + } + + /** + * 排序 + * @param list + */ + public static void sortByLevelAndOrderIndex(List list) { + Collections.sort(list, new Comparator1()); + } + + /** + * 根据级别排序 + */ + private static class Comparator1 implements Comparator { + @Override + public int compare(PALRepositoryModel model1, PALRepositoryModel model2) { + Integer level1 = model1.getLevel(); + Integer level2 = model2.getLevel(); + int result = level1.compareTo(level2); + if (result == 0) { + Integer index1 = model1.getOrderIndex(); + Integer index2 = model2.getOrderIndex(); + result = index1.compareTo(index2); + } + return result; + } + } +} diff --git a/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/util/LogUtil.java b/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/util/LogUtil.java new file mode 100644 index 00000000..7d0402e6 --- /dev/null +++ b/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/util/LogUtil.java @@ -0,0 +1,92 @@ +package com.actionsoft.apps.coe.pal.cooperation.util; + +import com.actionsoft.bpms.commons.log.auditing.constant.AuditConst; +import com.actionsoft.bpms.commons.security.logging.model.Level; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.sdk.local.SDK; + +import java.io.*; + +public class LogUtil { + + /** + * 追加日志内容 + * @param content 内容 + * @param file 文件 + */ + public static void appendLog(String content, File file) { + try { + String logFilePath = file.getPath(); + // 构造函数中的第二个参数true表示以追加形式写文件 + FileOutputStream fos = new FileOutputStream(logFilePath, true); + OutputStreamWriter osw = new OutputStreamWriter(fos, "utf-8"); + osw.write(content + "\n"); + osw.close(); + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + System.out.println("文件写入失败!" + e); + } + } + + public static void appendLog(String content, File ... files) { + for (File file : files) { + appendLog(content, file); + } + } + + public static String getStackTrace(Throwable t) { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + try { + t.printStackTrace(pw); + return sw.toString(); + } finally { + pw.close(); + } + } + + public static String getLogContent(File file) { + StringBuilder builder = new StringBuilder(); + InputStreamReader reader = null; + BufferedReader br = null; + try { + reader = new InputStreamReader(new FileInputStream(file), "UTF-8"); + br = new BufferedReader(reader); + String s; + while ((s = br.readLine()) != null) { + builder.append(s).append("\n"); + } + + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (reader != null) { + reader.close(); + } + if (br != null) { + br.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + return builder.toString(); + } + + /** + * 记录一条审计日志 + * @param me + * @param op + * @param obj + * @param info + * @param level + */ + public static void recordAuditLog(UserContext me, String op, String obj, String info, Level level) { + SDK.getLogAPI().audit(AuditConst.CHANNEL_CLIENT, AuditConst.CATALOG_PROCESS, me.getUID(), op, obj, info, me.getClientIP(), level); + } + +} diff --git a/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/web/CooperationWeb.java b/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/web/CooperationWeb.java new file mode 100644 index 00000000..c8dc253d --- /dev/null +++ b/com.actionsoft.apps.coe.pal.cooperation/src/com/actionsoft/apps/coe/pal/cooperation/web/CooperationWeb.java @@ -0,0 +1,1374 @@ +package com.actionsoft.apps.coe.pal.cooperation.web; + +import com.actionsoft.apps.coe.pal.constant.CoEConstant; +import com.actionsoft.apps.coe.pal.cooperation.CoeCooperationAPIManager; +import com.actionsoft.apps.coe.pal.cooperation.CooperationQueryAPIManager; +import com.actionsoft.apps.coe.pal.cooperation.constant.CoeCooperationConst; +import com.actionsoft.apps.coe.pal.cooperation.constant.Constant; +import com.actionsoft.apps.coe.pal.cooperation.dao.CoeCooperationMemberDao; +import com.actionsoft.apps.coe.pal.cooperation.dao.CoeCooperationRoleDao; +import com.actionsoft.apps.coe.pal.cooperation.dao.CoeCooperationTeamDao; +import com.actionsoft.apps.coe.pal.cooperation.dto.CooperationManageListTeamDetailDto; +import com.actionsoft.apps.coe.pal.cooperation.dto.CooperationManageListTeamMemberDto; +import com.actionsoft.apps.coe.pal.cooperation.dto.CooperationManageMainTeamDto; +import com.actionsoft.apps.coe.pal.cooperation.dto.CooperationRoleDto; +import com.actionsoft.apps.coe.pal.cooperation.extend.CooperationAppManager; +import com.actionsoft.apps.coe.pal.cooperation.extend.CooperationAppProfile; +import com.actionsoft.apps.coe.pal.cooperation.model.*; +import com.actionsoft.apps.coe.pal.cooperation.util.CooperationUtil; +import com.actionsoft.apps.coe.pal.log.CoEOpLogAPI; +import com.actionsoft.apps.coe.pal.log.CoEOpLogConst; +import com.actionsoft.apps.coe.pal.pal.repository.PALRepositoryQueryAPIManager; +import com.actionsoft.apps.coe.pal.pal.repository.cache.PALRepositoryCache; +import com.actionsoft.apps.coe.pal.pal.repository.dao.PALRepository; +import com.actionsoft.apps.coe.pal.pal.repository.model.PALRepositoryModel; +import com.actionsoft.apps.coe.pal.pal.repository.util.CoeProcessLevelUtil; +import com.actionsoft.apps.coe.pal.pal.ws.dao.CoeWorkSpace; +import com.actionsoft.apps.coe.pal.pal.ws.dao.CoeWorkSpaceDaoFactory; +import com.actionsoft.apps.coe.pal.pal.ws.model.CoeWorkSpaceModel; +import com.actionsoft.apps.coe.pal.pal.ws.web.CoeWorkSpaceWeb; +import com.actionsoft.apps.coe.pal.team.user.dao.CoeUser; +import com.actionsoft.apps.coe.pal.team.user.model.CoeUserModel; +import com.actionsoft.apps.coe.pal.util.HighSecurityUtil; +import com.actionsoft.bpms.commons.htmlframework.HtmlPageTemplate; +import com.actionsoft.bpms.commons.mvc.view.ActionWeb; +import com.actionsoft.bpms.commons.mvc.view.ResponseObject; +import com.actionsoft.bpms.org.cache.DepartmentCache; +import com.actionsoft.bpms.org.cache.RoleCache; +import com.actionsoft.bpms.org.model.CompanyModel; +import com.actionsoft.bpms.org.model.DepartmentModel; +import com.actionsoft.bpms.org.model.RoleModel; +import com.actionsoft.bpms.org.model.UserModel; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.bpms.util.UUIDGener; +import com.actionsoft.bpms.util.UtilDate; +import com.actionsoft.bpms.util.UtilString; +import com.actionsoft.exception.AWSDataAccessException; +import com.actionsoft.exception.AWSException; +import com.actionsoft.sdk.local.SDK; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.lang.StringUtils; + +import java.sql.Timestamp; +import java.util.*; + +/** + * @Created by sunlh + * @Date 2020-12-01 + */ +public class CooperationWeb extends ActionWeb { + + UserContext _uc; + + public CooperationWeb(UserContext userContext) { + super(userContext); + _uc = userContext; + } + + /** + * 主页 + * @param mainPage + * @return + */ + public String mainPage(String mainPage) { + Map macroLibraries = new HashMap(); + CoeUser userDao = new CoeUser(); + boolean isManage = false; + if ("admin".equals(_uc.getUID())) { + isManage = true; + } else { + isManage = userDao.isCoEManager(_uc.getUID()); + } + macroLibraries.put("isManage", isManage); + macroLibraries.put("mainPage", mainPage); + macroLibraries.put("sessionId", _uc.getSessionId()); + macroLibraries.put("settingParam", JSON.toJSON(macroLibraries)); + return HtmlPageTemplate.merge(Constant.APP_ID, "main.htm", macroLibraries); + } + + /** + * 查询新增、更新小组必要数据 + * @param teamId + * @return + */ + public String queryTeamCreateOrUpdateData(String teamId) { + ResponseObject ro = ResponseObject.newOkResponse(); + // 1.数据定义 + // 基础数据 + String teamName = ""; + String category = ""; + String teamDesc = ""; + JSONObject teamLogo = new JSONObject(); + JSONArray categoryArr = new JSONArray();// 分类数据 + + // 管理员数据 + List admins = new ArrayList<>();// 已经设置的管理员 + // 权限数据 + String wsId = ""; + JSONArray wsArr = new JSONArray();// 资产库列表 + JSONArray repositorys = new JSONArray();// 已选中资产库模型数据(versionId) + + // 2.获取新建、修改共有数据 + // 获取分类 + List categoryList = CoeCooperationAPIManager.getInstance().queryCooperationCategoryList(); + if (categoryList != null) { + for (String c : categoryList) { + JSONObject jo = new JSONObject(); + jo.put("label", c); + jo.put("value", c); + categoryArr.add(jo); + } + } + // 获取有权限的资产库列表 + CoeWorkSpaceWeb wsWeb = new CoeWorkSpaceWeb(_uc); + List wsList = wsWeb.getActiveCoeWorkSpaceData(); + for (CoeWorkSpaceModel model : wsList) { + JSONObject obj = new JSONObject(); + obj.put("label", model.getWsName()); + obj.put("value", model.getUUId()); + wsArr.add(obj); + } + // 3.根据新建、修改获取相应的数据 + if (UtilString.isEmpty(teamId)) { + // 新建 + teamLogo.put("code", "");// 群组icon + teamLogo.put("color", "#009688"); + // 默认选择地一个资产库 + if (wsArr.size() > 0) { + wsId = wsArr.getJSONObject(0).getString("value"); + } + } else { + // 更新 + CoeCooperationTeamModel model = CoeCooperationAPIManager.getInstance().queryCooperationTeamById(teamId); + teamName = model.getTeamName(); + category = model.getCategory(); + teamDesc = (model.getTeamDesc() == null ? "" : model.getTeamDesc()); + teamLogo = JSONObject.parseObject(model.getTeamLogo()); + wsId = model.getWsId(); + // 获取管理员用户 + admins = CoeCooperationAPIManager.getInstance().queryCooperationAdminUsers(teamId); + // 获取已设置的权限versionId + List verisonIds = CoeCooperationAPIManager.getInstance().queryCooperationTeamPermVerIds(teamId); + PALRepository PALRepositoryDao = new PALRepository(); + for (String versionId : verisonIds) { + List palRepositoryModelList = PALRepositoryDao.getRepositoryByVersionId(versionId); + if (palRepositoryModelList != null && palRepositoryModelList.size() > 0) { + repositorys.add(versionId); + } + } + } + ro.put("teamName", teamName); + ro.put("category", category); + ro.put("teamDesc", teamDesc); + ro.put("teamLogo", teamLogo); + ro.put("categoryArr", categoryArr); + ro.put("admins", admins); + ro.put("wsId", wsId); + ro.put("wsArr", wsArr); + ro.put("repositorys", repositorys); + return ro.toString(); + } + + /** + * 保存新建、修改的小组信息 + * @param data + * @return + */ + public String saveTeamCreateOrUpdateData(String data) { + JSONObject dataObj = JSONObject.parseObject(data); + // 基础信息 + String teamId = dataObj.getString("teamId"); + String teamName = dataObj.getString("teamName"); + String category = dataObj.getString("category"); + String teamDesc = dataObj.getString("teamDesc"); + String teamLogo = dataObj.getString("teamLogo"); + String wsId = dataObj.getString("wsId"); + if (UtilString.isEmpty(wsId)) { + return ResponseObject.newErrResponse("请先创建资产库再进行小组创建").toString(); + } + // 管理员信息 + JSONArray adminArr = dataObj.getJSONArray("admins"); + if (adminArr.size() == 0) { + adminArr.add(_uc.getUID()); + } + // 校验管理员是否全部都在pal用户中 + String illegalUsers = checkCoeUserValid(adminArr); + if (illegalUsers.length() > 0) { + return ResponseObject.newErrResponse("以下用户非PAL用户,请重新选择PAL用户进行保存[" + illegalUsers + "]").toString(); + } + // 小组权限信息 + JSONArray repositoryVerIds = dataObj.getJSONArray("repositorys"); + CoeCooperationAPIManager api = CoeCooperationAPIManager.getInstance(); + if (UtilString.isEmpty(teamId)) {// 新建 + Timestamp nowTime = new Timestamp(System.currentTimeMillis()); + teamId = UUIDGener.getUUID(); + boolean isOk = false; + String msg = ""; + // 创建小组信息 + CoeCooperationTeamModel team = new CoeCooperationTeamModel(teamId, wsId, category, teamName, teamLogo, teamDesc, CoeCooperationConst.TEAM_STATUS_RUN, _uc.getUID(), nowTime, _uc.getUID(), nowTime); + isOk = api.createCooperationTeam(team); + msg = "保存小组信息"; + if (isOk) { + // 创建默认角色信息 + isOk = api.createCooperationDefaultRole(teamId, _uc.getUID()); + msg = "创建默认角色信息"; + if (isOk) { + // 查询管理员角色ID + CoeCooperationRoleModel role = api.queryCooperationRoleByType(teamId, CoeCooperationConst.ROLE_TYPE_MANAGER).get(0); + // 创建管理员信息 + List members = new ArrayList<>(); + for (int i = 0; i < adminArr.size(); i++) { + CoeCooperationMemberModel member = new CoeCooperationMemberModel(UUIDGener.getUUID(), teamId, adminArr.getString(i), role.getId(), _uc.getUID(),nowTime, _uc.getUID(), nowTime); + members.add(member); + } + isOk = api.createCooperationMemebers(members); + msg = "保存小组管理员信息"; + if (isOk && repositoryVerIds.size() > 0) { + // 创建权限信息 + List perms = new ArrayList<>(); + for (int i = 0; i < repositoryVerIds.size(); i++) { + CoeCooperationTeamPermModel perm = new CoeCooperationTeamPermModel(UUIDGener.getUUID(), teamId, repositoryVerIds.getString(i)); + perms.add(perm); + } + isOk = api.createCooperationTeamPerms(perms); + msg = "保存小组数据权限信息"; + } + } + } + if (isOk) { + // 操作行为日志记录 + if (SDK.getAppAPI().getPropertyBooleanValue(CoEConstant.APP_ID, "IS_RECORD_OP_LOG", false)) { + CoEOpLogAPI.auditOkOp(_uc, CoEOpLogConst.MODULE_CATEGORY_COOPERATION, CoEOpLogConst.OP_CREATE, CoEOpLogConst.INFO_COOPERATION_CREATE); + } + return ResponseObject.newOkResponse().toString(); + } else { + return ResponseObject.newErrResponse(msg + ",保存失败").toString(); + } + } else {// 更新 + // 更新小组信息 + boolean isOk = api.updateCooperationTeam(teamId, teamName, category, teamDesc, teamLogo, wsId, _uc.getUID()); + String msg = "更新小组信息"; + if (isOk) { + // 删除该管理员角色下的所有成员 + api.removeCooperationMemebers(teamId, CoeCooperationConst.ROLE_TYPE_MANAGER); + // 查询管理员角色ID + CoeCooperationRoleModel role = api.queryCooperationRoleByType(teamId, CoeCooperationConst.ROLE_TYPE_MANAGER).get(0); + // 创建管理员信息 + List members = new ArrayList<>(); + for (int i = 0; i < adminArr.size(); i++) { + String userId = adminArr.getString(i); + // 删除该用户(若存在) + api.removeCooperationMemeber(teamId, userId); + CoeCooperationMemberModel member = new CoeCooperationMemberModel(UUIDGener.getUUID(), teamId, userId, role.getId(), _uc.getUID(),null, _uc.getUID(), null); + members.add(member); + } + isOk = api.createCooperationMemebers(members); + msg = "更新小组管理员信息"; + if (isOk) { + api.removeCooperationTeamPerms(teamId); + if (repositoryVerIds.size() > 0) { + // 创建权限信息 + List perms = new ArrayList<>(); + for (int i = 0; i < repositoryVerIds.size(); i++) { + CoeCooperationTeamPermModel perm = new CoeCooperationTeamPermModel(UUIDGener.getUUID(), teamId, repositoryVerIds.getString(i)); + perms.add(perm); + } + isOk = api.createCooperationTeamPerms(perms); + msg = "更新小组数据权限信息"; + } + } + + } + // 更新数据权限信息 + if (isOk) { + // 操作行为日志记录 + if (SDK.getAppAPI().getPropertyBooleanValue(CoEConstant.APP_ID, "IS_RECORD_OP_LOG", false)) { + CoEOpLogAPI.auditOkOp(_uc, CoEOpLogConst.MODULE_CATEGORY_COOPERATION, CoEOpLogConst.OP_UPDATE, CoEOpLogConst.INFO_COOPERATION_UPDATE); + } + return ResponseObject.newOkResponse().toString(); + } else { + return ResponseObject.newErrResponse(msg + ",更新失败").toString(); + } + } + } + + /** + * 查询用户是否在PAL用户中 + * @param adminArr + * @return + */ + private String checkCoeUserValid(JSONArray adminArr) { + if (adminArr == null || adminArr.size() == 0) { + return ""; + } + List userList = CoeWorkSpaceDaoFactory.createCoeWorkSpace().getCoeUserMainRecodes(0, 0); + Set userIds = new HashSet<>(); + for (CoeUserModel user : userList) { + userIds.add(user.getUserId()); + } + List result = new ArrayList<>(); + for (int i = 0; i < adminArr.size(); i++) { + if (!userIds.contains(adminArr.getString(i))) { + UserModel user = SDK.getORGAPI().getUser(adminArr.getString(i)); + if (user != null) { + result.add(user.getUserName()); + } + } + } + return StringUtils.join(result, ","); + } + + /** + * 查询当前用户拥有管理权限的小组 + * 管理权限:1.是小组管理员,2.是该小组所关联的资产库的管理员或admin,3.资产库启用中 + * @return + */ + public String queryManageTeamInfoList() { + ResponseObject ro = ResponseObject.newOkResponse(); + //查询启用中并且是管理员的资产库 + CoeWorkSpaceWeb wsWeb = new CoeWorkSpaceWeb(_uc); + List wsList = wsWeb.getActiveCoeWorkSpaceData(); + JSONArray result = new JSONArray(); + CoeCooperationTeamDao teamDao = new CoeCooperationTeamDao(); + CoeCooperationMemberDao memberDao = new CoeCooperationMemberDao(); + for (CoeWorkSpaceModel wsModel : wsList) { + List teamList = teamDao.getListByWsId(wsModel.getUUId()); + for (CoeCooperationTeamModel team : teamList) { + if (PALRepositoryQueryAPIManager.getInstance().isActiveWorkSpace(team.getWsId())) {// 资产库启用中 + String teamId = team.getId(); + // 获取小组的管理员 + List memberList = memberDao.getManageUserList(teamId); + // 整合平台用户信息(过滤掉关闭的账户) + Map userMap = getTeamManageMemberList(memberList); + if ("admin".equals(_uc.getUID()) || userMap.containsKey(_uc.getUID())) { + JSONObject obj = new JSONObject(); + obj.put("teamId", teamId); + obj.put("teamName", team.getTeamName()); + obj.put("teamDesc", team.getTeamDesc()); + obj.put("teamLogo", JSONObject.parseObject(team.getTeamLogo())); + obj.put("wsId", team.getWsId()); + obj.put("wsName", wsModel.getWsName()); + obj.put("admin", mergeUser(userMap)); + obj.put("isRun", CoeCooperationConst.TEAM_STATUS_RUN == team.getTeamStatus()); + obj.put("createTime", UtilDate.dateFormat(team.getCreateTime())); + obj.put("permStatus", CoeCooperationAPIManager.getInstance().queryCooperationTeamPermVerIds(teamId).size()); + result.add(obj); + } + } + } + } + ro.setData(result); + return ro.toString(); + } + + /** + * 转换用户信息 + * @param memberList + * @return + */ + private Map getTeamManageMemberList(List memberList) { + Map result = new HashMap<>(); + for (CoeCooperationMemberModel member: memberList) { + UserModel userModel = SDK.getORGAPI().getUser(member.getUserId()); + if (userModel != null && !userModel.isClosed()) { + result.put(userModel.getUID(),userModel); + } + } + return result; + } + + /** + * 整合用户数据 + * @param map + * @return + */ + private String mergeUser(Map map) { + List result = new ArrayList<>(); + List list = new ArrayList<>(); + for (Map.Entry entry: map.entrySet()) { + list.add(entry.getValue()); + } + list.sort((u1, u2)->{return u2.getUserName().compareTo(u1.getUserName());}); + for (UserModel user : list) { + result.add(user.getUserName()); + } + return StringUtils.join(result, "、"); + } + + /** + * 查询个人加入的所有小组 + * @return + */ + public String queryJoinedTeamList() { + ResponseObject ro = ResponseObject.newOkResponse(); + CoeCooperationAPIManager api = CoeCooperationAPIManager.getInstance(); + // 已加入小组(不限制小组状态,但是是启用中的资产库,停用中的资产库不可见) + List list = api.queryJoindTeamList(_uc.getUID(), false, true); + // 按照个人自定义顺序排序 + String sortTeam = SDK.getPortalAPI().getUserProfileItem(Constant.APP_ID, _uc.getUID(), Constant.SORT_KEY, Constant.SORT_TEAM_NAME); + if (UtilString.isNotEmpty(sortTeam)) { + list.sort((c1, c2) -> { + int index1 = sortTeam.indexOf(c1.getId()); + int index2 = sortTeam.indexOf(c2.getId()); + if (index1 == index2) { + return 0; + } else if (index1 == -1) { + return 1; + } else if (index2 == -1) { + return -1; + } else { + return index1 - index2; + } + }); + } + List result = new ArrayList<>(); + for (CoeCooperationTeamModel model : list) { + if (PALRepositoryQueryAPIManager.getInstance().isActiveWorkSpace(model.getWsId())) { + boolean isTeamManage = api.isTeamManager(model.getId(), _uc.getUID());// 是否小组管理员 + CooperationManageMainTeamDto dto = new CooperationManageMainTeamDto(model.getId(), model.getTeamName(),JSONObject.parseObject(model.getTeamLogo()), model.getTeamStatus() == CoeCooperationConst.TEAM_STATUS_RUN, isTeamManage); + result.add(dto); + } + } + ro.setData(JSON.toJSON(result)); + return ro.toString(); + } + + /** + * 对小组进行排序 + * @param teamIds + * @return + */ + public String sortTeam(String teamIds) { + ResponseObject ro = ResponseObject.newOkResponse(); + SDK.getPortalAPI().setUserProfileItem(Constant.APP_ID, _uc.getUID(), Constant.SORT_KEY, Constant.SORT_TEAM_NAME, JSONArray.parseArray(teamIds).toJSONString()); + // 操作行为日志记录 + if (SDK.getAppAPI().getPropertyBooleanValue(CoEConstant.APP_ID, "IS_RECORD_OP_LOG", false)) { + CoEOpLogAPI.auditOkOp(_uc, CoEOpLogConst.MODULE_CATEGORY_COOPERATION, CoEOpLogConst.OP_UPDATE, CoEOpLogConst.INFO_COOPERATION_SORT_UPDATE); + } + return ro.toString(); + } + + /** + * 修改小组的基本信息 + * @param data + * @return + */ + public String updateTeamInfo(String data) { + ResponseObject ro = ResponseObject.newOkResponse(); + JSONObject dataObj = JSONObject.parseObject(data); + // 基础信息 + String teamId = dataObj.getString("teamId"); + String teamName = dataObj.getString("teamName"); + String category = dataObj.getString("category"); + String teamDesc = dataObj.getString("teamDesc"); + String teamLogo = dataObj.getString("teamLogo"); + CoeCooperationAPIManager api = CoeCooperationAPIManager.getInstance(); + CoeCooperationTeamModel team = api.queryCooperationTeamById(teamId); + // 更新小组信息 + boolean isOk = api.updateCooperationTeam(teamId, teamName, category, teamDesc, teamLogo, team.getWsId(), _uc.getUID()); + if (isOk) { + // 操作行为日志记录 + if (SDK.getAppAPI().getPropertyBooleanValue(CoEConstant.APP_ID, "IS_RECORD_OP_LOG", false)) { + CoEOpLogAPI.auditOkOp(_uc, CoEOpLogConst.MODULE_CATEGORY_COOPERATION, CoEOpLogConst.OP_UPDATE, CoEOpLogConst.INFO_COOPERATION_UPDATE); + } + ro.setData(dataObj); + return ro.toString(); + } else { + return ResponseObject.newErrResponse("保存失败").toString(); + } + } + + /** + * 修改小组状态,停用/启用 + * @param teamId + * @param status 0启用/1停用 + * @return + */ + public String updateTeamStatus(String teamId, int status) { + if (status != CoeCooperationConst.TEAM_STATUS_RUN && status != CoeCooperationConst.TEAM_STATUS_STOP) { + return ResponseObject.newErrResponse("保存失败,参数错误").toString(); + } + CoeCooperationAPIManager api = CoeCooperationAPIManager.getInstance(); + CoeCooperationTeamModel team = api.queryCooperationTeamById(teamId); + if (team == null) { + return ResponseObject.newErrResponse("保存失败,小组不存在").toString(); + } + boolean isOk = api.updateCooperationTeamStatus(teamId, status); + if (isOk) { + // 操作行为日志记录 + if (SDK.getAppAPI().getPropertyBooleanValue(CoEConstant.APP_ID, "IS_RECORD_OP_LOG", false)) { + CoEOpLogAPI.auditOkOp(_uc, CoEOpLogConst.MODULE_CATEGORY_COOPERATION, CoEOpLogConst.OP_UPDATE, CoEOpLogConst.INFO_COOPERATION_UPDATE); + } + return ResponseObject.newOkResponse().toString(); + } else { + return ResponseObject.newErrResponse("保存失败").toString(); + } + + } + + /** + * 解散小组 + * @param teamId + * @return + */ + public String removeTeam(String teamId) { + CoeCooperationAPIManager api = CoeCooperationAPIManager.getInstance(); + CoeCooperationTeamModel team = api.queryCooperationTeamById(teamId); + if (team == null) { + return ResponseObject.newErrResponse("保存失败,小组不存在").toString(); + } + if (!api.isTeamManager(teamId, _uc.getUID())) { + return ResponseObject.newErrResponse("无权限解散小组").toString(); + } + api.removeAllCooperationByTeamId(teamId); + // 操作行为日志记录 + if (SDK.getAppAPI().getPropertyBooleanValue(CoEConstant.APP_ID, "IS_RECORD_OP_LOG", false)) { + CoEOpLogAPI.auditOkOp(_uc, CoEOpLogConst.MODULE_CATEGORY_COOPERATION, CoEOpLogConst.OP_DELETE, CoEOpLogConst.INFO_COOPERATION_DELETE); + } + return ResponseObject.newOkResponse().toString(); + } + + /** + * 退出小组 + * @param teamId + * @return + */ + public String exitTeam(String teamId) { + CoeCooperationAPIManager api = CoeCooperationAPIManager.getInstance(); + CoeCooperationTeamModel team = api.queryCooperationTeamById(teamId); + if (team == null) { + return ResponseObject.newErrResponse("退出失败,小组不存在").toString(); + } + if (api.isTeamManager(teamId, _uc.getUID())) {// 管理员 + List managerUserList = api.queryCooperationAdminUsers(teamId); + if (managerUserList.size() == 1) {// 只有一个管理员,不允许退出 + return ResponseObject.newErrResponse("要求管理员用户不能少于一名,请指定其他用户为小组管理员之后再退出!").toString(); + } + } + // 退出 + api.removeCooperationMemeber(teamId, _uc.getUID()); + return ResponseObject.newOkResponse().toString(); + } + + /** + * 查询小组的详细信息,成员信息 + * @param teamId + * @return + */ + public String queryTeamDetail(String teamId) { + // 查询小组信息 + CoeCooperationAPIManager api = CoeCooperationAPIManager.getInstance(); + CoeCooperationTeamModel team = api.queryCooperationTeamById(teamId); + if (team == null) { + return ResponseObject.newErrResponse("查询失败,小组不存在").toString(); + } + CooperationManageListTeamDetailDto detailDto = new CooperationManageListTeamDetailDto(); + detailDto.setUserId(_uc.getUID()); + detailDto.setTeamId(team.getId()); + detailDto.setTeamName(team.getTeamName()); + detailDto.setTeamDesc(team.getTeamDesc()); + detailDto.setRun(CoeCooperationConst.TEAM_STATUS_RUN == team.getTeamStatus()); + detailDto.setTeamLogo(JSONObject.parseObject(team.getTeamLogo())) ; + detailDto.setTeamManager(api.isTeamManager(team.getId(), _uc.getUID())); + detailDto.setWsId(team.getWsId()); + detailDto.setWsName(new CoeWorkSpace().getInstance(team.getWsId()).getWsName()); + detailDto.setMembers(new ArrayList<>()); + + Map roleMap = new HashMap<>(); + + List members = api.queryCooperationTeamMemberList(teamId); + for (CoeCooperationMemberModel member : members) { + UserModel user = SDK.getORGAPI().getUser(member.getUserId()); + if (user != null) { + CooperationManageListTeamMemberDto dto = new CooperationManageListTeamMemberDto(); + dto.setUserName(user.getUserName()); + dto.setClose(user.isClosed()); + dto.setEmail(user.getEmail()); + dto.setDeptId(user.getDepartmentId()); + dto.setDeptName(SDK.getORGAPI().getDepartmentById(user.getDepartmentId()).getName()); + dto.setTeamId(teamId); + dto.setTeamName(team.getTeamName()); + dto.setUserId(member.getUserId()); + dto.setRoleId(member.getRoleId()); + CoeCooperationRoleModel role; + if (roleMap.containsKey(member.getRoleId())) { + role = roleMap.get(member.getRoleId()); + } else { + role = api.queryCooperationRoleByUser(teamId, member.getUserId()); + roleMap.put(role.getId(), role); + } + dto.setRoleName(role.getRoleName()); + dto.setRoleType(role.getRoleType()); + detailDto.getMembers().add(dto); + } + } + detailDto.getMembers().sort((c1, c2)-> { + int index = c1.getRoleType() - c2.getRoleType(); + if (index != 0) { + return index; + } + return c1.getUserName().compareTo(c2.getUserName()); + }); + ResponseObject ro = ResponseObject.newOkResponse(); + ro.setData(JSON.toJSON(detailDto)); + return ro.toString(); + } + + /** + * 查询小组角色 + * @param teamId + * @param userIds + * @return + */ + public String queryRoleData(String teamId, String userIds) { + CoeCooperationAPIManager api = CoeCooperationAPIManager.getInstance(); + CoeCooperationTeamModel team = api.queryCooperationTeamById(teamId); + if (team == null) { + return ResponseObject.newErrResponse("查询失败,小组不存在").toString(); + } + JSONArray roleIds = new JSONArray(); + JSONArray userArr = JSONArray.parseArray(userIds); + CoeCooperationMemberDao memberDao = new CoeCooperationMemberDao(); + for (int i = 0; i < userArr.size(); i++) { + CoeCooperationMemberModel memberModel = memberDao.getModelByTeamUser(teamId, userArr.getString(i)); + if (memberModel != null) { + roleIds.add(memberModel.getRoleId()); + } + } + List dtoList = new ArrayList<>(); + List list = api.queryCooperationRoleList(teamId); + for (CoeCooperationRoleModel role : list) { + CooperationRoleDto dto = new CooperationRoleDto(); + dto.setRoleId(role.getId()); + dto.setRoleName(role.getRoleName()); + dto.setRoleDesc(role.getRoleDesc()); + dto.setRoleType(role.getRoleType()); + dto.setIcon(role.getRoleType() == CoeCooperationConst.ROLE_TYPE_MANAGER ? + "" : role.getRoleType() == CoeCooperationConst.ROLE_TYPE_DESIGNER ? + "" : role.getRoleType() == CoeCooperationConst.ROLE_TYPE_VISITOR ? + "" : ""); + dtoList.add(dto); + } + ResponseObject ro = ResponseObject.newOkResponse(); + ro.put("roleData", JSON.toJSON(dtoList)); + ro.put("roleIds", roleIds); + return ro.toString(); + } + + /** + * 用户修改角色保存 + * @param data + * @return + */ + public String saveUserUpdateRole(String data) { + ResponseObject ro = ResponseObject.newOkResponse(); + JSONObject dataObj = JSONObject.parseObject(data); + // 基础信息 + String teamId = dataObj.getString("teamId"); + JSONArray userIds = dataObj.getJSONArray("userIds"); + String roleId = dataObj.getString("roleId"); + CoeCooperationAPIManager api = CoeCooperationAPIManager.getInstance(); + CoeCooperationTeamModel team = api.queryCooperationTeamById(teamId); + if (team == null) { + return ResponseObject.newErrResponse("保存失败,小组不存在").toString(); + } + // 查询当前设置的角色 + CoeCooperationRoleDao roleDao = new CoeCooperationRoleDao(); + CoeCooperationRoleModel role = roleDao.getInstance(roleId); + // 如果当前设置的角色不是管理员,查询其他用户是否有管理员角色,小组中必须有至少一位管理员用户 + if (role.getRoleType() != CoeCooperationConst.ROLE_TYPE_MANAGER) { + // 查询其他用户的角色是否有管理员 + boolean flag = false; + List adminUsers = api.queryCooperationAdminUsers(teamId); + for (String adminUser : adminUsers) { + if (!userIds.contains(adminUser)) { + flag = true; + break; + } + } + if (!flag) { + return ResponseObject.newErrResponse("不允许修改,小组中必须至少存在一位管理员用户").toString(); + } + } + for (int i = 0; i < userIds.size(); i++) { + api.updateCooperationUserRole(teamId, userIds.getString(i), roleId, _uc.getUID()); + } + return ro.toString(); + } + + /** + * 新增、修改角色信息时查询相关角色信息 + * @param teamId + * @param roleId + * @return + */ + public String queryRoleUpdateData(String teamId, String roleId) { + ResponseObject ro = ResponseObject.newOkResponse(); + CoeCooperationAPIManager api = CoeCooperationAPIManager.getInstance(); + CoeCooperationTeamModel team = api.queryCooperationTeamById(teamId); + if (team == null) { + return ResponseObject.newErrResponse("查询失败,小组不存在").toString(); + } + // 1.数据定义 + String wsId = team.getWsId();// 资产库Id + String roleName = "";// 角色名称 + String roleDesc = "";// 角色描述 + int roleType = CoeCooperationConst.ROLE_TYPE_CUSTOM; + // JSONArray dataPermsOpts = new JSONArray();// 数据权限选项 + List appPermOpts = new ArrayList<>();// 应用权限选项 + JSONArray actionPermOpts = new JSONArray();// 操作权限选项 + + boolean isAllDataPerm = false;// 是否有全部数据权限 + List dataPerm = new ArrayList<>();// 数据权限 + List dataPermTextList = new ArrayList<>();// 数据权限文字,用于界面显示 + boolean isAllAppPerm = false;// 是否有全部应用权限 + List appPerm = new ArrayList<>();// 应用权限 + List actionPerm = new ArrayList<>();// 操作权限 + // 2.新建、修改共有数据 + // 获取应用权限选项范围 + List appList = CooperationAppManager.getList(); + for (CooperationAppProfile profile : appList) { + JSONObject appObj = new JSONObject(); + appObj.put("value", profile.getTitle()); + appObj.put("label", profile.getId()); + appPermOpts.add(appObj); + } + // 获取操作权限选项 + JSONObject actionObj1 = new JSONObject(); + actionObj1.put("value", "新增、修改"); + actionObj1.put("label", CoeCooperationConst.ACTION_WRITE); + JSONObject actionObj2 = new JSONObject(); + actionObj2.put("value", "删除"); + actionObj2.put("label", CoeCooperationConst.ACTION_DELETE); + JSONObject actionObj3 = new JSONObject(); + actionObj3.put("value", "版本管理"); + actionObj3.put("label", CoeCooperationConst.ACTION_VERSION); + actionPermOpts.add(actionObj1); + actionPermOpts.add(actionObj2); + actionPermOpts.add(actionObj3); + + // 3.修改新建差异数据查询 + if (UtilString.isEmpty(roleId)) { + // 新建 + } else { + // 修改 + CoeCooperationRoleDao roleDao = new CoeCooperationRoleDao(); + CoeCooperationRoleModel role = roleDao.getInstance(roleId); + if (role == null) { + return ResponseObject.newErrResponse("角色不存在").toString(); + } + roleName = role.getRoleName(); + roleDesc = role.getRoleDesc(); + roleType = role.getRoleType(); + // 获取模型权限数据 + isAllDataPerm = CoeCooperationConst.PERM_ALL.equalsIgnoreCase(role.getDataPerm()); + if (!isAllDataPerm) { + // 获取小组的数据权限 + Set teamPermVerIds = CooperationUtil.getPermRepositoryVersionIds(wsId, teamId, null, null); + dataPerm = api.queryCooperationRoleDataPerms(teamId, roleId); + for (String palVersionId : dataPerm) { + if (teamPermVerIds.contains(palVersionId)) { + List palRepositoryModels = PALRepositoryCache.getByVersionId(palVersionId); + if (palRepositoryModels != null) { + for (PALRepositoryModel palModel : palRepositoryModels) { + if (palModel.isUse()) { + dataPermTextList.add(palModel.getName()); + } + } + } + } + } + } + // 获取应用权限数据 + isAllAppPerm = CoeCooperationConst.PERM_ALL.equalsIgnoreCase(role.getAppPerm()); + if (!isAllAppPerm) { + String appPermsStr = role.getAppPerm(); + if (UtilString.isNotEmpty(appPermsStr)) { + appPerm = Arrays.asList(appPermsStr.split(",")); + } + } + // 获取操作权限数据 + String actionPermsStr = role.getActionPerm(); + if (UtilString.isNotEmpty(actionPermsStr)) { + actionPerm = Arrays.asList(actionPermsStr.split(",")); + } + + } + ro.put("wsId", wsId); + ro.put("roleName", roleName); + ro.put("roleDesc", roleDesc); + ro.put("roleType", roleType); + ro.put("appPermOpts", appPermOpts); + ro.put("actionPermOpts", actionPermOpts); + ro.put("isAllDataPerm", isAllDataPerm); + ro.put("isAllAppPerm", isAllAppPerm); + ro.put("dataPerm", dataPerm); + ro.put("appPerm", appPerm); + ro.put("actionPerm", actionPerm); + ro.put("dataPermText", StringUtils.join(dataPermTextList, ",")); + return ro.toString(); + } + + /** + * 获取设置的小组权限范围内的流程树结构 + * @param wsId + * @param teamId + * @param pid + * @param categorys + * @return + */ + public String queryCooperationTeamRepositoryTree(String wsId, String teamId, String pid, String categorys) { + ResponseObject ro = ResponseObject.newOkResponse(); + if (UtilString.isEmpty(pid)) { + // 返回根节点数据 + ro.setData(CooperationQueryAPIManager.getInstance().getPalRepositoryTreeRoot(wsId, categorys, teamId)); + return ro.toString(); + } + ro.setData(CooperationQueryAPIManager.getInstance().getUsedPalRepositoryTreeDataByPidNew(wsId, teamId, pid)); + return ro.toString(); + } + + /** + * 模糊查询小组权限范围内流程 + * @param wsId + * @param teamId + * @param rootId + * @param categorys + * @param name + * @return + */ + public String searchCooperationTeamRepositoryTreeData(String wsId, String teamId, String rootId, String categorys, String name) { + ResponseObject ro = ResponseObject.newOkResponse(); + // 获取模型列表 + List list = new ArrayList<>(); + if (!UtilString.isEmpty(rootId)) { + Set idSet = new HashSet<>(); + PALRepositoryCache.getAllChildrenModelsByPid(wsId, rootId, list, idSet); + } else { + Iterator iterator = PALRepositoryCache.getByWsId(wsId); + while (iterator.hasNext()) { + list.add(iterator.next()); + } + } + // 获取使用中且名称符合的,过滤掉大部分数据 + List tempList = new ArrayList<>(); + for (PALRepositoryModel model : list) { + if (model.isUse() && model.getName().toUpperCase().contains(name.toUpperCase())) { + tempList.add(model); + } + } + list = tempList; + // 过滤大分类 + if (!UtilString.isEmpty(categorys)) { + List tempList2 = new ArrayList<>(); + for (PALRepositoryModel model : list) { + if (categorys.contains(model.getMethodCategory())) { + tempList2.add(model); + } + } + list = tempList2; + } + // 过滤小组 + Set versionIds = CooperationUtil.getPermRepositoryVersionIds(wsId, teamId, null, null); + if (!UtilString.isEmpty(teamId)) { + List tempList3 = new ArrayList<>(); + for (PALRepositoryModel model : list) { + if (versionIds.contains(model.getVersionId())) { + tempList3.add(model); + } + } + list = tempList3; + } + List result = new ArrayList<>(); + for (PALRepositoryModel model : list) { + List names = new ArrayList<>(); + List path = new ArrayList<>(); + JSONArray repositoryPathData = CoeProcessLevelUtil.getRepositoryPath(model.getId()); + // 前面大类不显示,根据小组进行级别处理 + for (int i = 0; i < repositoryPathData.size(); i++) { + JSONObject currObj = repositoryPathData.getJSONObject(i); +// if (currObj.getString("id").length() < 36) { +// continue; +// } + PALRepositoryModel currModel = PALRepositoryCache.getCache().get(currObj.getString("id")); + if (currModel != null && versionIds.contains(currModel.getVersionId())) { + names.add(currModel.getName()); + path.add(currModel.getVersionId()); + } else if (currObj.getString("id").length() < 36) { + path.add(currObj.getString("id")); + } + } + JSONObject object = new JSONObject(); + object.put("pathName", StringUtils.join(names, ">")); + object.put("path", StringUtils.join(path, ",")); + object.put("id", model.getId()); + object.put("name", model.getName()); + object.put("versionId", model.getVersionId()); + result.add(object); + } + // 按照名称排序,构造返回内容 + Collections.sort(result, new Comparator() { + @Override + public int compare(JSONObject o1, JSONObject o2) { + return o2.getString("name").compareToIgnoreCase(o1.getString("name")); + } + }); + ro.setData(result); + return ro.toString(); + } + + /** + * 查询小组权限范围内所有的子节点 + * @param wsId + * @param teamId + * @param pid + * @return + */ + public String searchCooperationTeamRepositoryAllChildrenData(String wsId, String teamId, String pid) { + Set versionIds = CooperationUtil.getPermRepositoryVersionIds(wsId, teamId, null, null); + List list = new ArrayList<>(); + Set idSet = new HashSet<>(); + PALRepositoryCache.getAllChildrenModelsByPid(wsId, pid, list, idSet); + JSONArray result = new JSONArray(); + for (PALRepositoryModel model : list) { + if (versionIds.contains(model.getVersionId()) && model.isUse()) { + result.add(model.getVersionId()); + } + } + ResponseObject ro = ResponseObject.newOkResponse(); + ro.setData(result); + return ro.toString(); + } + + /** + * 根据版本号查询当前正在使用中的流程名称 + * @param versionIds + * @return + */ + public String queryRepositoryNamesByVersionIds(String versionIds) { + ResponseObject ro = ResponseObject.newOkResponse(); + JSONArray versionIdArr = JSONArray.parseArray(versionIds); + List list = new ArrayList<>(); + for (int i = 0; i < versionIdArr.size(); i++) { + List models = PALRepositoryCache.getByVersionId(versionIdArr.getString(i)); + if (models != null) { + for (PALRepositoryModel model : models) { + if (model.isUse()) { + list.add(model); + } + } + } + } + CooperationUtil.sortByLevelAndOrderIndex(list); + List versionIdList = new ArrayList<>(); + List nameList = new ArrayList<>(); + for (PALRepositoryModel model : list) { + versionIdList.add(model.getVersionId()); + nameList.add(model.getName()); + } + ro.put("versionIdArr", JSON.toJSON(versionIdList)); + ro.put("names", StringUtils.join(nameList, ",")); + return ro.toString(); + } + + /** + * 新增/修改角色保存 + * @param data + * @return + */ + public String saveRoleUpdateData(String data) { + ResponseObject ro = ResponseObject.newOkResponse(); + JSONObject object = JSON.parseObject(data); + String teamId = object.getString("teamId"); + CoeCooperationAPIManager api = CoeCooperationAPIManager.getInstance(); + CoeCooperationTeamModel team = api.queryCooperationTeamById(teamId); + if (team == null) { + return ResponseObject.newErrResponse("保存失败,小组不存在").toString(); + } + String roleId = object.getString("roleId"); + String roleName = object.getString("roleName"); + String roleDesc = object.getString("roleDesc"); + JSONArray actionPerm = object.getJSONArray("actionPerm"); + JSONArray dataPerm = object.getJSONArray("dataPerm"); + JSONArray appPerm = object.getJSONArray("appPerm"); + int roleType = object.getInteger("roleType"); + boolean isAllDataPerm = object.getBooleanValue("isAllDataPerm"); + boolean isAllAppPerm = object.getBooleanValue("isAllAppPerm"); + + String newRoleId = roleId; + if (UtilString.isEmpty(roleId)) { + newRoleId = UUIDGener.getUUID(); + } + List actionPermList = new ArrayList<>(); + for (int i = 0; i < actionPerm.size(); i++) { + actionPermList.add(actionPerm.getString(i)); + } + String actionPermStr = StringUtils.join(actionPermList, ","); + + String appPermStr = "all"; + if (!isAllAppPerm) { + List appPermList = new ArrayList<>(); + for (int i = 0; i < appPerm.size(); i++) { + appPermList.add(appPerm.getString(i)); + } + appPermStr = StringUtils.join(appPermList, ","); + } + + String dataPermStr = "all"; + List rolePermList = new ArrayList<>(); + if (!isAllDataPerm) { + for (int i = 0; i < dataPerm.size(); i++) { + if (dataPerm.getString(i).length() >= 36) { + CoeCooperationRolePermModel model = new CoeCooperationRolePermModel(UUIDGener.getUUID(), teamId, newRoleId, dataPerm.getString(i)); + rolePermList.add(model); + } + } + dataPermStr = ""; + } + Timestamp now = new Timestamp(System.currentTimeMillis()); + + CoeCooperationRoleModel roleModel = new CoeCooperationRoleModel(newRoleId, teamId, roleName, roleDesc, roleType, appPermStr, actionPermStr, dataPermStr, _uc.getUID(), now, _uc.getUID(), now); + boolean isSuccess = false; + if (UtilString.isEmpty(roleId)) {// 新增 + isSuccess = api.createCooperationRole(roleModel); + } else {// 修改 + isSuccess = api.updateCooperationRole(roleModel); + } + if (isSuccess) { + if (UtilString.isNotEmpty(roleId)) {// 修改 + api.removeCooperationRolePerms(teamId, newRoleId);// 删除现有 + } + if (!isAllDataPerm && rolePermList.size() > 0) { + isSuccess = api.createCooperationRolePerms(rolePermList); + } + if (!isSuccess) { + return ResponseObject.newErrResponse("保存角色数据权限失败").toString(); + } + } else { + return ResponseObject.newErrResponse("保存角色失败").toString(); + } + + return ro.toString(); + } + + /** + * 添加成员,查询未加入小组的PAL用户以及现有的角色列表 + * @param teamId + * @return + */ + public String queryCooperationAddMemberData(String teamId) { + ResponseObject ro = ResponseObject.newOkResponse(); + CoeCooperationAPIManager api = CoeCooperationAPIManager.getInstance(); + CoeCooperationTeamModel team = api.queryCooperationTeamById(teamId); + if (team == null) { + return ResponseObject.newErrResponse("查询失败,小组不存在").toString(); + } + // 获取未加入小组的用户 + List members = api.queryCooperationTeamMemberList(teamId); + Set teamMemberSet = new HashSet<>(); + for (CoeCooperationMemberModel member : members) { + teamMemberSet.add(member.getUserId()); + } + List userOpts = new ArrayList<>(); + List userList = CoeWorkSpaceDaoFactory.createCoeWorkSpace().getCoeUserMainRecodes(0, 0); + boolean highSecurity = HighSecurityUtil.isON(); + for (CoeUserModel user : userList) { + if (!teamMemberSet.contains(user.getUserId())) { + // 开启三员并且是安全保密员,跳过 + if (highSecurity && HighSecurityUtil.isSecAdminUser(user.getUserId())) { + continue; + } + UserModel userModel = SDK.getORGAPI().getUser(user.getUserId()); + JSONObject obj = new JSONObject(); + obj.put("value", user.getUserId()); + obj.put("label", userModel.getUserName()); + userOpts.add(obj); + } + } + userOpts.sort((u1, u2) -> {return u2.getString("label").compareTo(u1.getString("label"));}); + ro.put("userOpts", JSON.toJSON(userOpts)); + // 获取已存在的角色列表 + List roleOpts = new ArrayList<>(); + List list = api.queryCooperationRoleList(teamId); + for (CoeCooperationRoleModel role : list) { + JSONObject obj = new JSONObject(); + obj.put("value", role.getId()); + obj.put("label", role.getRoleName()); + roleOpts.add(obj); + } + ro.put("roleOpts", JSON.toJSON(roleOpts)); + return ro.toString(); + } + + /** + * 添加成员,保存 + * @param data + * @return + */ + public String saveCooperationAddMemberData(String data) { + ResponseObject ro = ResponseObject.newOkResponse(); + JSONObject object = JSON.parseObject(data); + String teamId = object.getString("teamId"); + CoeCooperationAPIManager api = CoeCooperationAPIManager.getInstance(); + CoeCooperationTeamModel team = api.queryCooperationTeamById(teamId); + if (team == null) { + return ResponseObject.newErrResponse("保存失败,小组不存在").toString(); + } + String roleId = object.getString("roleId"); + CoeCooperationRoleDao roleDao = new CoeCooperationRoleDao(); + CoeCooperationRoleModel role = roleDao.getInstance(roleId); + if (role == null) { + return ResponseObject.newErrResponse("角色不存在").toString(); + } + JSONArray userArr = object.getJSONArray("userArr"); + // 校验管理员是否全部都在pal用户中 + String illegalUsers = checkCoeUserValid(userArr); + if (illegalUsers.length() > 0) { + return ResponseObject.newErrResponse("以下用户非PAL用户,请重新选择PAL用户进行保存[" + illegalUsers + "]").toString(); + } + // 获取未加入小组的用户 + List members = api.queryCooperationTeamMemberList(teamId); + Set teamMemberSet = new HashSet<>(); + for (CoeCooperationMemberModel member : members) { + teamMemberSet.add(member.getUserId()); + } + Timestamp time = new Timestamp(System.currentTimeMillis()); + List memberModels = new ArrayList<>(); + for (int i = 0; i < userArr.size(); i++) { + String userId = userArr.getString(i); + if (!teamMemberSet.contains(userId)) { + CoeCooperationMemberModel member = new CoeCooperationMemberModel(UUIDGener.getUUID(), teamId + , userId, roleId, _uc.getUID(), time, _uc.getUID(), time); + memberModels.add(member); + } + } + // 保存 + api.createCooperationMemebers(memberModels); + return ro.toString(); + } + + /** + * 删除小组成员 + * @param teamId + * @param userIds + * @return + */ + public String removeCooperationMember(String teamId, String userIds) { + ResponseObject ro = ResponseObject.newOkResponse(); + CoeCooperationAPIManager api = CoeCooperationAPIManager.getInstance(); + CoeCooperationTeamModel team = api.queryCooperationTeamById(teamId); + if (team == null) { + return ResponseObject.newErrResponse("保存失败,小组不存在").toString(); + } + JSONArray userIdArr = JSONArray.parseArray(userIds); + // 查询其他用户的角色是否有管理员 + boolean flag = false; + List adminUsers = api.queryCooperationAdminUsers(teamId); + for (String adminUser : adminUsers) { + if (!userIdArr.contains(adminUser)) { + flag = true; + break; + } + } + if (!flag) { + return ResponseObject.newErrResponse("不允许删除,小组中必须至少存在一位管理员用户").toString(); + } + for (int i = 0; i < userIdArr.size(); i++) { + api.removeCooperationMemeber(teamId, userIdArr.getString(i)); + } + return ro.toString(); + } + + /** + *删除小组角色 + * @param teamId + * @param roleId + * @return + */ + public String removeCooperationRole(String teamId, String roleId) { + ResponseObject ro = ResponseObject.newOkResponse(); + CoeCooperationAPIManager api = CoeCooperationAPIManager.getInstance(); + CoeCooperationTeamModel team = api.queryCooperationTeamById(teamId); + if (team == null) { + return ResponseObject.newErrResponse("保存失败,小组不存在").toString(); + } + CoeCooperationRoleDao roleDao = new CoeCooperationRoleDao(); + CoeCooperationRoleModel role = roleDao.getInstance(roleId); + if (role == null) { + return ResponseObject.newErrResponse("角色不存在").toString(); + } + CoeCooperationMemberDao memberDao = new CoeCooperationMemberDao(); + List memberModels = memberDao.getModelByTeamRole(teamId, roleId); + if (memberModels != null && !memberModels.isEmpty()) { + List existUserList = new ArrayList<>(); + for (CoeCooperationMemberModel member : memberModels) { + UserModel user = SDK.getORGAPI().getUser(member.getUserId()); + if (user != null) { + existUserList.add(user.getUserName()); + } else { + existUserList.add(member.getUserId()); + } + } + return ResponseObject.newErrResponse("该角色存在小组成员,不允许删除,小组成员[" + StringUtils.join(existUserList, ",") + "]").toString(); + } + // 删除角色及角色数据权限 + api.removeCooperationRole(teamId, roleId); + return ro.toString(); + } + + /** + * 查询PAL用户树 + * @param pid + * @param parentType + * @return + */ + public String queryPalUserTree(String pid, String parentType) { + ResponseObject ro = ResponseObject.newOkResponse(); + JSONArray result = new JSONArray(); + List records = CoeWorkSpaceDaoFactory.createCoeWorkSpace().getCoeUserMainRecodes(0, 0); // 所有记录条数,暂时不分页 + Map userMap = new HashMap<>(); + for (CoeUserModel user : records) { + UserModel userModel = SDK.getORGAPI().getUser(user.getUserId()); + if (userModel != null) { + userMap.put(user.getUserId(), userModel); + } + } + Set deptIds = new HashSet<>(); + for (Map.Entry entry : userMap.entrySet()) { + // 获取一级部门 + DepartmentModel departmentModel = SDK.getORGAPI().getDepartmentById(entry.getValue().getDepartmentId()); + while (departmentModel != null) { + deptIds.add(departmentModel.getId()); + if (departmentModel.getParentDepartmentId().equals("0")) { + break; + } + departmentModel = SDK.getORGAPI().getDepartmentById(departmentModel.getParentDepartmentId()); + } + } + if (UtilString.isEmpty(pid)) { + // 获取pal用户涉及的单位 + List companyModelList = new ArrayList<>(); + Set companyIds = new HashSet<>(); + for (CoeUserModel user : records) { + UserModel userModel = SDK.getORGAPI().getUser(user.getUserId()); + if (userModel != null) { + CompanyModel company = SDK.getORGAPI().getCompanyByUser(userModel.getUID()); + if (!companyIds.contains(company.getId())) { + companyModelList.add(company); + companyIds.add(company.getId()); + } + } + } + companyModelList.sort((c1, c2) -> {return c1.getOrderIndex() - c2.getOrderIndex();}); + for (CompanyModel model : companyModelList) { + JSONObject obj = new JSONObject(); + obj.put("id", model.getId()); + obj.put("name", model.getNameI18N()); + obj.put("type", "company"); + JSONObject icon = new JSONObject(); + icon.put("icon", ""); + icon.put("color", ""); + obj.put("icon", icon); + result.add(obj); + } + } else { + if ("company".equals(parentType)) {// 父节点是单位 + // 获取一级子部门,type为dept + result = getDepartmentByCompany(pid, deptIds); + } else if ("dept".equals(parentType)) { + // 获取部门/用户,type为dept + result = getDepartmentAndUserByParent(pid, deptIds, userMap); + } + } + ro.setData(result); + return ro.toString(); + } + + /** + * 获取部门下的部门和人员 + * @param pid + * @param deptIds + * @param userMap + * @return + */ + public JSONArray getDepartmentAndUserByParent(String pid, Set deptIds, Map userMap) { + JSONArray data = new JSONArray(); + // 部门 + List subDepartmentList = SDK.getORGAPI().getSubDepartments(pid); + if (!isEmpty(subDepartmentList)) { + for (DepartmentModel model : subDepartmentList) { + if (!deptIds.contains(model.getId())) { + continue; + } + JSONObject obj = new JSONObject(); + obj.put("id", model.getId()); + obj.put("pid", pid); + obj.put("name", model.getNameI18N()); + obj.put("type", "dept"); + JSONObject icon = new JSONObject(); + icon.put("icon", ""); + icon.put("color", ""); + obj.put("icon", icon); + data.add(obj); + } + } + // 人员 + List userlist = SDK.getORGAPI().getUsersByDepartment(pid); + if (!isEmpty(userlist)) { + for (UserModel model : userlist) { + if (!userMap.containsKey(model.getUID()) || (HighSecurityUtil.isON() && HighSecurityUtil.isSecAdminUser(model.getUID()))) { + continue; + } + JSONObject obj = new JSONObject(); + obj.put("id", model.getUID()); + obj.put("pid", pid); + obj.put("name", model.getUserName()); + obj.put("type", "user"); + JSONObject icon = new JSONObject(); + icon.put("icon", ""); + if (model.isManager()) { + icon.put("color", "#DA2912"); + } else { + icon.put("color", ""); + } + obj.put("icon", icon); + data.add(obj); + } + } + return data; + } + + /** + * 获取单位下第一级部门 + * @param companyId + * @param deptIds + * @return + */ + private JSONArray getDepartmentByCompany(String companyId, Set deptIds) { + JSONArray data = new JSONArray(); + List departmentList = DepartmentCache.getListOfCompany(companyId); + if (!isEmpty(departmentList)) { + for (DepartmentModel model : departmentList) { + if (deptIds.contains(model.getId()) && model.getParentDepartmentId().equals("0")) { + JSONObject obj = new JSONObject(); + obj.put("id", model.getId()); + obj.put("pid", companyId); + obj.put("name", model.getNameI18N()); + obj.put("type", "dept"); + JSONObject icon = new JSONObject(); + icon.put("icon", ""); + icon.put("color", ""); + obj.put("icon", icon); + data.add(obj); + } + } + } + return data; + } + + private boolean isEmpty(List list) { + return (list == null || list.size() == 0); + } +}