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

Merge branch 'wrdp' into 'develop'

Wrdp

See merge request o2oa/o2oa!2468
o2null 5 лет назад
Родитель
Сommit
e6b2f1360d
17 измененных файлов с 462 добавлено и 37 удалено
  1. 2 2
      o2server/configSample/externalDataSources_mysql.json
  2. 10 1
      o2server/configSample/processPlatform.json
  3. 57 1
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/ProcessPlatform.java
  4. 27 24
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/person/ActionDelete.java
  5. 243 0
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/person/ActionDeleteV2.java
  6. 19 1
      o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/person/PersonAction.java
  7. 7 3
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/Business.java
  8. 2 0
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/attachment/ActionUpdate.java
  9. 2 0
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/attachment/ActionUpdateCallback.java
  10. 2 0
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/attachment/ActionUploadCallback.java
  11. 3 1
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/attachment/ActionUploadWithWork.java
  12. 3 0
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/attachment/ActionUploadWithWorkCompleted.java
  13. 45 0
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/attachment/BaseAction.java
  14. 17 0
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/attachment/ExceptionAttachmentInvalid.java
  15. 17 0
      o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/attachment/ExceptionAttachmentInvalidCallback.java
  16. 2 1
      o2server/x_query_assemble_designer/src/main/java/com/x/query/assemble/designer/jaxrs/view/BaseAction.java
  17. 4 3
      o2server/x_query_assemble_surface/src/main/java/com/x/query/assemble/surface/jaxrs/view/BaseAction.java

+ 2 - 2
o2server/configSample/externalDataSources_mysql.json

@@ -1,10 +1,10 @@
 [
 	{
-		"url":"jdbc:mysql://127.0.0.1:3306/X?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8",      
+		"url":"jdbc:mysql://127.0.0.1:3306/X?autoReconnect=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8",
 		"username" : "root",
 		"password" :"password",
 		"includes": [],
 		"excludes": [],
 		"enable" : true
 	}
-]
+]

+ 10 - 1
o2server/configSample/processPlatform.json

@@ -59,6 +59,14 @@
     "###thresholdMinutes": "当工作滞留设定时间后,将尝试触发工作流转,可以自动处理由于人员变动的引起的工作滞留,默认24*60分钟.###"
   },
   "processingSignalPersistEnable": false,
+  "attachmentConfig": {
+    "fileSize": 0.0,
+    "fileTypeIncludes": [],
+    "fileTypeExcludes": [],
+    "###fileSize": "附件大小限制(单位M,默认不限制).###",
+    "###fileTypeIncludes": "只允许上传的文件后缀###",
+    "###fileTypeExcludes": "不允许上传的文件后缀###"
+  },
   "###maintenanceIdentity": "维护身份,当工作发生意外错误,无法找到对应的处理人情况下,先尝试将工作分配给创建身份,如果创建身份也不可获取,那么分配给指定人员,默认情况下这个值为空.###",
   "###formVersionCount": "表单历史版本保留数量,0为不保留.###",
   "###processVersionCount": "流程历史版本保留数量,0为不保留.###",
@@ -96,5 +104,6 @@
     "###count": "提醒数量限制.###"
   },
   "###extensionEvents": "事件扩充.###",
-  "###processingSignalPersistEnable": "是否保存工作处理信号内容,默认false.###"
+  "###processingSignalPersistEnable": "是否保存工作处理信号内容,默认false.###",
+  "###attachmentConfig": "流程附件上传限制大小或者类型.###"
 }

+ 57 - 1
o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/ProcessPlatform.java

@@ -75,6 +75,7 @@ public class ProcessPlatform extends ConfigObject {
 		this.deleteDraft = new DeleteDraft();
 		this.passExpired = new PassExpired();
 		this.processingSignalPersistEnable = DEFAULT_PROCESSINGSIGNALPERSISTENABLE;
+		this.attachmentConfig = new AttachmentConfig();
 	}
 
 	public Integer getExecutorCount() {
@@ -170,6 +171,10 @@ public class ProcessPlatform extends ConfigObject {
 	@FieldDescribe("是否保存工作处理信号内容,默认false.")
 	private Boolean processingSignalPersistEnable;
 
+	@FieldDescribe("流程附件上传限制大小或者类型.")
+	private AttachmentConfig attachmentConfig;
+
+
 	public Boolean getProcessingSignalPersistEnable() {
 		if (processingSignalPersistEnable == null) {
 			this.processingSignalPersistEnable = DEFAULT_PROCESSINGSIGNALPERSISTENABLE;
@@ -184,6 +189,14 @@ public class ProcessPlatform extends ConfigObject {
 		return extensionEvents;
 	}
 
+	public AttachmentConfig getAttachmentConfig() {
+		return this.attachmentConfig == null ? new AttachmentConfig() : attachmentConfig;
+	}
+
+	public void setAttachmentConfig(AttachmentConfig attachmentConfig) {
+		this.attachmentConfig = attachmentConfig;
+	}
+
 	public Urge getUrge() {
 		return this.urge == null ? new Urge() : this.urge;
 	}
@@ -593,6 +606,49 @@ public class ProcessPlatform extends ConfigObject {
 
 	}
 
+	public static class AttachmentConfig extends ConfigObject {
+
+		public static AttachmentConfig defaultInstance() {
+			AttachmentConfig o = new AttachmentConfig();
+			return o;
+		}
+
+		public static final Integer DEFAULT_FILE_SIZE = 0;
+
+		@FieldDescribe("附件大小限制(单位M,默认不限制).")
+		private Integer fileSize = DEFAULT_FILE_SIZE;
+
+		@FieldDescribe("只允许上传的文件后缀")
+		private List<String> fileTypeIncludes = new ArrayList<>();
+
+		@FieldDescribe("不允许上传的文件后缀")
+		private List<String> fileTypeExcludes = new ArrayList<>();
+
+		public Integer getFileSize() {
+			return fileSize;
+		}
+
+		public void setFileSize(Integer fileSize) {
+			this.fileSize = fileSize;
+		}
+
+		public List<String> getFileTypeIncludes() {
+			return fileTypeIncludes;
+		}
+
+		public void setFileTypeIncludes(List<String> fileTypeIncludes) {
+			this.fileTypeIncludes = fileTypeIncludes;
+		}
+
+		public List<String> getFileTypeExcludes() {
+			return fileTypeExcludes;
+		}
+
+		public void setFileTypeExcludes(List<String> fileTypeExcludes) {
+			this.fileTypeExcludes = fileTypeExcludes;
+		}
+	}
+
 	public static class ExtensionEvents {
 
 		@FieldDescribe("工作附件上传.")
@@ -841,4 +897,4 @@ public class ProcessPlatform extends ConfigObject {
 
 	}
 
-}
+}

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

@@ -33,20 +33,7 @@ import com.x.organization.assemble.control.ThisApplication;
 import com.x.organization.assemble.control.message.OrgBodyMessage;
 import com.x.organization.assemble.control.message.OrgMessage;
 import com.x.organization.assemble.control.message.OrgMessageFactory;
-import com.x.organization.core.entity.Group;
-import com.x.organization.core.entity.Group_;
-import com.x.organization.core.entity.Identity;
-import com.x.organization.core.entity.Identity_;
-import com.x.organization.core.entity.Person;
-import com.x.organization.core.entity.PersonAttribute;
-import com.x.organization.core.entity.PersonAttribute_;
-import com.x.organization.core.entity.Person_;
-import com.x.organization.core.entity.Role;
-import com.x.organization.core.entity.Role_;
-import com.x.organization.core.entity.Unit;
-import com.x.organization.core.entity.UnitDuty;
-import com.x.organization.core.entity.UnitDuty_;
-import com.x.organization.core.entity.Unit_;
+import com.x.organization.core.entity.*;
 
 class ActionDelete extends BaseAction {
 	private static Logger logger = LoggerFactory.getLogger(ActionDelete.class);
@@ -80,6 +67,9 @@ class ActionDelete extends BaseAction {
 				/** 删除个人属性 */
 				emc.beginTransaction(PersonAttribute.class);
 				this.removePersonAttribute(business, person);
+				/** 删除个人自定义信息 */
+				emc.beginTransaction(Custom.class);
+				this.removePersonCustom(business, person);
 				/** 删除群组成员 */
 				emc.beginTransaction(Group.class);
 				this.removeMemberOfGroup(business, person);
@@ -102,12 +92,12 @@ class ActionDelete extends BaseAction {
 				CacheManager.notify(Person.class);
 				/** 通知x_collect_service_transmit同步数据到collect */
 				business.instrument().collect().person();
-				
+
 				/**创建 组织变更org消息通信 */
 				//createMessageCommunicate(person,  effectivePerson);
 				OrgMessageFactory  orgMessageFactory = new OrgMessageFactory();
 				orgMessageFactory.createMessageCommunicate("delete", "person", person, effectivePerson);
-				
+
 				Wo wo = new Wo();
 				wo.setId(person.getId());
 				result.setData(wo);
@@ -193,6 +183,19 @@ class ActionDelete extends BaseAction {
 		}
 	}
 
+	private void removePersonCustom(Business business, Person person) throws Exception {
+		EntityManager em = business.entityManagerContainer().get(Custom.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Custom> cq = cb.createQuery(Custom.class);
+		Root<Custom> root = cq.from(Custom.class);
+		Predicate p = cb.equal(root.get(Custom_.person), person.getId());
+		p = cb.or(p, cb.equal(root.get(Custom_.person), person.getDistinguishedName()));
+		List<Custom> os = em.createQuery(cq.select(root).where(p)).getResultList();
+		for (Custom o : os) {
+			business.entityManagerContainer().remove(o, CheckRemoveType.all);
+		}
+	}
+
 	private void removeMemberOfGroup(Business business, Person person) throws Exception {
 		EntityManager em = business.entityManagerContainer().get(Group.class);
 		CriteriaBuilder cb = em.getCriteriaBuilder();
@@ -216,14 +219,14 @@ class ActionDelete extends BaseAction {
 			o.getPersonList().remove(person.getId());
 		}
 	}
-	
+
 	/**创建 组织变更org消息通信 */
 	private boolean createMessageCommunicate(Person person, EffectivePerson effectivePerson) {
 		try{
 			Gson gson = new Gson();
 			String strPerson = gson.toJson(person);
 			OrgMessage orgMessage = new OrgMessage();
-			
+
 			orgMessage.setOperType("delete");
 			orgMessage.setOrgType("person");
 			orgMessage.setOperUerId(effectivePerson.getDistinguishedName());
@@ -231,26 +234,26 @@ class ActionDelete extends BaseAction {
 			orgMessage.setReceiveSystem("");
 			orgMessage.setConsumed(false);
 			orgMessage.setConsumedModule("");
-			
+
 			OrgBodyMessage orgBodyMessage = new OrgBodyMessage();
 			orgBodyMessage.setOriginalData(strPerson);
 			orgMessage.setBody( gson.toJson(orgBodyMessage));
-			
+
 			Applications applications = new Applications();
 			String path ="org/create";
 		     //String address = "http://127.0.0.1:20020/x_message_assemble_communicate/jaxrs/org/create";
 		     //ActionResponse resp = CipherConnectionAction.post(false, address, body);
-		     
+
 			ActionResponse resp =  ThisApplication.context().applications()
 						.postQuery(x_message_assemble_communicate.class, path, orgMessage);
-		
+
 			String mess = resp.getMessage();
 			String data = resp.getData().toString();
 			return true;
 			}catch(Exception e) {
 				logger.print(e.toString());
 				return false;
-			}	
+			}
 	}
 
-}
+}

+ 243 - 0
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/person/ActionDeleteV2.java

@@ -0,0 +1,243 @@
+package com.x.organization.assemble.control.jaxrs.person;
+
+import com.google.gson.Gson;
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.entity.annotation.CheckRemoveType;
+import com.x.base.core.project.Applications;
+import com.x.base.core.project.cache.CacheManager;
+import com.x.base.core.project.config.Config;
+import com.x.base.core.project.connection.ActionResponse;
+import com.x.base.core.project.exception.ExceptionAccessDenied;
+import com.x.base.core.project.exception.ExceptionEntityNotExist;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.jaxrs.WoId;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.tools.ListTools;
+import com.x.base.core.project.x_message_assemble_communicate;
+import com.x.organization.assemble.control.Business;
+import com.x.organization.assemble.control.ThisApplication;
+import com.x.organization.assemble.control.message.OrgBodyMessage;
+import com.x.organization.assemble.control.message.OrgMessage;
+import com.x.organization.core.entity.*;
+
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import java.util.List;
+import java.util.stream.Collectors;
+
+class ActionDeleteV2 extends BaseAction {
+	private static Logger logger = LoggerFactory.getLogger(ActionDeleteV2.class);
+	ActionResult<Wo> execute(EffectivePerson effectivePerson, String flag) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			ActionResult<Wo> result = new ActionResult<>();
+			if (Config.token().isInitialManager(flag)) {
+				throw new ExceptionDenyDeleteInitialManager();
+			} else {
+				Business business = new Business(emc);
+				Person person = business.person().pick(flag);
+				if (null == person) {
+					throw new ExceptionEntityNotExist(flag, Person.class);
+				}
+				/** 从内存中取到人 */
+				person = emc.find(person.getId(), Person.class);
+				if (!this.editable(business, effectivePerson, person)) {
+					throw new ExceptionAccessDenied(effectivePerson);
+				}
+				List<Identity> identities = this.listIdentity(business, person);
+				/** 删除身份组织职务成员,提交后才可以删除身份 */
+				emc.beginTransaction(UnitDuty.class);
+				this.removeMemberOfUnitDuty(business, identities);
+				emc.commit();
+				/** 删除身份 */
+				emc.beginTransaction(Identity.class);
+				for (Identity o : identities) {
+					emc.remove(o, CheckRemoveType.all);
+				}
+				emc.commit();
+				/** 删除个人自定义信息 */
+				emc.beginTransaction(Custom.class);
+				this.removePersonCustom(business, person);
+				/** 删除群组成员 */
+				emc.beginTransaction(Group.class);
+				this.removeMemberOfGroup(business, person);
+				/** 删除角色成员 */
+				emc.beginTransaction(Role.class);
+				this.removeMemberOfRole(business, person);
+				/** 删除组织的管理个人以及继承的管理个人 */
+				emc.beginTransaction(Unit.class);
+				this.removeMemberOfUnitController(business, person);
+				/** 删除个人管理者成员 */
+				this.removeMemberOfPersonController(business, person);
+				/** 删除汇报人员为将要删除的人 */
+				this.removeMemberOfPersonSuperior(business, person);
+				emc.beginTransaction(Person.class);
+				/** 先进行一次提交,通过check */
+				emc.commit();
+				CacheManager.notify(Person.class);
+
+				Wo wo = new Wo();
+				wo.setId(person.getId());
+				result.setData(wo);
+			}
+			return result;
+		}
+	}
+
+	public static class Wo extends WoId {
+
+	}
+
+	private List<Identity> listIdentity(Business business, Person person) throws Exception {
+		EntityManager em = business.entityManagerContainer().get(Identity.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Identity> cq = cb.createQuery(Identity.class);
+		Root<Identity> root = cq.from(Identity.class);
+		Predicate p = cb.equal(root.get(Identity_.person), person.getId());
+		List<Identity> os = em.createQuery(cq.select(root).where(p)).getResultList();
+		return os;
+	}
+
+	private void removeMemberOfUnitDuty(Business business, List<Identity> identities) throws Exception {
+		List<String> ids = ListTools.extractProperty(identities, JpaObject.id_FIELDNAME, String.class, true, true);
+		EntityManager em = business.entityManagerContainer().get(UnitDuty.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<UnitDuty> cq = cb.createQuery(UnitDuty.class);
+		Root<UnitDuty> root = cq.from(UnitDuty.class);
+		Predicate p = root.get(UnitDuty_.identityList).in(ids);
+		List<UnitDuty> os = em.createQuery(cq.select(root).where(p)).getResultList().stream().distinct().collect(Collectors.toList());
+		for (UnitDuty o : os) {
+			o.getIdentityList().removeAll(ids);
+		}
+	}
+
+	private void removeMemberOfUnitController(Business business, Person person) throws Exception {
+		EntityManager em = business.entityManagerContainer().get(Unit.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		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)));
+		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());
+		}
+	}
+
+	private void removeMemberOfPersonController(Business business, Person person) throws Exception {
+		EntityManager em = business.entityManagerContainer().get(Person.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Person> cq = cb.createQuery(Person.class);
+		Root<Person> root = cq.from(Person.class);
+		Predicate p = cb.isMember(person.getId(), root.get(Person_.controllerList));
+		List<Person> os = em.createQuery(cq.select(root).where(p)).getResultList().stream().distinct().collect(Collectors.toList());
+		for (Person o : os) {
+			o.getControllerList().remove(person.getId());
+		}
+	}
+
+	private void removeMemberOfPersonSuperior(Business business, Person person) throws Exception {
+		EntityManager em = business.entityManagerContainer().get(Person.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Person> cq = cb.createQuery(Person.class);
+		Root<Person> root = cq.from(Person.class);
+		Predicate p = cb.equal(root.get(Person_.superior), person.getId());
+		List<Person> os = em.createQuery(cq.select(root).where(p)).getResultList();
+		for (Person o : os) {
+			o.setSuperior("");
+		}
+	}
+
+	private void removePersonAttribute(Business business, Person person) throws Exception {
+		EntityManager em = business.entityManagerContainer().get(PersonAttribute.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<PersonAttribute> cq = cb.createQuery(PersonAttribute.class);
+		Root<PersonAttribute> root = cq.from(PersonAttribute.class);
+		Predicate p = cb.equal(root.get(PersonAttribute_.person), person.getId());
+		List<PersonAttribute> os = em.createQuery(cq.select(root).where(p)).getResultList();
+		for (PersonAttribute o : os) {
+			business.entityManagerContainer().remove(o, CheckRemoveType.all);
+		}
+	}
+
+	private void removePersonCustom(Business business, Person person) throws Exception {
+		EntityManager em = business.entityManagerContainer().get(Custom.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Custom> cq = cb.createQuery(Custom.class);
+		Root<Custom> root = cq.from(Custom.class);
+		Predicate p = cb.equal(root.get(Custom_.person), person.getId());
+		p = cb.or(p, cb.equal(root.get(Custom_.person), person.getDistinguishedName()));
+		List<Custom> os = em.createQuery(cq.select(root).where(p)).getResultList();
+		for (Custom o : os) {
+			business.entityManagerContainer().remove(o, CheckRemoveType.all);
+		}
+	}
+
+	private void removeMemberOfGroup(Business business, Person person) throws Exception {
+		EntityManager em = business.entityManagerContainer().get(Group.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Group> cq = cb.createQuery(Group.class);
+		Root<Group> root = cq.from(Group.class);
+		Predicate p = cb.isMember(person.getId(), root.get(Group_.personList));
+		List<Group> os = em.createQuery(cq.select(root).where(p)).getResultList();
+		for (Group o : os) {
+			o.getPersonList().remove(person.getId());
+		}
+	}
+
+	private void removeMemberOfRole(Business business, Person person) throws Exception {
+		EntityManager em = business.entityManagerContainer().get(Role.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Role> cq = cb.createQuery(Role.class);
+		Root<Role> root = cq.from(Role.class);
+		Predicate p = cb.isMember(person.getId(), root.get(Role_.personList));
+		List<Role> os = em.createQuery(cq.select(root).where(p)).getResultList();
+		for (Role o : os) {
+			o.getPersonList().remove(person.getId());
+		}
+	}
+
+	/**创建 组织变更org消息通信 */
+	private boolean createMessageCommunicate(Person person, EffectivePerson effectivePerson) {
+		try{
+			Gson gson = new Gson();
+			String strPerson = gson.toJson(person);
+			OrgMessage orgMessage = new OrgMessage();
+
+			orgMessage.setOperType("delete");
+			orgMessage.setOrgType("person");
+			orgMessage.setOperUerId(effectivePerson.getDistinguishedName());
+			orgMessage.setOperDataId(person.getId());
+			orgMessage.setReceiveSystem("");
+			orgMessage.setConsumed(false);
+			orgMessage.setConsumedModule("");
+
+			OrgBodyMessage orgBodyMessage = new OrgBodyMessage();
+			orgBodyMessage.setOriginalData(strPerson);
+			orgMessage.setBody( gson.toJson(orgBodyMessage));
+
+			Applications applications = new Applications();
+			String path ="org/create";
+		     //String address = "http://127.0.0.1:20020/x_message_assemble_communicate/jaxrs/org/create";
+		     //ActionResponse resp = CipherConnectionAction.post(false, address, body);
+
+			ActionResponse resp =  ThisApplication.context().applications()
+						.postQuery(x_message_assemble_communicate.class, path, orgMessage);
+
+			String mess = resp.getMessage();
+			String data = resp.getData().toString();
+			return true;
+			}catch(Exception e) {
+				logger.print(e.toString());
+				return false;
+			}
+	}
+
+}

+ 19 - 1
o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/person/PersonAction.java

@@ -108,6 +108,24 @@ public class PersonAction extends StandardJaxrsAction {
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
 
+	@JaxrsMethodDescribe(value = "删除个人关联信息(身份、角色等),但保留人员(企业离退休人员需要能登录平台但不能做业务处理).", action = ActionDeleteV2.class)
+	@DELETE
+	@Path("{flag}/v2")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void deleteV2(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+					   @JaxrsParameterDescribe("人员标识") @PathParam("flag") String flag) {
+		ActionResult<ActionDeleteV2.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionDeleteV2().execute(effectivePerson, flag);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
 	@JaxrsMethodDescribe(value = "列示个人,下一页.", action = ActionListNext.class)
 	@GET
 	@Path("list/{flag}/next/{count}")
@@ -346,4 +364,4 @@ public class PersonAction extends StandardJaxrsAction {
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
 
-}
+}

+ 7 - 3
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/Business.java

@@ -1212,7 +1212,7 @@ public class Business {
 
 	/**
 	 * 下载附件并打包为zip
-	 * 
+	 *
 	 * @param attachmentList
 	 * @param os
 	 * @throws Exception
@@ -1224,7 +1224,11 @@ public class Business {
 		/* 生成zip压缩文件内的目录结构 */
 		if (attachmentList != null) {
 			for (Attachment att : attachmentList) {
-				filePathMap.put(att.getName(), att);
+				if(filePathMap.containsKey(att.getName())) {
+					filePathMap.put(att.getSite()+"-"+att.getName(), att);
+				}else{
+					filePathMap.put(att.getName(), att);
+				}
 			}
 		}
 		try (ZipOutputStream zos = new ZipOutputStream(os)) {
@@ -1258,4 +1262,4 @@ public class Business {
 		}
 	}
 
-}
+}

+ 2 - 0
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/attachment/ActionUpdate.java

@@ -72,6 +72,8 @@ class ActionUpdate extends BaseAction {
 				throw new ExceptionAccessDenied(effectivePerson, attachment);
 			}
 
+			this.verifyConstraint(bytes.length, fileName, null);
+
 			StorageMapping mapping = ThisApplication.context().storageMappings().get(Attachment.class,
 					attachment.getStorage());
 			emc.beginTransaction(Attachment.class);

+ 2 - 0
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/attachment/ActionUpdateCallback.java

@@ -51,6 +51,8 @@ class ActionUpdateCallback extends BaseAction {
 			// attachment.getExtension())) {
 			// throw new ExceptionExtensionNotMatch(fileName, attachment.getExtension());
 			// }
+			this.verifyConstraint(bytes.length, fileName, null);
+
 			/** 统计待办数量判断用户是否可以上传附件 */
 			WoControl control = business.getControl(effectivePerson, work, WoControl.class);
 			if (BooleanUtils.isNotTrue(control.getAllowProcessing())) {

+ 2 - 0
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/attachment/ActionUploadCallback.java

@@ -48,6 +48,8 @@ class ActionUploadCallback extends BaseAction {
 			// if (StringUtils.isEmpty(fileName)) {
 			// throw new ExceptionEmptyExtension(fileName);
 			// }
+			this.verifyConstraint(bytes.length, fileName, callback);
+
 			StorageMapping mapping = ThisApplication.context().storageMappings().random(Attachment.class);
 			Attachment attachment = this.concreteAttachment(work, effectivePerson, site);
 			attachment.saveContent(mapping, bytes, fileName);

+ 3 - 1
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/attachment/ActionUploadWithWork.java

@@ -62,6 +62,8 @@ class ActionUploadWithWork extends BaseAction {
 			/* 调整可能的附件名称 */
 			fileName = this.adjustFileName(business, work.getJob(), fileName);
 
+			this.verifyConstraint(bytes.length, fileName, null);
+
 			StorageMapping mapping = ThisApplication.context().storageMappings().random(Attachment.class);
 			Attachment attachment = this.concreteAttachment(work, effectivePerson, site);
 			attachment.saveContent(mapping, bytes, fileName);
@@ -73,7 +75,7 @@ class ActionUploadWithWork extends BaseAction {
 				logger.debug("filename:{}, file type:{}, text:{}.", attachment.getName(), attachment.getType(),
 						attachment.getText());
 			}
-			
+
 			emc.beginTransaction(Attachment.class);
 			emc.persist(attachment, CheckPersistType.all);
 			emc.commit();

+ 3 - 0
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/attachment/ActionUploadWithWorkCompleted.java

@@ -62,6 +62,9 @@ class ActionUploadWithWorkCompleted extends BaseAction {
 			}
 			/* 调整可能的附件名称 */
 			fileName = this.adjustFileName(business, workCompleted.getJob(), fileName);
+
+			this.verifyConstraint(bytes.length, fileName, null);
+
 			/* 天印扩展 */
 			if (StringUtils.isNotEmpty(extraParam)) {
 				WiExtraParam wiExtraParam = gson.fromJson(extraParam, WiExtraParam.class);

+ 45 - 0
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/attachment/BaseAction.java

@@ -2,6 +2,7 @@ package com.x.processplatform.assemble.surface.jaxrs.attachment;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.CompletableFuture;
 
 import javax.persistence.EntityManager;
@@ -10,6 +11,10 @@ import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
 
+import com.x.base.core.project.cache.Cache;
+import com.x.base.core.project.cache.CacheManager;
+import com.x.base.core.project.config.Config;
+import com.x.base.core.project.config.ProcessPlatform;
 import org.apache.commons.collections4.ListUtils;
 import org.apache.commons.io.FilenameUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -243,4 +248,44 @@ abstract class BaseAction extends StandardJaxrsAction {
 			return value;
 		});
 	}
+
+	/**
+	 * 判断附件是否符合大小、文件类型的约束
+	 * @param size
+	 * @param fileName
+	 * @param callback
+	 * @throws Exception
+	 */
+	protected void verifyConstraint(long size, String fileName, String callback) throws Exception{
+		ProcessPlatform.AttachmentConfig attConfig = Config.processPlatform().getAttachmentConfig();
+		if(attConfig.getFileSize()!=null && attConfig.getFileSize()>0) {
+			size = size / (1024 * 1024);
+			if (size > attConfig.getFileSize()) {
+				if (StringUtils.isNotEmpty(callback)){
+					throw new ExceptionAttachmentInvalidCallback(callback, fileName, attConfig.getFileSize());
+				}else{
+					throw new ExceptionAttachmentInvalid(fileName, attConfig.getFileSize());
+				}
+			}
+		}
+		String fileType = FilenameUtils.getExtension(fileName).toLowerCase();
+		if(attConfig.getFileTypeIncludes()!=null && !attConfig.getFileTypeIncludes().isEmpty()){
+			if(!ListTools.contains(attConfig.getFileTypeIncludes(), fileType)){
+				if (StringUtils.isNotEmpty(callback)){
+					throw new ExceptionAttachmentInvalidCallback(callback, fileName);
+				}else{
+					throw new ExceptionAttachmentInvalid(fileName);
+				}
+			}
+		}
+		if(attConfig.getFileTypeExcludes()!=null && !attConfig.getFileTypeExcludes().isEmpty()){
+			if(ListTools.contains(attConfig.getFileTypeExcludes(), fileType)){
+				if (StringUtils.isNotEmpty(callback)){
+					throw new ExceptionAttachmentInvalidCallback(callback, fileName);
+				}else{
+					throw new ExceptionAttachmentInvalid(fileName);
+				}
+			}
+		}
+	}
 }

+ 17 - 0
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/attachment/ExceptionAttachmentInvalid.java

@@ -0,0 +1,17 @@
+package com.x.processplatform.assemble.surface.jaxrs.attachment;
+
+import com.x.base.core.project.exception.PromptException;
+
+class ExceptionAttachmentInvalid extends PromptException {
+
+	private static final long serialVersionUID = 3232548525722242208L;
+
+	ExceptionAttachmentInvalid(String fileName) {
+		super("附件:{}, 不符合上传类型.", fileName);
+	}
+
+	ExceptionAttachmentInvalid(String fileName, Integer fileSize) {
+		super("附件:{},附件大小超过限制{}M.", fileName, fileSize);
+	}
+
+}

+ 17 - 0
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/attachment/ExceptionAttachmentInvalidCallback.java

@@ -0,0 +1,17 @@
+package com.x.processplatform.assemble.surface.jaxrs.attachment;
+
+import com.x.base.core.project.exception.CallbackPromptException;
+
+class ExceptionAttachmentInvalidCallback extends CallbackPromptException {
+
+	private static final long serialVersionUID = 8275405268546054638L;
+
+	ExceptionAttachmentInvalidCallback(String callbackName, String fileName) {
+		super(callbackName, "附件:{}, 不符合上传类型.", fileName);
+	}
+
+	ExceptionAttachmentInvalidCallback(String callbackName, String fileName, Integer fileSize) {
+		super(callbackName, "附件:{},附件大小超过限制{}M.", fileName, fileSize);
+	}
+
+}

+ 2 - 1
o2server/x_query_assemble_designer/src/main/java/com/x/query/assemble/designer/jaxrs/view/BaseAction.java

@@ -85,7 +85,8 @@ abstract class BaseAction extends StandardJaxrsAction {
 			runtime.unitAllList.addAll(list);
 			list.clear();
 		}
-		runtime.groupList = business.organization().group().listWithPerson(effectivePerson.getDistinguishedName());
+		runtime.groupList = business.organization().group().listWithPersonReference(
+				ListTools.toList(effectivePerson.getDistinguishedName()), true, true, true);
 		if(runtime.groupList!=null){
 			for(String item : runtime.groupList){
 				if(item.indexOf("@")>-1) {

+ 4 - 3
o2server/x_query_assemble_surface/src/main/java/com/x/query/assemble/surface/jaxrs/view/BaseAction.java

@@ -203,7 +203,7 @@ abstract class BaseAction extends StandardJaxrsAction {
 			return flag;
 		}
 	}
-    
+
 	protected String objectToString(Object object) {
 		String  str = "";
 		if (object instanceof Integer) {
@@ -222,7 +222,7 @@ abstract class BaseAction extends StandardJaxrsAction {
 		}
 		return str;
 	}
-	
+
 	protected Runtime runtime(EffectivePerson effectivePerson, Business business, View view,
 			List<FilterEntry> filterList, Map<String, String> parameter, Integer count, boolean isBundle) throws Exception {
 		Runtime runtime = new Runtime();
@@ -258,7 +258,8 @@ abstract class BaseAction extends StandardJaxrsAction {
 			runtime.unitAllList.addAll(list);
 			list.clear();
 		}
-		runtime.groupList = business.organization().group().listWithPerson(effectivePerson.getDistinguishedName());
+		runtime.groupList = business.organization().group().listWithPersonReference(
+				ListTools.toList(effectivePerson.getDistinguishedName()), true, true, true);
 		if(runtime.groupList!=null){
 			for(String item : runtime.groupList){
 				if(item.indexOf("@")>-1) {