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<String> 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<String> 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();
|
}
|
}
|
|
}
|
|
}
|