Преглед изворни кода

CMS增加定时重新计算和维护Review权限信息的功能(临时解决方案)

o2lee пре 5 година
родитељ
комит
156e88a4ad

+ 5 - 4
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/ThisApplication.java

@@ -3,10 +3,7 @@ package com.x.cms.assemble.control;
 import com.x.base.core.project.Context;
 import com.x.base.core.project.message.MessageConnector;
 import com.x.cms.assemble.control.queue.*;
-import com.x.cms.assemble.control.timertask.Timertask_BatchOperationTask;
-import com.x.cms.assemble.control.timertask.Timertask_CheckDocumentReviewStatus;
-import com.x.cms.assemble.control.timertask.Timertask_InitOperationRunning;
-import com.x.cms.assemble.control.timertask.Timertask_LogRecordCheckTask;
+import com.x.cms.assemble.control.timertask.*;
 
 import java.util.concurrent.ConcurrentHashMap;
 
@@ -53,6 +50,10 @@ public class ThisApplication {
 		// 每天凌晨2点执行一次
 		context.schedule( Timertask_LogRecordCheckTask.class, "0 0 2 * * ?" );
 		context.schedule( Timertask_BatchOperationTask.class, "0 */5 * * * ?" );
+
+		//每天凌晨2点,计算所有的文档的权限信息
+		context.schedule( Timertask_RefreshAllDocumentReviews.class, "0 0 2 * * ?" );
+
 		context.scheduleLocal( Timertask_CheckDocumentReviewStatus.class, 1200 );
 		context.scheduleLocal( Timertask_InitOperationRunning.class, 150 );
 	}

+ 2 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/ActionApplication.java

@@ -26,6 +26,7 @@ import com.x.cms.assemble.control.jaxrs.log.LogAction;
 import com.x.cms.assemble.control.jaxrs.output.OutputAction;
 import com.x.cms.assemble.control.jaxrs.permission.PermissionAction;
 import com.x.cms.assemble.control.jaxrs.permission.PermissionForDocumentAction;
+import com.x.cms.assemble.control.jaxrs.permission.PermissionManagerAction;
 import com.x.cms.assemble.control.jaxrs.queryview.QueryViewAction;
 import com.x.cms.assemble.control.jaxrs.queryviewdesign.QueryViewDesignAction;
 import com.x.cms.assemble.control.jaxrs.script.ScriptAction;
@@ -53,6 +54,7 @@ public class ActionApplication extends AbstractActionApplication {
 		this.classes.add(DocumentAction.class);
 		this.classes.add(DocumentCipherAction.class);
 		this.classes.add(PermissionForDocumentAction.class);
+		this.classes.add(PermissionManagerAction.class);
 		this.classes.add(DocumentViewRecordAction.class);
 		this.classes.add(FileInfoAction.class);
 		this.classes.add(FileAction.class);

+ 4 - 3
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/CmsJaxrsCipherFilter.java

@@ -1,6 +1,6 @@
 package com.x.cms.assemble.control.jaxrs;
 
-import com.x.base.core.project.jaxrs.CipherJaxrsFilter;
+import com.x.base.core.project.jaxrs.CipherManagerJaxrsFilter;
 
 import javax.servlet.annotation.WebFilter;
 
@@ -11,8 +11,9 @@ import javax.servlet.annotation.WebFilter;
  * @author O2LEE *
  */
 @WebFilter(urlPatterns = { 
-		"/jaxrs/document/cipher/*"
+		"/jaxrs/document/cipher/*",
+		"/jaxrs/permission/manager*"
 }, asyncSupported = true )
-public class CmsJaxrsCipherFilter extends CipherJaxrsFilter {
+public class CmsJaxrsCipherFilter extends CipherManagerJaxrsFilter {
 
 }

+ 43 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/permission/ActionRefreshAllDocumentPermission.java

@@ -0,0 +1,43 @@
+package com.x.cms.assemble.control.jaxrs.permission;
+
+import com.x.base.core.project.annotation.FieldDescribe;
+import com.x.base.core.project.cache.ApplicationCache;
+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.cms.assemble.control.service.DocumentPersistService;
+import com.x.base.core.project.jaxrs.WrapString;
+import com.x.cms.core.entity.Document;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+public class ActionRefreshAllDocumentPermission extends BaseAction {
+
+	private static Logger logger = LoggerFactory.getLogger(ActionRefreshAllDocumentPermission.class);
+
+	protected ActionResult<Wo> execute(HttpServletRequest request, EffectivePerson effectivePerson) throws Exception {
+		ActionResult<Wo> result = new ActionResult<>();
+		Boolean check = true;
+		Wo wo = new Wo();
+		DocumentPersistService documentPersistService = new DocumentPersistService();
+
+		if (check) {
+			try {
+				documentPersistService.refreshAllDocumentPermission();
+				wo.setValue("权限处理完成!");
+				result.setData(wo);
+			} catch (Exception e) {
+				Exception exception = new ExceptionDocumentPermissionProcess(e, "文档权限管理时出现异常。");
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+		ApplicationCache.notify(Document.class);
+		return result;
+	}
+
+	public static class Wo extends WrapString {
+	}
+}

+ 12 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/permission/ExceptionDocumentPermissionProcess.java

@@ -0,0 +1,12 @@
+package com.x.cms.assemble.control.jaxrs.permission;
+
+import com.x.base.core.project.exception.PromptException;
+
+class ExceptionDocumentPermissionProcess extends PromptException {
+
+	private static final long serialVersionUID = 1859164370743532895L;
+
+	ExceptionDocumentPermissionProcess(Throwable e, String message ) {
+		super( message, e );
+	}
+}

+ 51 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/jaxrs/permission/PermissionManagerAction.java

@@ -0,0 +1,51 @@
+package com.x.cms.assemble.control.jaxrs.permission;
+
+import com.x.base.core.project.annotation.JaxrsDescribe;
+import com.x.base.core.project.annotation.JaxrsMethodDescribe;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.http.HttpMediaType;
+import com.x.base.core.project.jaxrs.ResponseFactory;
+import com.x.base.core.project.jaxrs.StandardJaxrsAction;
+import com.x.base.core.project.jaxrs.proxy.StandardJaxrsActionProxy;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.cms.assemble.control.ThisApplication;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.*;
+import javax.ws.rs.container.AsyncResponse;
+import javax.ws.rs.container.Suspended;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+
+@Path("permission/manager")
+@JaxrsDescribe("文档权限操作服务(管理员)")
+public class PermissionManagerAction extends StandardJaxrsAction {
+
+	private StandardJaxrsActionProxy proxy = new StandardJaxrsActionProxy(ThisApplication.context());
+	private static  Logger logger = LoggerFactory.getLogger( PermissionManagerAction.class );
+
+	@JaxrsMethodDescribe(value = "重新计算所有文档的权限信息.", action = ActionRefreshAllDocumentPermission.class)
+	@GET
+	@Path("refresh/all")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void refreshAllDocument( @Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request ) {
+		EffectivePerson effectivePerson = this.effectivePerson( request );
+		ActionResult<ActionRefreshAllDocumentPermission.Wo> result = new ActionResult<>();
+		Boolean check = true;
+		if( check ){
+			try {
+				result = new ActionRefreshAllDocumentPermission().execute( request, effectivePerson );
+			} catch (Exception e) {
+				result = new ActionResult<>();
+				Exception exception = new ExceptionAppCategoryAdminProcess( e, "查询登录用户是否指定栏目的管理员时发生异常。" );
+				result.error( exception );
+				logger.error( e, effectivePerson, request, null);
+			}
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
+}

+ 30 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/service/DocumentPersistService.java

@@ -5,6 +5,7 @@ import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
 import com.x.base.core.entity.annotation.CheckPersistType;
 import com.x.base.core.entity.dataitem.ItemCategory;
+import com.x.base.core.project.cache.ApplicationCache;
 import com.x.base.core.project.tools.ListTools;
 import com.x.cms.assemble.control.DocumentDataHelper;
 import com.x.cms.assemble.control.jaxrs.document.ActionPersistBatchModifyData.WiDataChange;
@@ -320,4 +321,33 @@ public class DocumentPersistService {
 		}
 		permissionService.refreshDocumentPermission(docId, permissionList);
 	}
+
+	/**
+	 * 重新计算所有的文档的权限和review信息
+	 */
+    public void refreshAllDocumentPermission() throws Exception {
+    	//根据栏目一个一个来查询
+		AppInfoServiceAdv appInfoService = new AppInfoServiceAdv();
+		DocumentQueryService documentQueryService = new DocumentQueryService();
+		DocumentPersistService documentPersistService = new DocumentPersistService();
+		List<String> appIds = appInfoService.listAllIds("信息");
+		List<String> documentIds = null;
+		ReviewService reviewService = new ReviewService();
+		if( ListTools.isNotEmpty( appIds )){
+			for( String appId : appIds ){
+				//查询指定App中所有的文档Id
+				documentIds = documentQueryService.listIdsByAppId( appId, "信息", 20000 );
+				if( ListTools.isNotEmpty( documentIds )){
+					for( String documentId : documentIds ){
+						try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create() ) {
+							reviewService.refreshDocumentReview(emc, documentId);
+						} catch ( Exception e ) {
+							throw e;
+						}
+					}
+				}
+			}
+			ApplicationCache.notify(Document.class);
+		}
+    }
 }

+ 116 - 2
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/service/PermissionOperateService.java

@@ -3,6 +3,12 @@ package com.x.cms.assemble.control.service;
 import java.util.ArrayList;
 import java.util.List;
 
+import com.google.gson.JsonElement;
+import com.x.base.core.entity.dataitem.DataItemConverter;
+import com.x.base.core.project.gson.XGsonBuilder;
+import com.x.cms.assemble.control.DocumentDataHelper;
+import com.x.cms.core.entity.content.Data;
+import com.x.query.core.entity.Item;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.openjpa.lib.util.StringUtil;
 
@@ -22,7 +28,7 @@ public class PermissionOperateService {
 	private static Logger logger = LoggerFactory.getLogger(PermissionOperateService.class);
 	/**
 	 * 根据文档ID,为文档设置用户访问和管理权限
-	 * @param document
+	 * @param docId
 	 * @param readerList
 	 * @param authorList
 	 * @throws Exception
@@ -131,7 +137,7 @@ public class PermissionOperateService {
 	
 	/**
 	 * 根据文档ID,为文档设置用户访问和管理权限
-	 * @param docmentId
+	 * @param docId
 	 * @param permissionList
 	 * @throws Exception 
 	 */
@@ -206,4 +212,112 @@ public class PermissionOperateService {
 			throw e;
 		}
 	}
+
+//	/**
+//	 * 根据文档的权限信息组织所有的权限对象列表
+//	 * @param document
+//	 * @throws Exception
+//	 */
+//	public List<PermissionInfo> composeDocmentAllPermissions( Document document ) throws Exception {
+//
+//		List<PermissionInfo> permissionList = new ArrayList<>();
+//		//处理创建者
+//		permissionList.add( new PermissionInfo( PermissionName.READER, "人员", document.getCreatorIdentity(), document.getCreatorIdentity() ) );
+//		permissionList.add( new PermissionInfo( PermissionName.AUTHOR, "人员", document.getCreatorIdentity(), document.getCreatorIdentity() ) );
+//		permissionList.add( new PermissionInfo( PermissionName.MANAGER, "人员", document.getCreatorIdentity(), document.getCreatorIdentity() ) );
+//
+//		if ( ListTools.isEmpty( document.getAuthorPersonList() ) ) {
+//			for( String permissionCode : document.getAuthorPersonList() ){
+//				if( !existsPermission(permissionList, PermissionName.AUTHOR, "permissionCode") ){
+//					if( StringUtils.equalsIgnoreCase("所有人", permissionCode )){
+//						permissionList.add( new PermissionInfo( PermissionName.AUTHOR, "所有人", "所有人", "所有人" ) );
+//					}else{
+//						permissionList.add( new PermissionInfo( PermissionName.AUTHOR, "人员", permissionCode, permissionCode ) );
+//					}
+//				}
+//			}
+//		}
+//
+//		if ( ListTools.isEmpty( document.getAuthorUnitList() ) ) {
+//			for( String permissionCode : document.getAuthorUnitList() ){
+//				if( !existsPermission(permissionList, PermissionName.AUTHOR, "permissionCode") ){
+//					if( StringUtils.equalsIgnoreCase("所有人", permissionCode )){
+//						permissionList.add( new PermissionInfo( PermissionName.AUTHOR, "所有人", "所有人", "所有人" ) );
+//					}else{
+//						permissionList.add( new PermissionInfo( PermissionName.AUTHOR, "组织", permissionCode, permissionCode ) );
+//					}
+//				}
+//			}
+//		}
+//
+//		if ( ListTools.isEmpty( document.getAuthorGroupList() ) ) {
+//			for( String permissionCode : document.getAuthorUnitList() ){
+//				if( !existsPermission(permissionList, PermissionName.AUTHOR, "permissionCode") ){
+//					if( StringUtils.equalsIgnoreCase("所有人", permissionCode )){
+//						permissionList.add( new PermissionInfo( PermissionName.AUTHOR, "所有人", "所有人", "所有人" ) );
+//					}else{
+//						permissionList.add( new PermissionInfo( PermissionName.AUTHOR, "群组", permissionCode, permissionCode ) );
+//					}
+//				}
+//			}
+//		}
+//
+//		if ( ListTools.isEmpty( document.getReadPersonList() ) ) {
+//			for( String permissionCode : document.getReadPersonList() ){
+//				if( !existsPermission(permissionList, PermissionName.READER, "permissionCode") ){
+//					if( StringUtils.equalsIgnoreCase("所有人", permissionCode )){
+//						permissionList.add( new PermissionInfo( PermissionName.READER, "所有人", "所有人", "所有人" ) );
+//					}else{
+//						permissionList.add( new PermissionInfo( PermissionName.READER, "人员", permissionCode, permissionCode ) );
+//					}
+//				}
+//			}
+//		}
+//
+//		if ( ListTools.isEmpty( document.getReadUnitList() ) ) {
+//			for( String permissionCode : document.getReadUnitList() ){
+//				if( !existsPermission(permissionList, PermissionName.READER, "permissionCode") ) {
+//					if( StringUtils.equalsIgnoreCase("所有人", permissionCode )){
+//						permissionList.add( new PermissionInfo( PermissionName.READER, "所有人", "所有人", "所有人" ) );
+//					}else{
+//						permissionList.add( new PermissionInfo( PermissionName.READER, "组织", permissionCode, permissionCode ) );
+//					}
+//				}
+//
+//			}
+//		}
+//
+//		if ( ListTools.isEmpty( document.getReadGroupList() ) ) {
+//			for( String permissionCode : document.getReadGroupList() ){
+//				if( !existsPermission(permissionList, PermissionName.READER, "permissionCode") ){
+//					if( StringUtils.equalsIgnoreCase("所有人", permissionCode )){
+//						permissionList.add( new PermissionInfo( PermissionName.READER, "所有人", "所有人", "所有人" ) );
+//					}else{
+//						permissionList.add( new PermissionInfo( PermissionName.READER, "群组", permissionCode, permissionCode ) );
+//					}
+//				}
+//			}
+//		}
+//
+//		if ( ListTools.isEmpty( document.getManagerList() ) ) {
+//			for( String permissionCode : document.getManagerList() ){
+//				if( !existsPermission(permissionList, PermissionName.MANAGER, "permissionCode") ){
+//					permissionList.add( new PermissionInfo( PermissionName.MANAGER, "人员", permissionCode, permissionCode ) );
+//				}
+//			}
+//		}
+//		return permissionList;
+//	}
+
+	private boolean existsPermission(List<PermissionInfo> permissionList, String objectType, String permissionCode) {
+		if( ListTools.isNotEmpty( permissionList )){
+			for ( PermissionInfo permission : permissionList ){
+				if( StringUtils.equalsIgnoreCase( permission.getPermissionObjectCode(), permissionCode ) &&
+						StringUtils.equalsIgnoreCase( permission.getPermissionObjectType(), objectType )){
+					return true;
+				}
+			}
+		}
+		return false;
+	}
 }

+ 1 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/service/ReviewService.java

@@ -108,6 +108,7 @@ public class ReviewService {
 		Document document = emc.find( docId, Document.class );
 		
 		if( document != null ) {
+
 			AppInfo appInfo = emc.find( document.getAppId(), AppInfo.class );
 			CategoryInfo categoryInfo = emc.find( document.getCategoryId(), CategoryInfo.class );		
 			

+ 23 - 0
o2server/x_cms_assemble_control/src/main/java/com/x/cms/assemble/control/timertask/Timertask_RefreshAllDocumentReviews.java

@@ -0,0 +1,23 @@
+package com.x.cms.assemble.control.timertask;
+
+import com.x.base.core.project.schedule.AbstractJob;
+import com.x.cms.assemble.control.service.CmsBatchOperationPersistService;
+import com.x.cms.assemble.control.service.DocumentPersistService;
+import com.x.cms.assemble.control.service.ReviewService;
+import org.quartz.JobExecutionContext;
+
+/**
+ * 重新计算所有文档的权限信息
+ *
+ */
+public class Timertask_RefreshAllDocumentReviews extends AbstractJob {
+	
+	private CmsBatchOperationPersistService cmsBatchOperationPersistService;
+
+	@Override
+	public void schedule(JobExecutionContext jobExecutionContext) throws Exception {
+		DocumentPersistService documentPersistService = new DocumentPersistService();
+		documentPersistService.refreshAllDocumentPermission();
+	}
+
+}