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

Merge branch 'wrdp' into 'develop'

Wrdp

See merge request o2oa/o2oa!2435
胡起 5 лет назад
Родитель
Сommit
ca8c8a63a1

+ 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;
 	}
 
-}
+}

+ 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 ){