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

Merge branch 'feature/CMS.document.admin.query' into 'develop'

Merge of feature/CMS.document.admin.query[内容管理]新增了管理员根据人员标识查询人员可以看到的文档列表服务

See merge request o2oa/o2oa!520
李义 5 лет назад
Родитель
Сommit
aefa3e649d

+ 19 - 10
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/document/ActionPersistPublishContent.java

@@ -176,6 +176,15 @@ public class ActionPersistPublishContent extends BaseAction {
 
 		if (check) {
 			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+
+				if ( StringUtils.isEmpty( wi.getIdentity())) {
+					wi.setCreatorIdentity( wi.getIdentity() );
+				}
+
+				if ( StringUtils.isEmpty( wi.getCreatorPerson())) {
+					wi.setCreatorPerson( effectivePerson.getDistinguishedName() );
+				}
+
 				if (StringUtils.isEmpty( wi.getCreatorIdentity() )) {
 					if( "cipher".equalsIgnoreCase( effectivePerson.getDistinguishedName() )) {
 						wi.setCreatorIdentity("cipher");
@@ -188,13 +197,13 @@ public class ActionPersistPublishContent extends BaseAction {
 						wi.setCreatorUnitName("xadmin");
 						wi.setCreatorTopUnitName("xadmin");
 					}else {
-						//尝试一下根据当前用户获取用户的第一个身份
-						wi.setCreatorIdentity(userManagerService.getMajorIdentityWithPerson( effectivePerson.getDistinguishedName()) );
+						//尝试一下根据传入的用户或者当前用户获取用户的第一个身份
+						wi.setCreatorIdentity(userManagerService.getMajorIdentityWithPerson( wi.getCreatorPerson() ) );
 					}
 				}
 				
 				if ( !StringUtils.equals(  "cipher", wi.getCreatorIdentity() ) && !StringUtils.equals(  "xadmin", wi.getCreatorIdentity() )) {
-					//说明是指定的发布者,并不使用cipher和xadmin代替
+					//说明是实际的用户,并不使用cipher和xadmin代替
 					if (StringUtils.isNotEmpty( wi.getCreatorIdentity() )) {
 						wi.setCreatorPerson( userManagerService.getPersonNameWithIdentity( wi.getCreatorIdentity() ) );
 						wi.setCreatorUnitName( userManagerService.getUnitNameByIdentity( wi.getCreatorIdentity() ) );
@@ -450,7 +459,7 @@ public class ActionPersistPublishContent extends BaseAction {
 
 		private String id = null;
 
-		@FieldDescribe( "文档操作者身份." )
+		@FieldDescribe( "文档操作者身份" )
 		private String identity = null;
 		
 		@FieldDescribe( "数据的路径列表." )
@@ -488,15 +497,18 @@ public class ActionPersistPublishContent extends BaseAction {
 		@FieldDescribe("文档类型,跟随分类类型,信息(默认) | 数据")
 		private String documentType = "信息";
 
+		@FieldDescribe("文档状态: published | draft | checking | error")
+		private String docStatus = "draft";
+
+		@FieldDescribe("分类ID")
+		private String categoryId;
+
 		private String appId;
 
 		private String appName;
 
 		private String appAlias;
 
-		@FieldDescribe("分类ID")
-		private String categoryId;
-
 		private String categoryName;
 
 		private String categoryAlias;
@@ -519,9 +531,6 @@ public class ActionPersistPublishContent extends BaseAction {
 
 		private String creatorTopUnitName;
 
-		@FieldDescribe("文档状态: published | draft | checking | error")
-		private String docStatus = "draft";
-
 		private String description = null;
 
 		private Long viewCount = 0L;

+ 218 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/document/ActionQueryListWithFilterPagingAdmin.java

@@ -0,0 +1,218 @@
+package com.x.cms.assemble.control.jaxrs.document;
+
+import com.google.gson.JsonElement;
+import com.x.base.core.entity.JpaObject;
+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.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+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.cms.core.entity.Document;
+import com.x.cms.core.express.tools.filter.QueryFilter;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 管理员用
+ */
+public class ActionQueryListWithFilterPagingAdmin extends BaseAction {
+
+	private static  Logger logger = LoggerFactory.getLogger(ActionQueryListWithFilterPagingAdmin.class);
+
+	protected ActionResult<List<Wo>> execute( HttpServletRequest request, Integer page, Integer size, JsonElement jsonElement, EffectivePerson effectivePerson ) {
+		ActionResult<List<Wo>> result = new ActionResult<>();		
+		Long total = 0L;
+		Wi wi = null;
+		List<Wo> wos = new ArrayList<>();
+		List<Document> searchResultList = new ArrayList<>();
+		Boolean check = true;
+		Boolean isManager = false;
+		String personName = effectivePerson.getDistinguishedName();
+		QueryFilter queryFilter = null;
+
+		try {
+			wi = this.convertToWrapIn( jsonElement, Wi.class );
+		} catch (Exception e ) {
+			check = false;
+			Exception exception = new ExceptionDocumentInfoProcess( e, "系统在将JSON信息转换为对象时发生异常。JSON:" + jsonElement.toString() );
+			result.error( exception );
+			logger.error( e, effectivePerson, request, null);
+		}
+		if ( wi == null ) { wi = new Wi(); }
+
+		if( StringUtils.isNotEmpty( wi.getPerson() )){
+			personName = wi.getPerson();
+		}
+
+		if( StringUtils.isEmpty( wi.getDocumentType() )) {
+			wi.setDocumentType( "信息" );
+		}
+		
+		if( StringUtils.isNotEmpty( wi.getOrderField() )) {
+			wi.setOrderField( "createTime" );
+		}
+		
+		if( StringUtils.isNotEmpty( wi.getOrderType() )) {
+			wi.setOrderField( "DESC" );
+		}
+		
+		if( ListTools.isNotEmpty( wi.getStatusList() )) {
+			List<String> status = new ArrayList<>();
+			status.add( "published" );
+			wi.setStatusList( status );
+		}
+		
+		if (check) {
+			try {
+				queryFilter = wi.getQueryFilter();
+			} catch (Exception e) {
+				check = false;
+				Exception exception = new ExceptionDocumentInfoProcess(e, "系统在获取查询条件信息时发生异常。");
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+		
+		if( check ) {
+			if( StringUtils.equals( effectivePerson.getDistinguishedName(), personName )){
+				//管理员身份,查全部的
+				try {
+					if( effectivePerson.isManager() || userManagerService.isHasPlatformRole( personName, "CMSManager" )) {
+						isManager = true;
+					}
+				} catch (Exception e) {
+					check = false;
+					Exception exception = new ExceptionDocumentInfoProcess(e, "系统在判断用户是否是管理时发生异常。");
+					result.error(exception);
+					logger.error(e, effectivePerson, request, null);
+				}
+			}else{
+				//管理员查其他人的,以指定人员的权限为准
+				logger.info( "管理员正在尝试查询人员[ {} ]可见的文档信息列表......", personName );
+				try {
+					if( StringUtils.equals( "xadmin", personName )
+							|| userManagerService.isHasPlatformRole( personName, "CMSManager" )
+							|| userManagerService.isHasPlatformRole( personName, "Manager" )) {
+						isManager = true;
+					}
+				} catch (Exception e) {
+					check = false;
+					Exception exception = new ExceptionDocumentInfoProcess(e, "系统在判断用户是否是管理时发生异常。");
+					result.error(exception);
+					logger.error(e, effectivePerson, request, null);
+				}
+			}
+		}
+		
+		if (check) {
+			// 从Review表中查询符合条件的对象总数
+			try {
+				if( isManager ) {
+					personName = null;
+				}
+				total = documentQueryService.countWithCondition( personName, queryFilter );
+			} catch (Exception e) {
+				check = false;
+				Exception exception = new ExceptionDocumentInfoProcess(e, "系统在获取用户可查询到的文档数据条目数量时发生异常。");
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+		
+		if (check) {
+			//document和Review除了sequence还有5个排序列支持title, appAlias, categoryAlias, categoryName, creatorUnitName的分页查询
+			//除了sequence和title, appAlias, categoryAlias, categoryName, creatorUnitName之外,其他的列排序全部在内存进行分页
+			try {
+				searchResultList = documentQueryService.listPagingWithCondition( personName, wi.getOrderField(), wi.getOrderType(), queryFilter, page, size );
+			} catch (Exception e) {
+				check = false;
+				Exception exception = new ExceptionDocumentInfoProcess(e, "系统在根据用户可访问的文档ID列表对文档进行分页查询时发生异常。");
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+		
+		if (check) {
+			if ( searchResultList != null ) {
+				Wo wo = null;
+				for( Document document : searchResultList ) {					
+					try {
+						wo = Wo.copier.copy( document );						
+						if( wo.getCreatorPerson() != null && !wo.getCreatorPerson().isEmpty() ) {
+							wo.setCreatorPersonShort( wo.getCreatorPerson().split( "@" )[0]);
+						}
+						if( wo.getCreatorUnitName() != null && !wo.getCreatorUnitName().isEmpty() ) {
+							wo.setCreatorUnitNameShort( wo.getCreatorUnitName().split( "@" )[0]);
+						}
+						if( wo.getCreatorTopUnitName() != null && !wo.getCreatorTopUnitName().isEmpty() ) {
+							wo.setCreatorTopUnitNameShort( wo.getCreatorTopUnitName().split( "@" )[0]);
+						}
+						if( wi.getNeedData() ) {
+							//需要组装数据
+							wo.setData( documentQueryService.getDocumentData( document ) );
+						}
+					} catch (Exception e) {
+						check = false;
+						Exception exception = new ExceptionDocumentInfoProcess(e, "系统获取文档数据内容信息时发生异常。Id:" + document.getCategoryId());
+						result.error(exception);
+						logger.error(e, effectivePerson, request, null);
+					}
+					wos.add( wo );
+				}
+			}
+		}
+		result.setCount(total);
+		result.setData(wos);
+		return result;
+	}	
+
+	public class DocumentCacheForFilter {
+
+		private Long total = 0L;		
+		private List<Wo> documentList = null;
+
+		public Long getTotal() {
+			return total;
+		}
+
+		public void setTotal(Long total) {
+			this.total = total;
+		}
+
+		public List<Wo> getDocumentList() {
+			return documentList;
+		}
+
+		public void setDocumentList(List<Wo> documentList) {
+			this.documentList = documentList;
+		}	
+	}
+	
+	public static class Wi extends WrapInDocumentFilter{
+
+		@FieldDescribe( "可以查询的人员:DistinguishedName" )
+		private String person = "";
+
+		public String getPerson() {
+			return person;
+		}
+
+		public void setPerson(String person) {
+			this.person = person;
+		}
+	}
+	
+	public static class Wo extends WrapOutDocumentList {
+		
+		public static List<String> Excludes = new ArrayList<String>();
+		
+		public static WrapCopier<Document, Wo> copier = WrapCopierFactory.wo( Document.class, Wo.class, null,JpaObject.FieldsInvisible);
+		
+	}
+}

+ 28 - 4
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/document/DocumentCipherAction.java

@@ -1,10 +1,7 @@
 package com.x.cms.assemble.control.jaxrs.document;
 
 import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
+import javax.ws.rs.*;
 import javax.ws.rs.container.AsyncResponse;
 import javax.ws.rs.container.Suspended;
 import javax.ws.rs.core.Context;
@@ -13,6 +10,7 @@ import javax.ws.rs.core.MediaType;
 import com.google.gson.JsonElement;
 import com.x.base.core.project.annotation.JaxrsDescribe;
 import com.x.base.core.project.annotation.JaxrsMethodDescribe;
+import com.x.base.core.project.annotation.JaxrsParameterDescribe;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
 import com.x.base.core.project.http.HttpMediaType;
@@ -21,6 +19,8 @@ import com.x.base.core.project.jaxrs.StandardJaxrsAction;
 import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
 
+import java.util.List;
+
 @Path("document/cipher")
 @JaxrsDescribe("信息发布信息文档管理(Cipher)")
 public class DocumentCipherAction extends StandardJaxrsAction{
@@ -48,4 +48,28 @@ public class DocumentCipherAction extends StandardJaxrsAction{
 		}
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
+
+	@JaxrsMethodDescribe(value = "分页查询符合过滤条件的已发布的信息内容(管理员和Ciper使用).", action = ActionQueryListWithFilterPagingAdmin.class)
+	@PUT
+	@Path("filter/list/{page}/size/{size}")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void query_listWithFilterPaging( @Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+											@JaxrsParameterDescribe("分页") @PathParam("page") Integer page,
+											@JaxrsParameterDescribe("数量") @PathParam("size") Integer size, JsonElement jsonElement) {
+		EffectivePerson effectivePerson = this.effectivePerson( request );
+		ActionResult<List<ActionQueryListWithFilterPagingAdmin.Wo>> result = new ActionResult<>();
+		Boolean check = true;
+
+		if( check ){
+			try {
+				result = new ActionQueryListWithFilterPagingAdmin().execute( request, page, size, jsonElement, effectivePerson );
+			} catch (Exception e) {
+				result = new ActionResult<>();
+				result.error( e );
+				logger.error( e, effectivePerson, request, null);
+			}
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
 }