Просмотр исходного кода

Merge branch 'wrdp' into 'release'

Wrdp

See merge request o2oa/o2oa!2436
胡起 5 лет назад
Родитель
Сommit
dbf223dea9
24 измененных файлов с 320 добавлено и 181 удалено
  1. 6 6
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/Business.java
  2. 7 7
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/factory/UnitFactory.java
  3. 2 2
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/person/ActionDelete.java
  4. 2 2
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/person/ActionListPinyinInitial.java
  5. 7 2
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/person/BaseAction.java
  6. 14 11
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/unit/ActionCreate.java
  7. 37 31
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/unit/ActionEdit.java
  8. 5 5
      o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/factory/UnitFactory.java
  9. 40 18
      o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/person/ActionListWithUnitSubDirectLikeObject.java
  10. 25 15
      o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/person/ActionListWithUnitSubDirectObject.java
  11. 44 22
      o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/person/ActionListWithUnitSubNestedLikeObject.java
  12. 21 14
      o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/person/ActionListWithUnitSubNestedObject.java
  13. 6 2
      o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/unit/ActionListObject.java
  14. 5 5
      o2server/x_organization_assemble_personal/src/main/java/com/x/organization/assemble/personal/factory/UnitFactory.java
  15. 18 18
      o2server/x_organization_core_entity/src/main/java/com/x/organization/core/entity/Unit.java
  16. 7 7
      o2server/x_program_center/src/main/java/com/x/program/center/factory/UnitFactory.java
  17. 7 1
      o2server/x_query_assemble_surface/src/main/java/com/x/query/assemble/surface/jaxrs/statement/BaseAction.java
  18. 1 1
      o2web/source/o2_core/o2.js
  19. 4 2
      o2web/source/o2_core/o2/xScript/Environment.js
  20. 12 2
      o2web/source/x_component_Selector/Person.js
  21. 2 2
      o2web/source/x_component_cms_Xform/Form.js
  22. 4 4
      o2web/source/x_component_process_Work/Processor.js
  23. 43 1
      o2web/source/x_component_process_Xform/Form.js
  24. 1 1
      o2web/source/x_component_process_Xform/Org.js

+ 6 - 6
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/Business.java

@@ -53,8 +53,8 @@ public class Business {
 
 	public Business(EntityManagerContainer emc) throws Exception {
 		this.emc = emc;
-		this.cacheCategory = new CacheCategory(Group.class, Role.class, Person.class, PersonAttribute.class,
-				Unit.class, UnitDuty.class, UnitAttribute.class, Identity.class);
+		this.cacheCategory = new CacheCategory(Group.class, Role.class, Person.class, PersonAttribute.class, Unit.class,
+				UnitDuty.class, UnitAttribute.class, Identity.class);
 	}
 
 	public EntityManagerContainer entityManagerContainer() {
@@ -128,9 +128,9 @@ public class Business {
 
 	public RoleFactory role() throws ExceptionRoleFactory {
 		if (null == this.role) {
-			try{
+			try {
 				this.role = new RoleFactory(this);
-			} catch (Exception e){
+			} catch (Exception e) {
 				throw new ExceptionRoleFactory(e);
 			}
 		}
@@ -214,8 +214,8 @@ public class Business {
 				return true;
 			}
 		}
-		if (ListTools.isNotEmpty(unit.getInheritedControllerList())) {
-			List<Person> os = this.person().pick(unit.getInheritedControllerList());
+		for (Unit u : unit().pick(unit().listSupNested(unit.getId()))) {
+			List<Person> os = this.person().pick(u.getControllerList());
 			List<String> list = ListTools.extractProperty(os, JpaObject.DISTINGUISHEDNAME, String.class, true, true);
 			if (ListTools.contains(list, effectivePerson.getDistinguishedName())) {
 				return true;

+ 7 - 7
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/factory/UnitFactory.java

@@ -219,13 +219,13 @@ public class UnitFactory extends AbstractFactory {
 			// Collections.reverse(names);
 			names.add(o.getName());
 			o.setLevelName(StringUtils.join(names, PersistenceProperties.Unit.levelNameSplit));
-			List<String> inheritControllerList = new ArrayList<>();
-			for (Unit u : list) {
-				if (ListTools.isNotEmpty(u.getControllerList())) {
-					inheritControllerList.addAll(u.getControllerList());
-				}
-			}
-			o.setInheritedControllerList(ListTools.trim(inheritControllerList, true, true));
+//			List<String> inheritControllerList = new ArrayList<>();
+//			for (Unit u : list) {
+//				if (ListTools.isNotEmpty(u.getControllerList())) {
+//					inheritControllerList.addAll(u.getControllerList());
+//				}
+//			}
+//			o.setInheritedControllerList(ListTools.trim(inheritControllerList, true, true));
 		}
 	}
 

+ 2 - 2
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/person/ActionDelete.java

@@ -149,11 +149,11 @@ class ActionDelete extends BaseAction {
 		CriteriaQuery<Unit> cq = cb.createQuery(Unit.class);
 		Root<Unit> root = cq.from(Unit.class);
 		Predicate p = cb.isMember(person.getId(), root.get(Unit_.controllerList));
-		p = cb.or(cb.isMember(person.getId(), root.get(Unit_.inheritedControllerList)));
+		//p = cb.or(cb.isMember(person.getId(), root.get(Unit_.inheritedControllerList)));
 		List<Unit> os = em.createQuery(cq.select(root).where(p)).getResultList().stream().distinct().collect(Collectors.toList());
 		for (Unit o : os) {
 			o.getControllerList().remove(person.getId());
-			o.getInheritedControllerList().remove(person.getId());
+			//o.getInheritedControllerList().remove(person.getId());
 		}
 	}
 

+ 2 - 2
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/person/ActionListPinyinInitial.java

@@ -18,6 +18,8 @@ import com.x.base.core.container.factory.EntityManagerContainerFactory;
 import com.x.base.core.project.annotation.FieldDescribe;
 import com.x.base.core.project.bean.WrapCopier;
 import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.cache.Cache.CacheKey;
+import com.x.base.core.project.cache.CacheManager;
 import com.x.base.core.project.gson.GsonPropertyObject;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
@@ -26,8 +28,6 @@ import com.x.base.core.project.tools.StringTools;
 import com.x.organization.assemble.control.Business;
 import com.x.organization.core.entity.Person;
 import com.x.organization.core.entity.Person_;
-import com.x.base.core.project.cache.Cache.CacheKey;
-import com.x.base.core.project.cache.CacheManager;
 
 class ActionListPinyinInitial extends BaseAction {
 

+ 7 - 2
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/person/BaseAction.java

@@ -1,5 +1,6 @@
 package com.x.organization.assemble.control.jaxrs.person;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -162,12 +163,16 @@ abstract class BaseAction extends StandardJaxrsAction {
 			if (null != person && t.getControllerList().contains(person.getId())) {
 				List<Identity> identities = this.listIdentity(business, t);
 				List<Unit> units = this.listUnit(business, identities);
+				List<Unit> supUnits = new ArrayList<>();
+				for (Unit u : units) {
+					supUnits.addAll(business.unit().listSupNestedObject(u));
+				}
+				units.addAll(supUnits);
 				if (ListTools.isNotEmpty(units)) {
 					allowEdit = false;
 					allowDelete = true;
 					for (Unit o : units) {
-						if (o.getControllerList().contains(person.getId())
-								|| o.getInheritedControllerList().contains(person.getId())) {
+						if (o.getControllerList().contains(person.getId())) {
 							allowEdit = true;
 						} else {
 							allowDelete = false;

+ 14 - 11
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/unit/ActionCreate.java

@@ -22,7 +22,7 @@ import org.apache.commons.lang3.StringUtils;
 
 class ActionCreate extends BaseAction {
 	private static Logger logger = LoggerFactory.getLogger(ActionCreate.class);
-	
+
 	ActionResult<Wo> execute(EffectivePerson effectivePerson, JsonElement jsonElement) throws Exception {
 		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
 			ActionResult<Wo> result = new ActionResult<>();
@@ -55,7 +55,7 @@ class ActionCreate extends BaseAction {
 			if (this.duplicateUniqueWhenNotEmpty(business, unit)) {
 				throw new ExceptionDuplicateUnique(unit.getName(), unit.getUnique());
 			}
-			if (this.checkNameInvalid(business,unit)){
+			if (this.checkNameInvalid(business, unit)) {
 				throw new ExceptionNameInvalid(unit.getName());
 			}
 			/** 判断同一级别下name不重复 */
@@ -64,14 +64,14 @@ class ActionCreate extends BaseAction {
 			}
 			emc.beginTransaction(Unit.class);
 			business.unit().adjustInherit(unit);
-			emc.persist(unit,CheckPersistType.all);
+			emc.persist(unit, CheckPersistType.all);
 			emc.commit();
 			CacheManager.notify(Unit.class);
-			
-			/**创建 组织变更org消息通信 */
-			OrgMessageFactory  orgMessageFactory = new OrgMessageFactory();
+
+			/** 创建 组织变更org消息通信 */
+			OrgMessageFactory orgMessageFactory = new OrgMessageFactory();
 			orgMessageFactory.createMessageCommunicate("add", "unit", unit, effectivePerson);
-			
+
 			Wo wo = new Wo();
 			wo.setId(unit.getId());
 			result.setData(wo);
@@ -86,11 +86,14 @@ class ActionCreate extends BaseAction {
 
 		private static final long serialVersionUID = -6314932919066148113L;
 
+//		static WrapCopier<Wi, Unit> copier = WrapCopierFactory.wi(Wi.class, Unit.class, null,
+//				ListTools.toList(JpaObject.FieldsUnmodify, Unit.pinyin_FIELDNAME,
+//						Unit.pinyinInitial_FIELDNAME, Unit.level_FIELDNAME, Unit.levelName_FIELDNAME,
+//						Unit.inheritedControllerList_FIELDNAME));
+
 		static WrapCopier<Wi, Unit> copier = WrapCopierFactory.wi(Wi.class, Unit.class, null,
-				ListTools.toList(JpaObject.FieldsUnmodify, Unit.pinyin_FIELDNAME,
-						Unit.pinyinInitial_FIELDNAME, Unit.level_FIELDNAME, Unit.levelName_FIELDNAME,
-						Unit.inheritedControllerList_FIELDNAME));
+				ListTools.toList(JpaObject.FieldsUnmodify, Unit.pinyin_FIELDNAME, Unit.pinyinInitial_FIELDNAME,
+						Unit.level_FIELDNAME, Unit.levelName_FIELDNAME));
 	}
-	
 
 }

+ 37 - 31
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/unit/ActionEdit.java

@@ -46,7 +46,7 @@ class ActionEdit extends BaseAction {
 			Unit unit = business.unit().pick(flag);
 			Unit oldUnit = unit;
 			boolean checkFlag = false;
-			
+
 			if (null == unit) {
 				throw new ExceptionUnitNotExist(flag);
 			}
@@ -62,15 +62,16 @@ class ActionEdit extends BaseAction {
 			unit = emc.find(unit.getId(), Unit.class);
 			Gson gsontool = new Gson();
 			String strOriginalUnit = gsontool.toJson(unit);
-			
-			unit.setControllerList(ListTools.extractProperty(business.person().pick(ListTools.trim(unit.getControllerList(), true, true)),
+
+			unit.setControllerList(ListTools.extractProperty(
+					business.person().pick(ListTools.trim(unit.getControllerList(), true, true)),
 					JpaObject.id_FIELDNAME, String.class, true, true));
 			Wi.copier.copy(wi, unit);
 			/** 如果唯一标识不为空,要检查唯一标识是否唯一 */
 			if (this.duplicateUniqueWhenNotEmpty(business, unit)) {
 				throw new ExceptionDuplicateUnique(unit.getName(), unit.getUnique());
 			}
-			if (this.checkNameInvalid(business,unit)){
+			if (this.checkNameInvalid(business, unit)) {
 				throw new ExceptionNameInvalid(unit.getName());
 			}
 			/** 判断同一级别下name不重复 */
@@ -78,23 +79,23 @@ class ActionEdit extends BaseAction {
 				throw new ExceptionDuplicateName(unit.getName());
 			}
 			/** 判断是否修改了组织级别或组织名称,如果修改了,需要重新计算当前组织及下属组织的组织级别 */
-			checkFlag = this.checkUnitTypeName(oldUnit,unit);
-			if(checkFlag){
+			checkFlag = this.checkUnitTypeName(oldUnit, unit);
+			if (checkFlag) {
 				business.unit().adjustInherit(unit);
 			}
 			emc.check(unit, CheckPersistType.all);
 			emc.commit();
 			CacheManager.notify(Unit.class);
-			
+
 			/** 判断是否修改了组织级别或组织名称,如果修改了,需要重新计算当前组织及下属组织成员的身份(组织名称,组织级别名称) */
-			if(checkFlag){
+			if (checkFlag) {
 				this.updateIdentityUnitNameAndUnitLevelName(effectivePerson, flag, jsonElement);
 			}
 
-			/**创建 组织变更org消息通信 */
-			OrgMessageFactory  orgMessageFactory = new OrgMessageFactory();
-			orgMessageFactory.createMessageCommunicate("modfiy", "unit",strOriginalUnit, unit, effectivePerson);
-			
+			/** 创建 组织变更org消息通信 */
+			OrgMessageFactory orgMessageFactory = new OrgMessageFactory();
+			orgMessageFactory.createMessageCommunicate("modfiy", "unit", strOriginalUnit, unit, effectivePerson);
+
 			Wo wo = new Wo();
 			wo.setId(unit.getId());
 			result.setData(wo);
@@ -111,18 +112,23 @@ class ActionEdit extends BaseAction {
 
 		private static final long serialVersionUID = -7527954993386512109L;
 
-		//		static WrapCopier<Wi, Unit> copier = WrapCopierFactory.wi(Wi.class, Unit.class, null,
-		//				ListTools.toList(JpaObject.FieldsUnmodify, Unit.superior_FIELDNAME, Unit.pinyin_FIELDNAME,
-		//						Unit.pinyinInitial_FIELDNAME, Unit.level_FIELDNAME, Unit.levelName_FIELDNAME,
-		//						Unit.inheritedControllerList_FIELDNAME));
+		// static WrapCopier<Wi, Unit> copier = WrapCopierFactory.wi(Wi.class,
+		// Unit.class, null,
+		// ListTools.toList(JpaObject.FieldsUnmodify, Unit.superior_FIELDNAME,
+		// Unit.pinyin_FIELDNAME,
+		// Unit.pinyinInitial_FIELDNAME, Unit.level_FIELDNAME, Unit.levelName_FIELDNAME,
+		// Unit.inheritedControllerList_FIELDNAME));
+//		static WrapCopier<Wi, Unit> copier = WrapCopierFactory.wi(Wi.class, Unit.class, null,
+//				ListTools.toList(JpaObject.FieldsUnmodify, Unit.pinyin_FIELDNAME, Unit.pinyinInitial_FIELDNAME, Unit.level_FIELDNAME,
+//						Unit.levelName_FIELDNAME, Unit.inheritedControllerList_FIELDNAME));
 		static WrapCopier<Wi, Unit> copier = WrapCopierFactory.wi(Wi.class, Unit.class, null,
-				ListTools.toList(JpaObject.FieldsUnmodify, Unit.pinyin_FIELDNAME, Unit.pinyinInitial_FIELDNAME, Unit.level_FIELDNAME,
-						Unit.levelName_FIELDNAME, Unit.inheritedControllerList_FIELDNAME));
+				ListTools.toList(JpaObject.FieldsUnmodify, Unit.pinyin_FIELDNAME, Unit.pinyinInitial_FIELDNAME,
+						Unit.level_FIELDNAME, Unit.levelName_FIELDNAME));
 	}
 
-	//根据组织标志列出身份列表
+	// 根据组织标志列出身份列表
 	private List<Identity> listIdentityByUnitFlag(Business business, Unit unit) throws Exception {
-		//Unit unit = business.unit().pick(unitFlag);
+		// Unit unit = business.unit().pick(unitFlag);
 		if (null == unit.getId() || StringUtils.isEmpty(unit.getId()) || null == unit) {
 			throw new ExceptionUnitNotExist(unit.getId());
 		}
@@ -135,9 +141,9 @@ class ActionEdit extends BaseAction {
 		return os;
 	}
 
-	//列出所有递归下级组织(包含当前组织)
+	// 列出所有递归下级组织(包含当前组织)
 	private List<Unit> listUnit(Business business, String flag) throws Exception {
-		//Unit unit = business.unit().pick(flag);
+		// Unit unit = business.unit().pick(flag);
 
 		EntityManager em = business.entityManagerContainer().get(Unit.class);
 		CriteriaBuilder cb = em.getCriteriaBuilder();
@@ -158,17 +164,18 @@ class ActionEdit extends BaseAction {
 			throw new ExceptionUnitNotExist(flag);
 		}
 
-		//所有下级组织
+		// 所有下级组织
 		List<Unit> os = business.unit().listSubNestedObject(unit);
 
-		//把当前组织加入到os
+		// 把当前组织加入到os
 		List<Unit> _currentUnitSingleArray = new ArrayList<Unit>();
 		_currentUnitSingleArray.add(unit);
 		os = ListTools.add(_currentUnitSingleArray, true, true, os);
 		return os;
 	}
 
-	void updateIdentityUnitNameAndUnitLevelName(EffectivePerson effectivePerson, String flag, JsonElement jsonElement) throws Exception {
+	void updateIdentityUnitNameAndUnitLevelName(EffectivePerson effectivePerson, String flag, JsonElement jsonElement)
+			throws Exception {
 		CacheManager.notify(Unit.class);
 		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
 			Business business = new Business(emc);
@@ -185,7 +192,7 @@ class ActionEdit extends BaseAction {
 			}
 			/*
 			 * 同时更新unit下的所有身份的UnitLevelName,UnitName
-			 * */
+			 */
 			List<Unit> unitList = this.listUnit(business, flag);
 
 			for (Unit u : unitList) {
@@ -209,17 +216,16 @@ class ActionEdit extends BaseAction {
 
 		}
 	}
-	
+
 	private boolean checkUnitTypeName(Unit oldUnit, Unit unit) throws Exception {
 		List<String> oldUnitType = oldUnit.getTypeList();
 		List<String> unitType = unit.getTypeList();
-		//判断两个list是否相同
-		if (oldUnitType.retainAll(unitType) || (!StringUtils.equals(oldUnit.getName(), unit.getName())) || (!StringUtils.equals(oldUnit.getSuperior(), unit.getSuperior()))) {
+		// 判断两个list是否相同
+		if (oldUnitType.retainAll(unitType) || (!StringUtils.equals(oldUnit.getName(), unit.getName()))
+				|| (!StringUtils.equals(oldUnit.getSuperior(), unit.getSuperior()))) {
 			return true;
 		}
 		return false;
 	}
-	
-	
 
 }

+ 5 - 5
o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/factory/UnitFactory.java

@@ -221,11 +221,11 @@ public class UnitFactory extends AbstractFactory {
 			names = names.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
 			names.add(o.getName());
 			o.setLevelName(StringUtils.join(names, "/"));
-			List<String> inheritControllerList = new ArrayList<>();
-			for (Unit u : list) {
-				inheritControllerList.addAll(u.getControllerList());
-			}
-			o.setInheritedControllerList(ListTools.trim(inheritControllerList, true, true));
+//			List<String> inheritControllerList = new ArrayList<>();
+//			for (Unit u : list) {
+//				inheritControllerList.addAll(u.getControllerList());
+//			}
+//			o.setInheritedControllerList(ListTools.trim(inheritControllerList, true, true));
 		}
 	}
 

+ 40 - 18
o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/person/ActionListWithUnitSubDirectLikeObject.java

@@ -1,8 +1,6 @@
 package com.x.organization.assemble.express.jaxrs.person;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Optional;
+import java.util.*;
 import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
@@ -82,39 +80,63 @@ class ActionListWithUnitSubDirectLikeObject extends BaseAction {
 
 	}
 
-	private List<Wo> list(Business business, Wi wi, List<String> ids) throws Exception {
+	private List<Wo> list(Business business, Wi wi, List<Identity> identityList) throws Exception {
 		List<Wo> wos = new ArrayList<>();
-		String str = StringUtils.lowerCase(StringTools.escapeSqlLikeKey(wi.getKey()));
 		EntityManager em = business.entityManagerContainer().get(Person.class);
 		CriteriaBuilder cb = em.getCriteriaBuilder();
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<Person> root = cq.from(Person.class);
-		Predicate p = cb.like(cb.lower(root.get(Person_.name)), "%" + str + "%", StringTools.SQL_ESCAPE_CHAR);
-		p = cb.or(p, cb.like(cb.lower(root.get(Person_.unique)), "%" + str + "%", StringTools.SQL_ESCAPE_CHAR));
-		p = cb.or(p, cb.like(cb.lower(root.get(Person_.pinyin)), str + "%", StringTools.SQL_ESCAPE_CHAR));
-		p = cb.or(p, cb.like(cb.lower(root.get(Person_.pinyinInitial)), str + "%", StringTools.SQL_ESCAPE_CHAR));
-		p = cb.or(p, cb.like(cb.lower(root.get(Person_.mobile)), str + "%", StringTools.SQL_ESCAPE_CHAR));
-		p = cb.or(p, cb.like(cb.lower(root.get(Person_.distinguishedName)), str + "%", StringTools.SQL_ESCAPE_CHAR));
-		p = cb.and(p, cb.isMember(root.get(Person_.id), cb.literal(ids)));
+		Predicate p = cb.conjunction();
+		if(StringUtils.isNotBlank(wi.getKey())) {
+			String str = StringUtils.lowerCase(StringTools.escapeSqlLikeKey(wi.getKey()));
+			p = cb.like(cb.lower(root.get(Person_.name)), "%" + str + "%", StringTools.SQL_ESCAPE_CHAR);
+			p = cb.or(p, cb.like(cb.lower(root.get(Person_.unique)), "%" + str + "%", StringTools.SQL_ESCAPE_CHAR));
+			p = cb.or(p, cb.like(cb.lower(root.get(Person_.pinyin)), str + "%", StringTools.SQL_ESCAPE_CHAR));
+			p = cb.or(p, cb.like(cb.lower(root.get(Person_.pinyinInitial)), str + "%", StringTools.SQL_ESCAPE_CHAR));
+			p = cb.or(p, cb.like(cb.lower(root.get(Person_.mobile)), str + "%", StringTools.SQL_ESCAPE_CHAR));
+			p = cb.or(p, cb.like(cb.lower(root.get(Person_.distinguishedName)), str + "%", StringTools.SQL_ESCAPE_CHAR));
+		}
+		Map<String,Integer> map = new HashMap<>();
+		if(ListTools.isNotEmpty(identityList)) {
+			for(Identity identity : identityList){
+				map.put(identity.getPerson(), identity.getOrderNumber());
+			}
+			p = cb.and(p, cb.isMember(root.get(Person_.id), cb.literal(map.keySet())));
+		}
 		List<String> list = em.createQuery(cq.select(root.get(Person_.id)).where(p))
 				.getResultList().stream().distinct().collect(Collectors.toList());
 		for (Person o : business.person().pick(list)) {
+			if(!map.isEmpty()){
+				o.setOrderNumber(map.get(o.getId()));
+			}
 			wos.add(this.convert(business, o, Wo.class));
 		}
+		wos = wos.stream()
+				.sorted(Comparator.comparing(Wo::getOrderNumber, Comparator.nullsLast(Integer::compareTo))
+						.thenComparing(Comparator
+								.comparing(Wo::getName, Comparator.nullsFirst(String::compareTo)).reversed()))
+				.collect(Collectors.toList());
 		return wos;
 	}
 
-	private List<String> people(Business business, Wi wi) throws Exception {
-		List<Unit> os = business.unit().pick(wi.getUnitList());
-		List<String> unitIds = ListTools.extractField(os, Unit.id_FIELDNAME, String.class, true, true);
-		EntityManager em = business.entityManagerContainer().get(Identity.class);
+	private List<Identity> people(Business business, Wi wi) throws Exception {
+		List<Identity> list = new ArrayList<>();
+		if(ListTools.isNotEmpty(wi.getUnitList())) {
+			List<Unit> os = business.unit().pick(wi.getUnitList());
+			List<String> unitIds = ListTools.extractField(os, Unit.id_FIELDNAME, String.class, true, true);
+			if (ListTools.isNotEmpty(unitIds)) {
+				list = business.entityManagerContainer().fetchIn(Identity.class,
+						ListTools.toList(Identity.id_FIELDNAME, Identity.person_FIELDNAME, Identity.orderNumber_FIELDNAME), Identity.unit_FIELDNAME, unitIds);
+			}
+		}
+		/*EntityManager em = business.entityManagerContainer().get(Identity.class);
 		CriteriaBuilder cb = em.getCriteriaBuilder();
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<Identity> root = cq.from(Identity.class);
 		Predicate p = root.get(Identity_.unit).in(unitIds);
 		List<String> list = em.createQuery(cq.select(root.get(Identity_.person)).where(p))
-				.getResultList().stream().distinct().collect(Collectors.toList());
+				.getResultList().stream().distinct().collect(Collectors.toList());*/
 		return list;
 	}
 
-}
+}

+ 25 - 15
o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/person/ActionListWithUnitSubDirectObject.java

@@ -1,8 +1,6 @@
 package com.x.organization.assemble.express.jaxrs.person;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Optional;
+import java.util.*;
 import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
@@ -72,20 +70,32 @@ class ActionListWithUnitSubDirectObject extends BaseAction {
 		List<Unit> os = business.unit().pick(wi.getUnitList());
 		List<String> unitIds = new ArrayList<>();
 		for (Unit o : os) {
-			unitIds.add(o.getId());
+			if(!unitIds.contains(o.getId())) {
+				unitIds.add(o.getId());
+			}
+		}
+		unitIds = ListTools.trim(unitIds, true, true);
+		List<Identity> list = new ArrayList<>();
+		if(ListTools.isNotEmpty(unitIds)) {
+			list = business.entityManagerContainer().fetchIn(Identity.class,
+					ListTools.toList(Identity.id_FIELDNAME, Identity.person_FIELDNAME, Identity.orderNumber_FIELDNAME), Identity.unit_FIELDNAME, unitIds);
 		}
-		EntityManager em = business.entityManagerContainer().get(Identity.class);
-		CriteriaBuilder cb = em.getCriteriaBuilder();
-		CriteriaQuery<String> cq = cb.createQuery(String.class);
-		Root<Identity> root = cq.from(Identity.class);
-		Predicate p = root.get(Identity_.unit).in(unitIds);
-		List<String> personIds = em.createQuery(cq.select(root.get(Identity_.person)).where(p))
-				.getResultList().stream().distinct().collect(Collectors.toList());
-		personIds = ListTools.trim(personIds, true, true);
-		for (Person o : business.person().pick(personIds)) {
-			wos.add(this.convert(business, o, Wo.class));
+		if(ListTools.isNotEmpty(list)) {
+			Map<String,Integer> map = new HashMap<>();
+			for(Identity identity : list){
+				map.put(identity.getPerson(), identity.getOrderNumber());
+			}
+			for (Person o : business.person().pick(new ArrayList<>(map.keySet()))) {
+				o.setOrderNumber(map.get(o.getId()));
+				wos.add(this.convert(business, o, Wo.class));
+			}
+			wos = wos.stream()
+					.sorted(Comparator.comparing(Wo::getOrderNumber, Comparator.nullsLast(Integer::compareTo))
+							.thenComparing(Comparator
+									.comparing(Wo::getName, Comparator.nullsFirst(String::compareTo)).reversed()))
+					.collect(Collectors.toList());
 		}
 		return wos;
 	}
 
-}
+}

+ 44 - 22
o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/person/ActionListWithUnitSubNestedLikeObject.java

@@ -1,8 +1,6 @@
 package com.x.organization.assemble.express.jaxrs.person;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Optional;
+import java.util.*;
 import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
@@ -82,44 +80,68 @@ class ActionListWithUnitSubNestedLikeObject extends BaseAction {
 
 	}
 
-	private List<Wo> list(Business business, Wi wi, List<String> ids) throws Exception {
+	private List<Wo> list(Business business, Wi wi, List<Identity> identityList) throws Exception {
 		List<Wo> wos = new ArrayList<>();
-		String str = StringUtils.lowerCase(StringTools.escapeSqlLikeKey(wi.getKey()));
 		EntityManager em = business.entityManagerContainer().get(Person.class);
 		CriteriaBuilder cb = em.getCriteriaBuilder();
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<Person> root = cq.from(Person.class);
-		Predicate p = cb.like(cb.lower(root.get(Person_.name)), "%" + str + "%", StringTools.SQL_ESCAPE_CHAR);
-		p = cb.or(p, cb.like(cb.lower(root.get(Person_.unique)), "%" + str + "%", StringTools.SQL_ESCAPE_CHAR));
-		p = cb.or(p, cb.like(cb.lower(root.get(Person_.pinyin)), str + "%", StringTools.SQL_ESCAPE_CHAR));
-		p = cb.or(p, cb.like(cb.lower(root.get(Person_.pinyinInitial)), str + "%", StringTools.SQL_ESCAPE_CHAR));
-		p = cb.or(p, cb.like(cb.lower(root.get(Person_.mobile)), str + "%", StringTools.SQL_ESCAPE_CHAR));
-		p = cb.or(p, cb.like(cb.lower(root.get(Person_.distinguishedName)), str + "%", StringTools.SQL_ESCAPE_CHAR));
-		p = cb.and(p, cb.isMember(root.get(Person_.id), cb.literal(ids)));
+		Predicate p = cb.conjunction();
+		if(StringUtils.isNotBlank(wi.getKey())) {
+			String str = StringUtils.lowerCase(StringTools.escapeSqlLikeKey(wi.getKey()));
+			p = cb.like(cb.lower(root.get(Person_.name)), "%" + str + "%", StringTools.SQL_ESCAPE_CHAR);
+			p = cb.or(p, cb.like(cb.lower(root.get(Person_.unique)), "%" + str + "%", StringTools.SQL_ESCAPE_CHAR));
+			p = cb.or(p, cb.like(cb.lower(root.get(Person_.pinyin)), str + "%", StringTools.SQL_ESCAPE_CHAR));
+			p = cb.or(p, cb.like(cb.lower(root.get(Person_.pinyinInitial)), str + "%", StringTools.SQL_ESCAPE_CHAR));
+			p = cb.or(p, cb.like(cb.lower(root.get(Person_.mobile)), str + "%", StringTools.SQL_ESCAPE_CHAR));
+			p = cb.or(p, cb.like(cb.lower(root.get(Person_.distinguishedName)), str + "%", StringTools.SQL_ESCAPE_CHAR));
+		}
+		Map<String,Integer> map = new HashMap<>();
+		if(ListTools.isNotEmpty(identityList)) {
+			for(Identity identity : identityList){
+				map.put(identity.getPerson(), identity.getOrderNumber());
+			}
+			p = cb.and(p, cb.isMember(root.get(Person_.id), cb.literal(map.keySet())));
+		}
 		List<String> list = em.createQuery(cq.select(root.get(Person_.id)).where(p))
 				.getResultList().stream().distinct().collect(Collectors.toList());
 		for (Person o : business.person().pick(list)) {
+			if(!map.isEmpty()){
+				o.setOrderNumber(map.get(o.getId()));
+			}
 			wos.add(this.convert(business, o, Wo.class));
 		}
+		wos = wos.stream()
+				.sorted(Comparator.comparing(Wo::getOrderNumber, Comparator.nullsLast(Integer::compareTo))
+						.thenComparing(Comparator
+								.comparing(Wo::getName, Comparator.nullsFirst(String::compareTo)).reversed()))
+				.collect(Collectors.toList());
 		return wos;
 	}
 
-	private List<String> people(Business business, Wi wi) throws Exception {
-		List<Unit> os = business.unit().pick(wi.getUnitList());
-		List<String> unitIds = new ArrayList<>();
-		for (Unit o : os) {
-			unitIds.add(o.getId());
-			unitIds.addAll(business.unit().listSubNested(o.getId()));
+	private List<Identity> people(Business business, Wi wi) throws Exception {
+		List<Identity> list = new ArrayList<>();
+		if(ListTools.isNotEmpty(wi.getUnitList())) {
+			List<Unit> os = business.unit().pick(wi.getUnitList());
+			List<String> unitIds = new ArrayList<>();
+			for (Unit o : os) {
+				unitIds.add(o.getId());
+				unitIds.addAll(business.unit().listSubNested(o.getId()));
+			}
+			unitIds = ListTools.trim(unitIds, true, true);
+			if (ListTools.isNotEmpty(unitIds)) {
+				list = business.entityManagerContainer().fetchIn(Identity.class,
+						ListTools.toList(Identity.id_FIELDNAME, Identity.person_FIELDNAME, Identity.orderNumber_FIELDNAME), Identity.unit_FIELDNAME, unitIds);
+			}
 		}
-		unitIds = ListTools.trim(unitIds, true, true);
-		EntityManager em = business.entityManagerContainer().get(Identity.class);
+		/*EntityManager em = business.entityManagerContainer().get(Identity.class);
 		CriteriaBuilder cb = em.getCriteriaBuilder();
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<Identity> root = cq.from(Identity.class);
 		Predicate p = root.get(Identity_.unit).in(unitIds);
 		List<String> list = em.createQuery(cq.select(root.get(Identity_.person)).where(p))
-				.getResultList().stream().distinct().collect(Collectors.toList());
+				.getResultList().stream().distinct().collect(Collectors.toList());*/
 		return list;
 	}
 
-}
+}

+ 21 - 14
o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/person/ActionListWithUnitSubNestedObject.java

@@ -1,8 +1,6 @@
 package com.x.organization.assemble.express.jaxrs.person;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Optional;
+import java.util.*;
 import java.util.stream.Collectors;
 
 import javax.persistence.EntityManager;
@@ -76,18 +74,27 @@ class ActionListWithUnitSubNestedObject extends BaseAction {
 			unitIds.addAll(business.unit().listSubNested(o.getId()));
 		}
 		unitIds = ListTools.trim(unitIds, true, true);
-		EntityManager em = business.entityManagerContainer().get(Identity.class);
-		CriteriaBuilder cb = em.getCriteriaBuilder();
-		CriteriaQuery<String> cq = cb.createQuery(String.class);
-		Root<Identity> root = cq.from(Identity.class);
-		Predicate p = root.get(Identity_.unit).in(unitIds);
-		List<String> personIds = em.createQuery(cq.select(root.get(Identity_.person)).where(p))
-				.getResultList().stream().distinct().collect(Collectors.toList());
-		personIds = ListTools.trim(personIds, true, true);
-		for (Person o : business.person().pick(personIds)) {
-			wos.add(this.convert(business, o, Wo.class));
+		List<Identity> list = new ArrayList<>();
+		if(ListTools.isNotEmpty(unitIds)) {
+			list = business.entityManagerContainer().fetchIn(Identity.class,
+					ListTools.toList(Identity.id_FIELDNAME, Identity.person_FIELDNAME, Identity.orderNumber_FIELDNAME), Identity.unit_FIELDNAME, unitIds);
+		}
+		if(ListTools.isNotEmpty(list)) {
+			Map<String,Integer> map = new HashMap<>();
+			for(Identity identity : list){
+				map.put(identity.getPerson(), identity.getOrderNumber());
+			}
+			for (Person o : business.person().pick(new ArrayList<>(map.keySet()))) {
+				o.setOrderNumber(map.get(o.getId()));
+				wos.add(this.convert(business, o, Wo.class));
+			}
+			wos = wos.stream()
+					.sorted(Comparator.comparing(Wo::getOrderNumber, Comparator.nullsLast(Integer::compareTo))
+							.thenComparing(Comparator
+									.comparing(Wo::getName, Comparator.nullsFirst(String::compareTo)).reversed()))
+					.collect(Collectors.toList());
 		}
 		return wos;
 	}
 
-}
+}

+ 6 - 2
o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/unit/ActionListObject.java

@@ -34,6 +34,7 @@ import javax.persistence.criteria.Root;
 
 class ActionListObject extends BaseAction {
 	private static Logger logger = LoggerFactory.getLogger(ActionListObject.class);
+
 	@SuppressWarnings("unchecked")
 	ActionResult<List<Wo>> execute(EffectivePerson effectivePerson, JsonElement jsonElement) throws Exception {
 
@@ -81,8 +82,11 @@ class ActionListObject extends BaseAction {
 		@FieldDescribe("直接下级身份数量")
 		private Long subDirectIdentityCount = 0L;
 
+//		static WrapCopier<Unit, Wo> copier = WrapCopierFactory.wo(Unit.class, Wo.class, null,
+//				ListTools.toList(JpaObject.FieldsInvisible,Unit.controllerList_FIELDNAME,Unit.inheritedControllerList_FIELDNAME));
+
 		static WrapCopier<Unit, Wo> copier = WrapCopierFactory.wo(Unit.class, Wo.class, null,
-				ListTools.toList(JpaObject.FieldsInvisible,Unit.controllerList_FIELDNAME,Unit.inheritedControllerList_FIELDNAME));
+				ListTools.toList(JpaObject.FieldsInvisible, Unit.controllerList_FIELDNAME));
 
 		public String getMatchKey() {
 			return matchKey;
@@ -114,7 +118,7 @@ class ActionListObject extends BaseAction {
 		List<Wo> wos = new ArrayList<>();
 		for (String str : wi.getUnitList()) {
 			Unit o = business.unit().pick(str);
-			if(o!=null){
+			if (o != null) {
 				Wo wo = Wo.copier.copy(o);
 				wo.setMatchKey(str);
 				if (StringUtils.isNotEmpty(wo.getSuperior())) {

+ 5 - 5
o2server/x_organization_assemble_personal/src/main/java/com/x/organization/assemble/personal/factory/UnitFactory.java

@@ -210,11 +210,11 @@ public class UnitFactory extends AbstractFactory {
 			// Collections.reverse(names);
 			names.add(o.getName());
 			o.setLevelName(StringUtils.join(names, PersistenceProperties.Unit.levelNameSplit));
-			List<String> inheritControllerList = new ArrayList<>();
-			for (Unit u : list) {
-				inheritControllerList.addAll(u.getControllerList());
-			}
-			o.setInheritedControllerList(ListTools.trim(inheritControllerList, true, true));
+//			List<String> inheritControllerList = new ArrayList<>();
+//			for (Unit u : list) {
+//				inheritControllerList.addAll(u.getControllerList());
+//			}
+//			o.setInheritedControllerList(ListTools.trim(inheritControllerList, true, true));
 		}
 	}
 

+ 18 - 18
o2server/x_organization_core_entity/src/main/java/com/x/organization/core/entity/Unit.java

@@ -189,17 +189,17 @@ public class Unit extends SliceJpaObject {
 	@CheckPersist(allowEmpty = true, citationExists = @CitationExist(type = Person.class))
 	private List<String> 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<String> inheritedControllerList;
+//	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<String> inheritedControllerList;
 
 	public static final String dingdingId_FIELDNAME = "dingdingId";
 	@FieldDescribe("钉钉部门ID.")
@@ -351,13 +351,13 @@ public class Unit extends SliceJpaObject {
 		this.distinguishedName = distinguishedName;
 	}
 
-	public List<String> getInheritedControllerList() {
-		return inheritedControllerList;
-	}
-
-	public void setInheritedControllerList(List<String> inheritedControllerList) {
-		this.inheritedControllerList = inheritedControllerList;
-	}
+//	public List<String> getInheritedControllerList() {
+//		return inheritedControllerList;
+//	}
+//
+//	public void setInheritedControllerList(List<String> inheritedControllerList) {
+//		this.inheritedControllerList = inheritedControllerList;
+//	}
 
 	public String getDescription() {
 		return description;

+ 7 - 7
o2server/x_program_center/src/main/java/com/x/program/center/factory/UnitFactory.java

@@ -95,13 +95,13 @@ public class UnitFactory extends AbstractFactory {
 			// Collections.reverse(names);
 			names.add(o.getName());
 			o.setLevelName(StringUtils.join(names, PersistenceProperties.Unit.levelNameSplit));
-			List<String> inheritControllerList = new ArrayList<>();
-			for (Unit u : list) {
-				if (ListTools.isNotEmpty(u.getControllerList())) {
-					inheritControllerList.addAll(u.getControllerList());
-				}
-			}
-			o.setInheritedControllerList(ListTools.trim(inheritControllerList, true, true));
+//			List<String> inheritControllerList = new ArrayList<>();
+//			for (Unit u : list) {
+//				if (ListTools.isNotEmpty(u.getControllerList())) {
+//					inheritControllerList.addAll(u.getControllerList());
+//				}
+//			}
+//			o.setInheritedControllerList(ListTools.trim(inheritControllerList, true, true));
 		}
 	}
 

+ 7 - 1
o2server/x_query_assemble_surface/src/main/java/com/x/query/assemble/surface/jaxrs/statement/BaseAction.java

@@ -33,7 +33,7 @@ abstract class BaseAction extends StandardJaxrsAction {
 						}.getType());
 			}
 			runtime.page = this.adjustPage(page);
-			runtime.size = this.adjustSize(size);
+			runtime.size = this.adjustSize2(size);
 			Set<String> keys = runtime.parameters.keySet();
 			if (keys.contains(Runtime.PARAMETER_PERSON)) {
 				runtime.parameters.put(Runtime.PARAMETER_PERSON, effectivePerson.getDistinguishedName());
@@ -61,4 +61,10 @@ abstract class BaseAction extends StandardJaxrsAction {
 		}
 		return runtime;
 	}
+
+	public Integer adjustSize2(Integer pageSize) {
+		return (pageSize == null || pageSize < 1)
+				? EntityManagerContainer.DEFAULT_PAGESIZE.intValue()
+				: pageSize;
+	}
 }

+ 1 - 1
o2web/source/o2_core/o2.js

@@ -1862,7 +1862,7 @@ if (!window.Promise){
 
     var _promiseAll = function(p){
         if (o2.typeOf(p)=="array"){
-            if (p.some(function(e){ return (o2.typeOf(e.then)=="function") })){
+            if (p.some(function(e){ return (e && o2.typeOf(e.then)=="function") })){
                 return Promise.all(p);
             }else{
                 return { "then": function(s){ s(p); return this;} };

+ 4 - 2
o2web/source/o2_core/o2/xScript/Environment.js

@@ -2056,8 +2056,10 @@ MWF.xScript.JSONData = function(data, callback, key, parent, _form){
             }},
             "del": {"value": function(delKey){
                 if (!this.hasOwnProperty(delKey)) return null;
-                delete data[delKey];
-                delete this[delKey];
+                // delete data[delKey];
+                // delete this[delKey];
+                    data[delKey] = "";
+                    this[delKey] = "";
                 return this;
             }}
         };

+ 12 - 2
o2web/source/x_component_Selector/Person.js

@@ -32,6 +32,7 @@ MWF.xApplication.Selector.Person = new Class({
         "contentUrl" : "", //和默认的页面布局不一样的话,可以传入页面布局HTML URL
         "injectToBody" : false, //当传入HTML URL的时候是否插入到document.body, false的时候插入到this.container
         "selectSingleItem" : false, //当只有一个候选项的时候,是否默认选中
+        "hiddenEmptyCategory" : false,
 
         "flatCategory" : false, //扁平化展现分类,
         "selectType" : "person",
@@ -83,6 +84,11 @@ MWF.xApplication.Selector.Person = new Class({
 
         this.subCategorys = []; //直接的分类
         this.subItems = []; //直接的选择项
+
+        if( !this.options.values ){
+            this.options.values = [];
+        }
+
         this._init();
     },
     _init : function(){
@@ -2482,8 +2488,12 @@ MWF.xApplication.Selector.Person.ItemCategory = new Class({
             }
 
             if ( !this._hasChild()){
-                this.actionNode.setStyle("background", "transparent");
-                this.textNode.setStyle("color", "#777");
+                if( this.selector.options.hiddenEmptyCategory ){
+                    this.node.hide()
+                }else{
+                    this.actionNode.setStyle("background", "transparent");
+                    this.textNode.setStyle("color", "#777");
+                }
             }
 
             if( this.selectAllNode ){

+ 2 - 2
o2web/source/x_component_cms_Xform/Form.js

@@ -358,7 +358,7 @@ MWF.xApplication.cms.Xform.Form = MWF.CMSForm = new Class({
         this.fireEvent("postSave", [documentData]);
         if (this.officeList) {
             this.officeList.each(function (module) {
-                module.save(history);
+                module.save();
             });
         }
         this.documentAction.saveDocument(documentData, function () {
@@ -460,7 +460,7 @@ MWF.xApplication.cms.Xform.Form = MWF.CMSForm = new Class({
         if (this.app) if (this.app.fireEvent) this.app.fireEvent("postPublish",[documentData]);
         if (this.officeList) {
             this.officeList.each(function (module) {
-                module.save(history);
+                module.save();
             });
         }
         this.documentAction.publishDocumentComplex(documentData, function (json) {

+ 4 - 4
o2web/source/x_component_process_Work/Processor.js

@@ -2051,7 +2051,7 @@ if (MWF.xApplication.process.Xform && MWF.xApplication.process.Xform.Form) {
                 if (this.ignoreOldData) {
                     identityOpt.values = this._computeValue() || [];
                 } else {
-                    identityOpt.values = this.getValue();
+                    identityOpt.values = this.getValue() || [];
                 }
                 identityOpt.exclude = exclude;
             }
@@ -2069,7 +2069,7 @@ if (MWF.xApplication.process.Xform && MWF.xApplication.process.Xform.Form) {
                 if (this.ignoreOldData) {
                     unitOpt.values = this._computeValue() || [];
                 } else {
-                    unitOpt.values = this.getValue();
+                    unitOpt.values = this.getValue() || [];
                 }
                 unitOpt.exclude = exclude;
             }
@@ -2355,7 +2355,7 @@ if (MWF.xApplication.process.Xform && MWF.xApplication.process.Xform.Form) {
         resetSelectorData: function () {
             if (this.selector && this.selector.selector) {
                 this.selector.selector.emptySelectedItems();
-                this.selector.selector.options.values = this.getValue();
+                this.selector.selector.options.values = this.getValue() || [];
                 this.selector.selector.setSelectedItem();
             }
         },
@@ -2364,7 +2364,7 @@ if (MWF.xApplication.process.Xform && MWF.xApplication.process.Xform.Form) {
             this.setData(v || "");
         },
         resetData: function () {
-            var v = this.getValue();
+            var v = this.getValue() || [];
             //this.setData((v) ? v.join(", ") : "");
             this.setData(v);
         },

+ 43 - 1
o2web/source/x_component_process_Xform/Form.js

@@ -1223,7 +1223,8 @@ MWF.xApplication.process.Xform.Form = MWF.APPForm = new Class({
             }
         } else if (typeOf(data) === "array") {
             var od = this.getOrigianlPathData(pathList);
-            if (typeOf(od) !== "array" || od.length !== data.length || JSON.stringify(od) !== JSON.stringify(data)) {
+            // if (typeOf(od) !== "array" || od.length !== data.length || JSON.stringify(od) !== JSON.stringify(data)) {
+            if (typeOf(od) !== "array" || od.length !== data.length || !this.compareObjects( od, data ) ) {
                 this.setModifedDataByPathList(data, pathList);
             }
             //}else{
@@ -1238,6 +1239,47 @@ MWF.xApplication.process.Xform.Form = MWF.APPForm = new Class({
             }
         }
     },
+    compareObjects: function(o, p, deep){
+        if( !deep )deep = 0;
+        if( deep > 15 )return false; //最大层数,避免相互嵌套
+        var type1 = typeOf( o ), type2 = typeOf( p );
+        if( type1 !== type2 )return false;
+
+        if( type1 === "object" ){
+            for( var k in o ){
+                if( o[k] === null || o[k] === undefined )delete o[k]
+            }
+            for( var k in p ){
+                if( p[k] === null || p[k] === undefined )delete p[k]
+            }
+        }
+        switch (type1) {
+            case "object":
+            case "array":
+                var i, keysO = Object.keys(o), keysP = Object.keys(p);
+                if (keysO.length !== keysP.length){
+                    return false;
+                }
+                keysO.sort();
+                keysP.sort();
+                for ( i=0; i<keysO.length; i++ ){
+                    var key = keysO[i];
+                    if( type1 === "array" )key = key.toInt();
+                    var valueO = o[key], valueP = p[key];
+                    if( this.compareObjects( valueO, valueP, deep++ ) === false ){
+                        return false;
+                    }
+                }
+                break;
+            case "function":
+               break;
+            default:
+                if  (o!==p){
+                    return false;
+                }
+        }
+        return true;
+    },
 
     saveFormData: function (callback, failure, history, data, issubmit, isstart) {
         if (this.businessData.work.startTime) {

+ 1 - 1
o2web/source/x_component_process_Xform/Org.js

@@ -276,7 +276,7 @@ MWF.xApplication.process.Xform.Org = MWF.APPOrg =  new Class({
 
         if( this.selectTypeList.length === 0 )return false;
 
-        var values = this.getInputData();
+        var values = this.getInputData() || [];
 
         var exclude = [];
         if( this.json.exclude ){