package foundation.system; import java.io.File; import java.io.FileOutputStream; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Set; import org.apache.commons.io.FileUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import foundation.action.ActionProvider; import foundation.dao.DataPackage; import foundation.dao.Filter; import foundation.dao.OrderBy; import foundation.data.entity.Entity; import foundation.data.entity.EntityNode; import foundation.data.entity.EntitySet; import foundation.data.entity.EntityTree; import foundation.data.object.DataObject; import foundation.data.object.EntitySaver; import foundation.json.JArrayReader; import foundation.json.JSONBuilder; import foundation.json.JSONReader; import foundation.json.JType; import foundation.monitor.Progressor; import foundation.org.AccountMeta; import foundation.org.AccountMeta.Level; import foundation.org.Org; import foundation.org.Position; import foundation.org.PositionMeta; import foundation.persist.NamedSQL; import foundation.persist.SQLRunner; import foundation.server.config.Configer; import foundation.user.OnlineUser; import foundation.user.User; import foundation.util.ID; import foundation.util.Util; public class OrgHandler extends ActionProvider { protected static Logger logger; static { logger = LogManager.getLogger(OrgHandler.class); } @Override protected void publishMethod() { //1. addMethod("activeAccountFlag"); //2. 创建临时账户 addMethod("createTempAccount"); //3. 创建标准账户 addMethod("createStandardAccount"); //4. 获取管理员账户 addMethod("getAdminAccount"); //5. 冻结公司 addMethod("freeze"); //6. 解冻公司 addMethod("unfreeze"); //7. 创建公司默认内容(仓库等) addMethod("createDefaultWorks"); //8. 创建岗位权限冗余表 addMethod("createPositionSpeedTable"); //9. 根据导入的数据更新销售架构 addMethod("saveSaleFrameworkByImport"); //10.同步OA员工数据 addMethod("syncEmployee"); //11.更新销售数据权限 addMethod("updateRightActorTarget"); //12.角色分配用户 addMethod("assignEmployee"); } public void activeAccountFlag() throws Exception { DataPackage dataPackage = dataReader.getDataPackage(); String orgId = dataPackage.getMasterId(); Org org = Org.getInstance(orgId); if (org == null) { logger.error("createTempAccount error: org ({})not exists", orgId); return; } org.activeAccountFlag(); } public void createTempAccount() throws Exception { DataPackage dataPackage = dataReader.getDataPackage(); Entity entity = dataPackage.getMasterEntity(); String orgId = entity.getString("account_org_id"); Org org = Org.getInstance(orgId); if (org == null) { logger.error("createTempAccount error: org ({})not exists", orgId); return; } AccountMeta accountMeta = AccountMeta.getCustomerInstance(Level.Temp, entity); User user = org.createAccount(accountMeta); dataWriter.addValue("user", user); } public void createStandardAccount() throws Exception { DataPackage dataPackage = dataReader.getDataPackage(); Entity entity = dataPackage.getMasterEntity(); String orgId = entity.getString("org_id"); Org org = Org.getInstance(orgId); if (org == null) { logger.error("createStandardAccount error: org ({})not exists", orgId); return; } AccountMeta accountMeta = AccountMeta.getCustomerInstance(Level.Standard, entity); User user = org.createAccount(accountMeta); dataWriter.addValue("user", user); } public void getAdminAccount() throws Exception { DataPackage dataPackage = dataReader.getDataPackage(); String orgId = dataPackage.getMasterId(); Org org = Org.getInstance(orgId); if (org == null) { logger.error("createTempAccount error: org ({})not exists", orgId); return; } User user = org.getAdminUser(); dataWriter.addValue("user", user); } public void freeze() throws Exception { DataPackage dataPackage = dataReader.getDataPackage(); String orgId = dataPackage.getMasterId(); Org org = Org.getInstance(orgId); if (org == null) { logger.error("createTempAccount error: org ({})not exists", orgId); return; } org.freeze(); } public void unfreeze() throws Exception { DataPackage dataPackage = dataReader.getDataPackage(); String orgId = dataPackage.getMasterId(); Org org = Org.getInstance(orgId); if (org == null) { logger.error("createTempAccount error: org ({})not exists", orgId); return; } org.unfreeze(); } public void createDefaultWorks() throws Exception { DataPackage dataPackage = dataReader.getDataPackage(); Entity entity = dataPackage.getMasterEntity(); String orgId = entity.getString("org_id"); String accountId = entity.getString("id"); String buName = entity.getString("bu_name"); String buId = entity.getString("bu_id"); String companyId = entity.getString("company_id"); Org org = Org.getInstance(orgId); if (org == null) { logger.error("createDefaultWorks error: org ({})not exists", orgId); return; } org.getCreateAccountDefaultWorks(accountId, buId, companyId, buName); } public void createPositionSpeedTable() throws Exception { String positionTable = "md_position"; String positionEmployeeTable = "md_position_employee"; String positionHierarchyTable = "md_position_hierarchy"; if (dataReader != null) { String dataName = dataReader.getString("dataname"); String preFlag = "version_preparatory_"; if (dataName != null && dataName.startsWith(preFlag)) { positionTable = preFlag + positionTable; positionEmployeeTable = preFlag + positionEmployeeTable; positionHierarchyTable = preFlag + positionHierarchyTable; } } //1. DataObject hierarchyObject = DataObject.getInstance(positionHierarchyTable); EntitySet hierarchySet = hierarchyObject.createTableEntitySet(); //2. DataObject positionObject = DataObject.getInstance(positionTable); Filter filter = new Filter("category_code", "Sales"); EntityTree tree = positionObject.getTableEntityTree(filter, new OrderBy("bu_id, parent_id")); //3. 清空 speed 表,并进行计算 hierarchyObject.emptyTable(); String positionPath = null; createHierarchys(positionObject, tree.getRootSet(), positionPath, hierarchySet); //4. 批量插入 speed 表 hierarchyObject.insertEntitySet(hierarchySet); //5. 刷新 speed 表 employee 字段 NamedSQL namedSQL = NamedSQL.getInstance("updatePositionSpeedEmployee"); namedSQL.setParam("positionHierarchyTable", positionHierarchyTable); namedSQL.setParam("positionEmployeeTable", positionEmployeeTable); namedSQL.execute(); } private void createHierarchys(DataObject positionObject, EntitySet entitySet, String parentPath, EntitySet hierarchySet) throws Exception { for (Entity entity: entitySet) { EntityNode node = (EntityNode)entity; String positionPath = parentPath == null ? entity.getString("name") : parentPath + ">>" + entity.getString("name"); createOneHierarchyLine(positionObject, node, positionPath, hierarchySet); EntitySet children = node.getChildren(); if (children != null) { createHierarchys(positionObject, children, positionPath, hierarchySet); } } } private void createOneHierarchyLine(DataObject positionObject, EntityNode node, String positionPath, EntitySet hierarchySet) throws Exception { //1. 插入 speed 表 int level = node.getLevel() + 1; String id = node.getString("id"); Entity entity = hierarchySet.append(); entity.set("position_id", id); entity.set("position_path", positionPath); entity.set("level" + level, id); EntityNode parent = node, region = null; for (int i = level; i >=1; i--) { parent = parent.getParent(); if (parent == null) { break; } if ((i - 1) == 2) { region = parent; } entity.set("level" + (i - 1), parent.getString("id")); } //2. EntitySaver saver = positionObject.createEntitySaver(id); saver.set("level_no", level); if (region != null) { saver.set("region", region.getValue("name")); } saver.update(); } public void saveSaleFrameworkByImport() throws Exception { //1. 获取导入批号 String batchNo = dataReader.getString("batchNo"); if (Util.isEmpty(batchNo)) { dataWriter.reportOneError("销售架构批量导入", "缺少批量导入数据参数batchNo"); return; } //2. 根据导入数据刷新销售架构、员工、用户、冗余表 Progressor progressor = new Progressor(); SQLRunner.beginTrans(); try { //1. 保存当前架构到文件 savePositionToFile(batchNo, progressor); //2. 添加没有的岗位, 删除不存在的岗位 updatePositionOnUpload(batchNo, progressor); //3. 添加没有的员工, 失效离职的员工 updateEmployeeOnUpload(batchNo, progressor); //4. 根据岗位刷新岗位员工关系及冗余表 updatePositionEmployeeOnUpload(batchNo, progressor); //6.更新岗位数据权限 updateRightActorTarget(); //7. 根据员工刷新目标医院辖区关系 refreshHospitalTerritory(batchNo, progressor); //8. 根据岗位刷新架构上下级冗余表 createPositionSpeedTable(); SQLRunner.commit(); } catch(Exception e) { SQLRunner.rollback(); dataWriter.reportOneError("销售架构批量导入", "数据保存失败"); e.printStackTrace(); } progressor.endTask(); } public void updateRightActorTarget() throws Exception { logger.info("更新岗位数据权限"); NamedSQL namedSQL; int cnt; //1. 删除失效岗位的数据权限 namedSQL = NamedSQL.getInstance("deleteNotExistsRightActorTarget"); cnt = namedSQL.execute(); logger.info("删除不存在的岗位数据权限 :" + cnt); //2. 添加没有数据权限的生效岗位 DataObject dataObject = DataObject.getInstance("sys_right_actor_target"); namedSQL = NamedSQL.getInstance("getNewRightActorTarget"); EntitySet entitySet = SQLRunner.getEntitySet(namedSQL); String duty, actorCode; cnt = 0; for (Entity entity: entitySet) { duty = entity.getString("duty"); PositionMeta positionMeta = new PositionMeta(duty); actorCode = positionMeta.getActorCode(); entity.set("actor_id", actorCode); entity.set("id", ID.newValue()); cnt = cnt + dataObject.insertEntity(entity); } logger.info("添加新的岗位数据权限:" + cnt); } private void savePositionToFile(String batchNo, Progressor progressor) throws Exception { progressor.newPhase("bak_currentData", "备份当前数据"); //1. 获取当前岗位列表 DataObject dataObject = DataObject.getInstance("md_position"); EntitySet entitySet = dataObject.getTableEntitySet(); //2. 创建文件 String root = Configer.getParam("PathRepository") + "/hierarchy/"; SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM"); String datePath = dateFormat.format(new Date()); File path = new File(root, datePath); if (!path.exists()) { FileUtils.forceMkdir(path); } File target = new File(path, batchNo + ".json"); if (target.exists()) { target.delete(); } target.createNewFile(); progressor.appendLine("创建备份文件:" + target.toString()); //3. 保存到JSON JSONBuilder content = new JSONBuilder(); content.beginArray(); for (Entity entity: entitySet) { content.beginObject(); entity.writeJSONBody(content); content.endObject(); } content.endArray(); progressor.appendLine("写入数据:" + entitySet.size() + "行"); //4. 保存到文件 FileOutputStream output = new FileOutputStream(target); try { output.write(content.getBytes()); progressor.appendLine("写入完毕"); } catch (Exception e) { e.printStackTrace(); } finally{ try { output.close(); } catch (Exception e) { } } progressor.endPhase(); } private void updatePositionOnUpload(String batchNo, Progressor progressor) throws Exception { progressor.newPhase("更新岗位"); NamedSQL namedSQL; int cnt; //1. 删除没有的岗位(根据岗位编码) namedSQL = NamedSQL.getInstance("deleteNotExistsSalesPosition"); namedSQL.setParam("batchNo", batchNo); cnt = namedSQL.execute(); progressor.appendLine("删除原有岗位:" + cnt); //2. 更新替换存在的岗位(根据岗位编码) namedSQL = NamedSQL.getInstance("updatePositionSalesPosition"); namedSQL.setParam("batchNo", batchNo); namedSQL.execute(); progressor.appendLine("更新原有岗位:" + cnt); //3. 添加新的岗位(根据岗位编码) namedSQL = NamedSQL.getInstance("appendNewSalesPosition"); namedSQL.setParam("batchNo", batchNo); cnt = namedSQL.execute(); progressor.appendLine("添加新增岗位:" + cnt); progressor.endPhase(); } private void updateEmployeeOnUpload(String batchNo, Progressor progressor) throws Exception { progressor.newPhase("更新员工"); NamedSQL namedSQL; int cnt; OnlineUser user = OnlineUser.getInstance(); //1. 添加没有的员工 namedSQL = NamedSQL.getInstance("appendNewSalesEmployee"); namedSQL.setParam("creatorId",user.getCode()); namedSQL.setParam("creatorName",user.getName()); namedSQL.setParam("batchNo", batchNo); cnt = namedSQL.execute(); progressor.appendLine("添加新员工(销售):" + cnt); //2. 刷新员工表 -- 岗位冗余字段 updateEmployeeOtherInfo(progressor); //3. 失效离职的员工 namedSQL = NamedSQL.getInstance("inactiveNotExistsSalesEmployee"); namedSQL.setParam("batchNo", batchNo); cnt = namedSQL.execute(); progressor.appendLine("离职员工(销售):" + cnt); progressor.endPhase(); } private void updatePositionEmployeeOnUpload(String batchNo, Progressor progressor) throws Exception { progressor.newPhase("更新岗位员工关系"); NamedSQL namedSQL; int cnt; //1. 删除不存在的岗位-员工关系 namedSQL = NamedSQL.getInstance("deleteNotExistsPositionEmployee"); namedSQL.setParam("batchNo", batchNo); cnt = namedSQL.execute(); progressor.appendLine("删除不存在的岗位-员工关系:" + cnt); //2. 更新岗位-员工关系 namedSQL = NamedSQL.getInstance("updatePositionEmployee"); namedSQL.setParam("batchNo", batchNo); cnt = namedSQL.execute(); progressor.appendLine("更新岗位-员工关系:" + cnt); //3. 新增岗位-员工关系 namedSQL = NamedSQL.getInstance("appendPositionEmployee"); namedSQL.setParam("batchNo", batchNo); cnt = namedSQL.execute(); progressor.appendLine("新增岗位-员工关系:" + cnt); progressor.endPhase(); } private void updateEmployeeUser(Progressor progressor) throws Exception { progressor.newPhase("更新用户"); NamedSQL namedSQL; int cnt; //1. 删除离职员工的用户 namedSQL = NamedSQL.getInstance("inValidNotExistsEmployeeUser"); cnt = namedSQL.execute(); progressor.appendLine("更新不存在的用户(员工)为失效:" + cnt); //2. 删除离职员工的用户 namedSQL = NamedSQL.getInstance("validExistsEmployeeUser"); cnt = namedSQL.execute(); progressor.appendLine("激活生效的员工:" + cnt); //3. 添加没有的员工用户(与岗位有关联的员工) namedSQL = NamedSQL.getInstance("appendNewEmployeeUser"); cnt = namedSQL.execute(); progressor.appendLine("添加新的用户(员工):" + cnt); //4. 添加员工与公司关系 namedSQL = NamedSQL.getInstance("appendNewUserOrg"); cnt = namedSQL.execute(); progressor.appendLine("添加新的用户(员工)- 公司关系:" + cnt); } private void refreshHospitalTerritory(String batchNo,Progressor progressor) throws Exception { progressor.newPhase("更新辖区医院 "); NamedSQL namedSQL; int cnt; namedSQL = NamedSQL.getInstance("refreshHospitalPosition"); namedSQL.setParam("batchNo", batchNo); cnt = namedSQL.execute(); progressor.appendLine("更新辖区医院 关系 :" + cnt); } public void createHierarchys(DataObject positionObject, EntitySet entitySet, String parentPath, EntitySet hierarchySet, Set positionIdSet, NamedSQL levelSQL) throws Exception { for (Entity entity: entitySet) { EntityNode node = (EntityNode)entity; String positionPath = parentPath == null ? entity.getString("name") : parentPath + ">>" + entity.getString("name"); createOneHierarchyLine(positionObject, node, positionPath, hierarchySet, positionIdSet, levelSQL); EntitySet children = node.getChildren(); if (children != null) { createHierarchys(positionObject, children, positionPath, hierarchySet, positionIdSet, levelSQL); } } } public void createOneHierarchyLine(DataObject positionObject, EntityNode node, String positionPath, EntitySet hierarchySet, Set positionIdSet, NamedSQL levelSQL) throws Exception { //1. 插入 speed 表 int level = node.getLevel() + 1; String id = node.getString("id"); Entity entity = hierarchySet.append(); entity.set("position_id", id); entity.set("position_path", positionPath); entity.set("level" + level, id); EntityNode parent = node; for (int i = level; i >=1; i--) { parent = parent.getParent(); if (parent == null) { break; } entity.set("level" + (i - 1), parent.getString("id")); } //2. if (positionIdSet.contains(id)) { return; } levelSQL.setParam("id", id); levelSQL.setParam("level_no", level); levelSQL.execute(); positionIdSet.add(id); } private void updateEmployeeOtherInfo(Progressor progressor) throws Exception { progressor.newPhase("更新用户OA以及NC信息"); NamedSQL namedSQL; int cnt; namedSQL = NamedSQL.getInstance("updateEmployeeInfoOA"); cnt = namedSQL.execute(); progressor.appendLine("更新用户OA信息:" + cnt); namedSQL = NamedSQL.getInstance("updateEmployeeInfoNC"); cnt = namedSQL.execute(); progressor.appendLine("更新用户NC信息:" + cnt); // namedSQL = NamedSQL.getInstance("UpdateEmployeeInvalid"); // cnt = namedSQL.execute(); // progressor.appendLine("失效不在OA中的员工:" + cnt); } public void syncEmployee() throws Exception{ Progressor progressor = new Progressor(); SQLRunner.beginTrans(); try { boolean existMismatching = true; progressor.newPhase("更新员工"); NamedSQL namedSQL; int cnt; //1. 添加没有的员工 namedSQL = NamedSQL.getInstance("appendNewEmployee"); cnt = namedSQL.execute(); progressor.appendLine("添加新员工:" + cnt); progressor.endPhase(); //2. 刷新员工表 -- 岗位冗余字段 updateEmployeeOtherInfo(progressor); //3.获取未匹配上NC的员工 namedSQL = NamedSQL.getInstance("queryEmployeeMatchNCError"); EntitySet entitySet = namedSQL.getEntitySet(); if(entitySet == null || entitySet.isEmpty()) { existMismatching = false; } dataWriter.addValue("existMismatching",existMismatching); dataWriter.addValue("ncError",entitySet); //4.新增用户 updateEmployeeUser(progressor); SQLRunner.commit(); } catch(Exception e) { SQLRunner.rollback(); dataWriter.reportOneError("result", "同步OA员工数据"); e.printStackTrace(); } } public void assignEmployee() throws Exception{ String buId = dataReader.getString("bu_id"); String companyId = dataReader.getString("company_id"); String actorId = dataReader.getString("actor_id"); String actorName = dataReader.getString("actor_name"); JArrayReader employeeList = dataReader.getReader("employees", JType.Array); DataObject dataObject = DataObject.getInstance("sys_right_actor_target"); Filter filter = new Filter("actor_id", actorId); if (!Util.isEmpty(companyId)) { filter.add("company_id", companyId); } if (!Util.isEmpty(buId)) { filter.add("bu_id", buId); } EntitySet entitySet = dataObject.getTableEntitySet(filter); if (entitySet.isEmpty()) { entitySet = Position.createPostion(companyId, buId, actorId, actorName); } dataObject = DataObject.getInstance("md_position_employee"); EntitySaver saver; String employeeId, positionId; for (Entity entity : entitySet) { positionId = entity.getString("target_id"); for (JSONReader employee : employeeList) { employeeId = employee.getString("id"); Filter existsFilter = new Filter(); existsFilter.add("bu_id", buId); existsFilter.add("company_id", companyId); existsFilter.add("position_id", positionId); existsFilter.add("employee_id", employeeId); int count = dataObject.getCount((existsFilter)); if (count > 0) { continue; } saver = dataObject.createEntitySaver(); saver.set("bu_id", buId); saver.set("company_id", companyId); saver.set("position_id", positionId); saver.set("employee_id", employeeId); saver.set("remark", employee.getString("name")); saver.insert(); } } } }