package foundation.org; import java.util.List; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import foundation.capacity.Actor; import foundation.dao.Filter; import foundation.data.entity.Entity; import foundation.data.entity.EntitySet; import foundation.data.object.DataObject; import foundation.data.object.EntitySaver; import foundation.json.IJSONProvider; import foundation.json.IJSONWriter; import foundation.user.User; import foundation.util.MapList; import foundation.util.Util; public class Org implements IJSONProvider { protected static Logger logger; private String id; private String code; private String name; private String shortName; private boolean master; private Entity entity; private MapList orgAccounts; static { logger = LogManager.getLogger(Org.class); } private Org() { } public static Org getInstance(String orgId) throws Exception { if (Util.isEmpty(orgId)) { logger.error("Org不存在:{}", orgId); return null; } DataObject dataObject = DataObject.getInstance("md_org"); Entity entity = dataObject.getTableEntity(orgId); if (entity == null) { logger.error("Org不存在:{}", orgId); return null; } //1. 加载公司主数据 Org org = new Org(); org.load(entity); //2. 如果是客户,加载客户的开户数据 if (!org.isMaster()) { org.loadOrgAccounts(); } return org; } public void load(Entity entity) throws Exception { id = entity.getString("id"); code = entity.getString("code"); name = entity.getString("name"); shortName = entity.getString("short_name"); master = entity.getBoolean("is_master", false); this.entity = entity; } public void activeAccountFlag() throws Exception { DataObject dataObject = DataObject.getInstance("md_org"); EntitySaver saver = dataObject.createEntitySaver(id); saver.set("is_account", "T"); saver.update(); } public User createAccount(AccountMeta accountMeta) throws Exception { //1. 创建管理员帐号(如果已经有了,重新刷新) User admin = createAdminUser(); //2. 根据帐户类型,授予临时/正式Actor applyActor(accountMeta); //3. 返回 return admin; } public void getCreateAccountDefaultWorks(String accountId, String buId, String companyId, String... suffix) throws Exception { //1. 获取默认仓库, 如果仓库已经存在,不再创建 DataObject dataObject = DataObject.getInstance("wm_warehouse"); Filter filter = new Filter("org_id", id).add("account_id", accountId).add("type_code", "Master"); Entity entity = dataObject.getTableEntity(filter); if (entity != null) { return; } //2. String warehouseName = name; if (suffix != null) { int max = suffix.length; for (int i = 0; i < max; i++) { String segment = suffix[i]; if (Util.isEmpty(segment)) { continue; } warehouseName = warehouseName + "_" + segment; } } entity = dataObject.createTableEntity(true); entity.set("bu_id", buId); entity.set("company_id", companyId); entity.set("type_code", "Master"); entity.set("type_name", "主仓"); entity.set("code", code); entity.set("name", warehouseName + "_主仓"); entity.set("org_id", id); entity.set("org_code", code); entity.set("org_name", name); entity.set("account_id", accountId); entity.set("is_active", "T"); dataObject.insertEntity(entity); } public User getAdminUser() throws Exception { DataObject dataObject = DataObject.getInstance("sys_user"); Filter filter = new Filter("org_id", id); filter.add("name", "admin"); Entity entity = dataObject.getTableEntity(filter); if (entity == null) { return null; } User user = new User(); user.load(entity); return user; } private User createAdminUser() throws Exception { DataObject dataObject = DataObject.getInstance("sys_user"); Filter filter = new Filter("org_id", id); filter.add("code", "admin"); Entity entity = dataObject.getTableEntity(filter); if (entity == null) { entity = dataObject.createTableEntity(true); entity.set("id", code + ".admin"); entity.set("org_id", id); entity.set("code", "admin"); entity.set("name", code + ".admin"); entity.set("password", code); entity.set("is_active", "T"); entity.set("remark", code + "-admin"); dataObject.insertEntity(entity); } else { dataObject.updateEntity(entity); } User user = new User(); user.load(entity); return user; } private void applyActor(AccountMeta accountMeta) throws Exception { //1. 清除现有公司角色 DataObject dataObject = DataObject.getInstance("sys_right_actor_target"); Filter filter = new Filter("type_code", Actor.Code_Org).add("target_id", id); dataObject.deleteEntity(filter); //2. 插入新角色(开户后可能给该公司分配多个用户角色) Mastership mastership = accountMeta.getMastership(); List actors = accountMeta.getActors(); for (String actorId: actors) { Entity one = dataObject.createTableEntity(true); one.set("type_code", Actor.Code_Org); one.set("actor_id", actorId); one.set("company_id", mastership.getCompanyId()); one.set("bu_id", mastership.getBUId()); one.set("org_id", accountMeta.getOrgId()); one.set("target_id", accountMeta.getAccountId()); dataObject.insertEntity(one); } } public boolean isFrozen() { try { DataObject dataObject = DataObject.getInstance("md_org"); Entity entity = dataObject.getTableEntity(id); return entity.getBoolean("is_frozen", false); } catch (Exception e) { return false; } } public void freeze() throws Exception { DataObject dataObject = DataObject.getInstance("md_org"); EntitySaver saver = dataObject.createEntitySaver(id); saver.set("is_frozen", true); saver.update(); } public void unfreeze() throws Exception { DataObject dataObject = DataObject.getInstance("md_org"); EntitySaver saver = dataObject.createEntitySaver(id); saver.set("is_frozen", false); saver.update(); } private void loadOrgAccounts() throws Exception { DataObject dataObject = DataObject.getInstance("md_org_account"); Filter filter = new Filter("org_id", id).add("state_code <> 'Input'"); EntitySet entitySet = dataObject.getTableEntitySet(filter); if (entitySet.isEmpty()) { return; } if (orgAccounts == null) { orgAccounts = new MapList(); } else { orgAccounts.clear(); } for (Entity entity: entitySet) { OrgAccount orgAccount = new OrgAccount(); orgAccount.load(entity); orgAccounts.add(orgAccount.getId(), orgAccount); } } public String getId() { return id; } public String getCode() { return code; } public String getName() { return name; } public String getShortName() { return shortName; } public boolean isMaster() { return master; } public Entity getEntity() { return entity; } public List getOrgAccounts() { if (orgAccounts == null) { return null; } return orgAccounts.getItemList(); } @Override public void writeJSON(IJSONWriter writer) { writer.beginObject("org"); writeJSONBody(writer); writer.endObject(); } public void writeJSONBody(IJSONWriter writer) { writer.write("id", id); writer.write("code", code); writer.write("name", name); } }