diff --git a/o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Config.java b/o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Config.java index bfb4d94ef20f78de351fcd6f9b4134b260b22ca6..e96ad7cc70c89670b752b0e00e207db12f596494 100644 --- a/o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Config.java +++ b/o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Config.java @@ -77,6 +77,7 @@ public class Config { public static final String PATH_CONFIG_COMMUNICATE = "config/communicate.json"; public static final String PATH_CONFIG_EXMAIL = "config/exmail.json"; public static final String PATH_CONFIG_PORTAL = "config/portal.json"; + public static final String PATH_CONFIG_ORGANIZATION = "config/organization.json"; public static final String PATH_CONFIG_CACHE = "config/cache.json"; public static final String PATH_CONFIG_COMPONENTS = "config/components.json"; public static final String PATH_CONFIG_EMAIL = "config/email.json"; @@ -1193,12 +1194,12 @@ public class Config { public Map customConfig = new HashMap<>(); public static synchronized JsonObject customConfig(String configName) throws Exception { - if(StringUtils.isBlank(configName)){ + if (StringUtils.isBlank(configName)) { return null; - }else{ - if(instance().customConfig.get(configName)==null){ - JsonObject obj = BaseTools.readConfigObject(DIR_CONFIG+"/"+configName+".json", JsonObject.class); - if(obj!=null){ + } else { + if (instance().customConfig.get(configName) == null) { + JsonObject obj = BaseTools.readConfigObject(DIR_CONFIG + "/" + configName + ".json", JsonObject.class); + if (obj != null) { instance().customConfig.put(configName, obj); } } @@ -1206,6 +1207,19 @@ public class Config { } } + private Organization organization; + + public static synchronized Organization organization() throws Exception { + if (null == instance().organization) { + Organization obj = BaseTools.readConfigObject(PATH_CONFIG_ORGANIZATION, Organization.class); + if (null == obj) { + obj = Organization.defaultInstance(); + } + instance().organization = obj; + } + return instance().organization; + } + public static Object resource(String name) throws Exception { return initialContext().lookup(name); } diff --git a/o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Organization.java b/o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Organization.java new file mode 100644 index 0000000000000000000000000000000000000000..e0403ddf2f68765dcc77583723f1fd5409d2a06b --- /dev/null +++ b/o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Organization.java @@ -0,0 +1,37 @@ +package com.x.base.core.project.config; + +import java.io.File; + +import org.apache.commons.io.FileUtils; + +import com.x.base.core.project.annotation.FieldDescribe; +import com.x.base.core.project.gson.XGsonBuilder; +import com.x.base.core.project.tools.BaseTools; +import com.x.base.core.project.tools.DefaultCharset; +import com.x.base.core.project.tools.NumberTools; + +public class Organization extends ConfigObject { + + private static final long serialVersionUID = -2193428649985413384L; + + public final static Integer DEFAULT_UNITLEVELORDERNUMBERDIGITS = 10; + + public static Organization defaultInstance() { + return new Organization(); + } + + @FieldDescribe("unit中unitLevelOrderNumber扩充位数,<=0不扩充.") + private Integer unitLevelOrderNumberDigits = DEFAULT_UNITLEVELORDERNUMBERDIGITS; + + public Integer getUnitLevelOrderNumberDigits() { + return NumberTools.nullOrLessThan(this.unitLevelOrderNumberDigits, 1) ? DEFAULT_UNITLEVELORDERNUMBERDIGITS + : this.unitLevelOrderNumberDigits; + } + + public void save() throws Exception { + File file = new File(Config.base(), Config.PATH_CONFIG_ORGANIZATION); + FileUtils.write(file, XGsonBuilder.toJson(this), DefaultCharset.charset); + BaseTools.executeSyncFile(Config.PATH_CONFIG_ORGANIZATION); + } + +} \ No newline at end of file diff --git a/o2server/x_base_core_project/src/main/java/com/x/base/core/project/organization/Unit.java b/o2server/x_base_core_project/src/main/java/com/x/base/core/project/organization/Unit.java index 95abc0ab5a3cfd300a4eb08eb17eb8c17808b196..4a202291b2ade32d50486127de79e282230f5140 100644 --- a/o2server/x_base_core_project/src/main/java/com/x/base/core/project/organization/Unit.java +++ b/o2server/x_base_core_project/src/main/java/com/x/base/core/project/organization/Unit.java @@ -7,6 +7,8 @@ import com.x.base.core.project.gson.GsonPropertyObject; public class Unit extends GsonPropertyObject { + private static final long serialVersionUID = 5213623128307370812L; + @FieldDescribe("组织名称") private String name; @FieldDescribe("唯一标识") @@ -27,6 +29,8 @@ public class Unit extends GsonPropertyObject { private String superior; @FieldDescribe("排序号") private Integer orderNumber; + @FieldDescribe("层级排序号") + private String levelOrderNumber; @FieldDescribe("企业微信Id") private String qiyeweixinId; @FieldDescribe("钉钉Id") @@ -148,4 +152,12 @@ public class Unit extends GsonPropertyObject { this.zhengwuDingdingId = zhengwuDingdingId; } + public String getLevelOrderNumber() { + return levelOrderNumber; + } + + public void setLevelOrderNumber(String levelOrderNumber) { + this.levelOrderNumber = levelOrderNumber; + } + } diff --git a/o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/factory/UnitFactory.java b/o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/factory/UnitFactory.java index f7c2098703d139d0bb858ec4c2e5832b5935b14f..c51052e84729652ce3c8f7b610641c729271d0d9 100644 --- a/o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/factory/UnitFactory.java +++ b/o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/factory/UnitFactory.java @@ -1,6 +1,11 @@ package com.x.organization.assemble.control.factory; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.Objects; +import java.util.Optional; import java.util.regex.Matcher; import java.util.stream.Collectors; @@ -10,18 +15,20 @@ import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; -import com.x.base.core.project.config.Config; +import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; +import com.x.base.core.project.cache.Cache.CacheCategory; +import com.x.base.core.project.cache.Cache.CacheKey; +import com.x.base.core.project.cache.CacheManager; +import com.x.base.core.project.config.Config; import com.x.base.core.project.tools.ListTools; +import com.x.base.core.project.tools.NumberTools; import com.x.organization.assemble.control.AbstractFactory; import com.x.organization.assemble.control.Business; import com.x.organization.core.entity.PersistenceProperties; import com.x.organization.core.entity.Unit; import com.x.organization.core.entity.Unit_; -import com.x.base.core.project.cache.Cache.CacheCategory; -import com.x.base.core.project.cache.Cache.CacheKey; -import com.x.base.core.project.cache.CacheManager; public class UnitFactory extends AbstractFactory { @@ -113,20 +120,19 @@ public class UnitFactory extends AbstractFactory { } public List sort(List list) throws Exception { - if(Config.person().getPersonUnitOrderByAsc()) { - List os = list.stream().sorted(Comparator.comparing(Unit::getLevel, Comparator.nullsLast(Integer::compareTo)) + if (BooleanUtils.isTrue(Config.person().getPersonUnitOrderByAsc())) { + return list.stream().sorted(Comparator.comparing(Unit::getLevel, Comparator.nullsLast(Integer::compareTo)) .thenComparing(Comparator.comparing(Unit::getOrderNumber, Comparator.nullsLast(Integer::compareTo))) .thenComparing( Comparator.comparing(Unit::getName, Comparator.nullsFirst(String::compareTo)).reversed())) .collect(Collectors.toList()); - return os; - }else{ - List os = list.stream().sorted(Comparator.comparing(Unit::getLevel, Comparator.nullsLast(Integer::compareTo)) - .thenComparing(Comparator.comparing(Unit::getOrderNumber, Comparator.nullsLast(Integer::compareTo)).reversed()) + } else { + return list.stream().sorted(Comparator.comparing(Unit::getLevel, Comparator.nullsLast(Integer::compareTo)) + .thenComparing(Comparator.comparing(Unit::getOrderNumber, Comparator.nullsLast(Integer::compareTo)) + .reversed()) .thenComparing( Comparator.comparing(Unit::getName, Comparator.nullsFirst(String::compareTo)).reversed())) .collect(Collectors.toList()); - return os; } } @@ -213,19 +219,21 @@ public class UnitFactory extends AbstractFactory { os.addAll(this.listSubNestedObject(unit)); for (Unit o : os) { List list = this.listSupNestedObject(o); - /** 级别从1开始 */ + // 级别从1开始 o.setLevel(list.size() + 1); - List names = ListTools.extractProperty(list, "name", String.class, false, false); - // Collections.reverse(names); + List names = ListTools.extractProperty(list, Unit.name_FIELDNAME, String.class, false, false); + List levelOrderNumbers = ListTools.extractProperty(list, Unit.orderNumber_FIELDNAME, Integer.class, + false, false); names.add(o.getName()); + levelOrderNumbers.add(o.getOrderNumber()); o.setLevelName(StringUtils.join(names, PersistenceProperties.Unit.levelNameSplit)); -// List inheritControllerList = new ArrayList<>(); -// for (Unit u : list) { -// if (ListTools.isNotEmpty(u.getControllerList())) { -// inheritControllerList.addAll(u.getControllerList()); -// } -// } -// o.setInheritedControllerList(ListTools.trim(inheritControllerList, true, true)); + List levelOrderNumberStrings = new ArrayList<>(); + final String format = "%0" + Config.organization().getUnitLevelOrderNumberDigits() + "d"; + for (Integer i : levelOrderNumbers) { + // 不支持<0排序 + levelOrderNumberStrings.add(String.format(format, (NumberTools.nullOrLessThan(i, 0) ? 0 : i))); + } + o.setLevelOrderNumber(StringUtils.join(levelOrderNumberStrings, PersistenceProperties.Unit.levelNameSplit)); } } @@ -252,7 +260,7 @@ public class UnitFactory extends AbstractFactory { public List listSubDirect(String id) throws Exception { if (StringUtils.isEmpty(id)) { - return new ArrayList(); + return new ArrayList<>(); } EntityManager em = this.entityManagerContainer().get(Unit.class); CriteriaBuilder cb = em.getCriteriaBuilder(); @@ -285,7 +293,7 @@ public class UnitFactory extends AbstractFactory { public List listSubDirectObject(Unit unit) throws Exception { if (null == unit) { - return new ArrayList(); + return new ArrayList<>(); } EntityManager em = this.entityManagerContainer().get(Unit.class); CriteriaBuilder cb = em.getCriteriaBuilder(); diff --git a/o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/unit/ActionEdit.java b/o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/unit/ActionEdit.java index fa69dcb9d42acb36a8a1f06aa1bb4d1a55f7f19e..9df033a6ac6cc4fb9689cede49db04634e73dfd1 100644 --- a/o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/unit/ActionEdit.java +++ b/o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/unit/ActionEdit.java @@ -44,7 +44,7 @@ class ActionEdit extends BaseAction { Business business = new Business(emc); Wi wi = this.convertToWrapIn(jsonElement, Wi.class); Unit unit = business.unit().pick(flag); - Unit oldUnit = unit; + //Unit oldUnit = unit; boolean checkFlag = false; if (null == unit) { @@ -78,11 +78,13 @@ class ActionEdit extends BaseAction { if (this.duplicateName(business, unit)) { throw new ExceptionDuplicateName(unit.getName()); } - /** 判断是否修改了组织级别或组织名称,如果修改了,需要重新计算当前组织及下属组织的组织级别 */ - checkFlag = this.checkUnitTypeName(oldUnit, unit); - if (checkFlag) { - business.unit().adjustInherit(unit); - } +// /** 判断是否修改了组织级别或组织名称,如果修改了,需要重新计算当前组织及下属组织的组织级别 */ +// checkFlag = this.checkUnitTypeName(oldUnit, unit); +// if (checkFlag) { +// business.unit().adjustInherit(unit); +// } + // 现在由于可能修改了上级组织排序,所以都需要重新计算. + business.unit().adjustInherit(unit); emc.check(unit, CheckPersistType.all); emc.commit(); CacheManager.notify(Unit.class); diff --git a/o2server/x_organization_core_entity/src/main/java/com/x/organization/core/entity/Unit.java b/o2server/x_organization_core_entity/src/main/java/com/x/organization/core/entity/Unit.java index 3b2e7883eda5e1d057d34c1879f88e5df4ba33f1..28699a6c90480aa665d9c46adf9464b52d0583ec 100644 --- a/o2server/x_organization_core_entity/src/main/java/com/x/organization/core/entity/Unit.java +++ b/o2server/x_organization_core_entity/src/main/java/com/x/organization/core/entity/Unit.java @@ -165,6 +165,13 @@ public class Unit extends SliceJpaObject { @Column(length = JpaObject.length_2K, name = ColumnNamePrefix + levelName_FIELDNAME) private String levelName; + public static final String levelOrderNumber_FIELDNAME = "levelOrderNumber"; + @FieldDescribe("层级排序号,使用" + PersistenceProperties.Unit.levelNameSplit + + "进行分割.将逐级unit中的orderNumber的Integer值扩充到在Organization配置中指定位数的文本值,前填充0") + @CheckPersist(allowEmpty = true) + @Column(length = JpaObject.length_255B, name = ColumnNamePrefix + levelOrderNumber_FIELDNAME) + private String levelOrderNumber; + public static final String superior_FIELDNAME = "superior"; @FieldDescribe("上级组织.") @Column(length = JpaObject.length_id, name = ColumnNamePrefix + superior_FIELDNAME) @@ -189,18 +196,6 @@ public class Unit extends SliceJpaObject { @CheckPersist(allowEmpty = true, citationExists = @CitationExist(type = Person.class)) private List controllerList; -// public static final String inheritedControllerList_FIELDNAME = "inheritedControllerList"; -// @FieldDescribe("继承自上级组织的管理人员.") -// @PersistentCollection(fetch = FetchType.EAGER) -// @OrderColumn(name = ORDERCOLUMNCOLUMN) -// @ContainerTable(name = TABLE + ContainerTableNameMiddle -// + inheritedControllerList_FIELDNAME, joinIndex = @Index(name = TABLE + IndexNameMiddle -// + inheritedControllerList_FIELDNAME + JoinIndexNameSuffix)) -// @ElementColumn(length = JpaObject.length_id, name = ColumnNamePrefix + inheritedControllerList_FIELDNAME) -// @ElementIndex(name = TABLE + IndexNameMiddle + inheritedControllerList_FIELDNAME + ElementIndexNameSuffix) -// @CheckPersist(allowEmpty = true, citationExists = @CitationExist(type = Person.class)) -// private List inheritedControllerList; - public static final String dingdingId_FIELDNAME = "dingdingId"; @FieldDescribe("钉钉部门ID.") @Column(length = length_255B, name = ColumnNamePrefix + dingdingId_FIELDNAME) @@ -351,14 +346,6 @@ public class Unit extends SliceJpaObject { this.distinguishedName = distinguishedName; } -// public List getInheritedControllerList() { -// return inheritedControllerList; -// } -// -// public void setInheritedControllerList(List inheritedControllerList) { -// this.inheritedControllerList = inheritedControllerList; -// } - public String getDescription() { return description; } @@ -438,4 +425,12 @@ public class Unit extends SliceJpaObject { public void setWeLinkHash(String weLinkHash) { this.weLinkHash = weLinkHash; } + + public String getLevelOrderNumber() { + return levelOrderNumber; + } + + public void setLevelOrderNumber(String levelOrderNumber) { + this.levelOrderNumber = levelOrderNumber; + } } \ No newline at end of file diff --git a/o2server/x_organization_core_express/src/main/java/com/x/organization/core/express/unit/UnitFactory.java b/o2server/x_organization_core_express/src/main/java/com/x/organization/core/express/unit/UnitFactory.java index 5d82bf006c60b0e5a80433576b2354b8898639f1..aabff113d442f790adf4de0e73d4613f5be86073 100644 --- a/o2server/x_organization_core_express/src/main/java/com/x/organization/core/express/unit/UnitFactory.java +++ b/o2server/x_organization_core_express/src/main/java/com/x/organization/core/express/unit/UnitFactory.java @@ -221,4 +221,14 @@ public class UnitFactory { return (os.get(0).getOrderNumber() == null) ? defaultValue : os.get(0).getOrderNumber(); } } -} + + /** 根据组织获取层级排序号 */ + public String getLevelOrderNumber(String value, String defaultValue) throws Exception { + List os = ActionListObject.execute(context, Arrays.asList(value)); + if (os.isEmpty()) { + return defaultValue; + } else { + return (os.get(0).getLevelOrderNumber() == null) ? defaultValue : os.get(0).getLevelOrderNumber(); + } + } +} \ No newline at end of file diff --git a/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/task/ActionProcessing.java b/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/task/ActionProcessing.java index c0a27ffbf31dadd2a3f2f3fcc376b0719a66c91c..dea560062e7cfe3ca88dd7a84f916278d5cbd00d 100644 --- a/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/task/ActionProcessing.java +++ b/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/task/ActionProcessing.java @@ -268,6 +268,9 @@ class ActionProcessing extends BaseAction { // 记录处理身份所在组织的排序号 record.getProperties().setUnitOrderNumber( business.organization().unit().getOrderNumber(task.getUnit(), Integer.MAX_VALUE)); + // 记录处理身份所在组织层级组织排序号 + record.getProperties().setUnitLevelOrderNumber( + business.organization().unit().getLevelOrderNumber(task.getUnit(), "")); // 记录task中身份所有的组织职务. record.setCompleted(true); record.setType(Record.TYPE_TASK); @@ -320,6 +323,9 @@ class ActionProcessing extends BaseAction { // 记录处理身份所在组织的排序号 record.getProperties().setUnitOrderNumber( business.organization().unit().getOrderNumber(task.getUnit(), Integer.MAX_VALUE)); + // 记录处理身份所在组织层级组织排序号 + record.getProperties() + .setUnitLevelOrderNumber(business.organization().unit().getLevelOrderNumber(task.getUnit(), "")); // 校验workCompleted,如果存在,那么说明工作已经完成,标识状态为已经完成. WorkCompleted workCompleted = emc.firstEqual(WorkCompleted.class, WorkCompleted.job_FIELDNAME, task.getJob()); diff --git a/o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/RecordProperties.java b/o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/RecordProperties.java index 514a4553dc7c9409e0f5f3919965ed37dae5811c..1bc50de69647681989093af87080c893c9fe7a90 100644 --- a/o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/RecordProperties.java +++ b/o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/RecordProperties.java @@ -18,6 +18,9 @@ public class RecordProperties extends JsonProperties { @FieldDescribe("record中记录的处理人身份所在组织排序值.") private Integer unitOrderNumber = null; + @FieldDescribe("record中记录的处理人身份所在组织层级排序值.") + private String unitLevelOrderNumber = ""; + @FieldDescribe("record中记录的处理人身份所拥有的组织职务,向上递归.") private List unitDutyList = new ArrayList<>(); @@ -77,7 +80,7 @@ public class RecordProperties extends JsonProperties { public static class NextManual { public NextManual() { - //nothing + // nothing } @FieldDescribe("活动") @@ -266,4 +269,12 @@ public class RecordProperties extends JsonProperties { this.unitOrderNumber = unitOrderNumber; } + public String getUnitLevelOrderNumber() { + return unitLevelOrderNumber; + } + + public void setUnitLevelOrderNumber(String unitLevelOrderNumber) { + this.unitLevelOrderNumber = unitLevelOrderNumber; + } + }