提交 4d6469d0 编写于 作者: O o2sword

增加根据分类刷新文档权限接口

上级 af8c69e4
package com.x.cms.assemble.control.jaxrs.permission;
import com.x.base.core.project.cache.CacheManager;
import com.x.base.core.project.http.ActionResult;
import com.x.base.core.project.http.EffectivePerson;
import com.x.base.core.project.jaxrs.WrapString;
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.cms.core.entity.Document;
import javax.servlet.http.HttpServletRequest;
import java.util.concurrent.locks.ReentrantLock;
public class ActionRefreshCategoryDocPermission extends BaseAction {
private static Logger logger = LoggerFactory.getLogger(ActionRefreshCategoryDocPermission.class);
protected ActionResult<Wo> execute(HttpServletRequest request, EffectivePerson effectivePerson, String categoryId) throws Exception {
ActionResult<Wo> result = new ActionResult<>();
Boolean check = true;
Wo wo = new Wo();
DocumentPersistService documentPersistService = new DocumentPersistService();
if (check) {
try {
boolean flag = documentPersistService.refreshDocumentPermissionByCategory(categoryId);
if(flag) {
wo.setValue("权限处理完成!");
}else{
wo.setValue("权限刷新失败,可能有其他分类正在刷新权限!");
}
result.setData(wo);
} catch (Exception e) {
Exception exception = new ExceptionDocumentPermissionProcess();
result.error(exception);
logger.error(e, effectivePerson, request, null);
}
}
CacheManager.notify(Document.class);
return result;
}
public static class Wo extends WrapString {
}
}
......@@ -2,6 +2,7 @@ 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.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;
......@@ -45,4 +46,27 @@ public class PermissionManagerAction extends StandardJaxrsAction {
asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
}
@JaxrsMethodDescribe(value = "重新计算指定分类文档的权限信息.", action = ActionRefreshCategoryDocPermission.class)
@GET
@Path("refresh/category/{categoryId}")
@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
@Consumes(MediaType.APPLICATION_JSON)
public void refreshCategoryDocument( @Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
@JaxrsParameterDescribe("分类ID") @PathParam("categoryId") String categoryId ) {
EffectivePerson effectivePerson = this.effectivePerson( request );
ActionResult<ActionRefreshCategoryDocPermission.Wo> result = new ActionResult<>();
Boolean check = true;
if( check ){
try {
result = new ActionRefreshCategoryDocPermission().execute( request, effectivePerson, categoryId);
} 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));
}
}
\ No newline at end of file
......@@ -5,8 +5,9 @@ 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.cache.CacheManager;
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.assemble.control.DocumentDataHelper;
import com.x.cms.assemble.control.jaxrs.document.ActionPersistBatchModifyData.WiDataChange;
......@@ -14,17 +15,29 @@ import com.x.cms.assemble.control.jaxrs.document.ActionPersistBatchModifyData.Wo
import com.x.cms.assemble.control.jaxrs.permission.element.PermissionInfo;
import com.x.cms.core.entity.CategoryInfo;
import com.x.cms.core.entity.Document;
import com.x.cms.core.entity.Document_;
import com.x.cms.core.entity.content.Data;
import com.x.query.core.entity.Item;
import org.apache.commons.collections4.list.TreeList;
import org.apache.commons.lang3.StringUtils;
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.Date;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
/**
* 对文档信息进行持久化服务类
*/
public class DocumentPersistService {
private static Logger logger = LoggerFactory.getLogger(DocumentPersistService.class);
private static ReentrantLock lock = new ReentrantLock();
private DocumentInfoService documentInfoService = new DocumentInfoService();
private PermissionOperateService permissionService = new PermissionOperateService();
......@@ -329,31 +342,120 @@ public class DocumentPersistService {
* 重新计算所有的文档的权限和review信息
*/
public void refreshAllDocumentPermission() throws Exception {
//根据栏目一个一个来查询
AppInfoServiceAdv appInfoService = new AppInfoServiceAdv();
DocumentQueryService documentQueryService = new DocumentQueryService();
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, "信息", 50000 );
if( ListTools.isNotEmpty( documentIds )){
for( String documentId : documentIds ){
try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create() ) {
boolean fullRead = reviewService.refreshDocumentReview(emc, documentId);
Document document = emc.find( documentId, Document.class );
emc.beginTransaction( Document.class );
document.setIsAllRead(fullRead);
emc.commit();
} catch ( Exception e ) {
throw e;
try {
if(lock.tryLock()) {
AppInfoServiceAdv appInfoService = new AppInfoServiceAdv();
DocumentQueryService documentQueryService = new DocumentQueryService();
List<String> appIds = appInfoService.listAllIds("信息");
if (ListTools.isNotEmpty(appIds)) {
for (String appId : appIds) {
//查询指定App中所有的文档Id
List<String> documentIds = documentQueryService.listIdsByAppId(appId, "信息", 50000);
logger.info("刷新应用{}的数据共{}条",appId,documentIds.size());
if (ListTools.isNotEmpty(documentIds)) {
int count = 0;
for (List<String> partDocIds : ListTools.batch(documentIds, 10)){
count = count + 10;
List<CompletableFuture<Void>> futures = new TreeList<>();
for (String documentId : partDocIds) {
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
ReviewService reviewService = new ReviewService();
boolean fullRead = reviewService.refreshDocumentReview(emc, documentId);
Document document = emc.find(documentId, Document.class);
emc.beginTransaction(Document.class);
document.setIsAllRead(fullRead);
emc.commit();
} catch (Exception e) {
logger.warn("刷新文档权限异常1:{}", e.getMessage());
}
});
futures.add(future);
}
for (CompletableFuture<Void> future : futures) {
try {
future.get(200, TimeUnit.SECONDS);
} catch (Exception e) {
logger.warn("刷新文档权限异常2:{}",e.getMessage());
}
}
futures.clear();
if(count > 99 && count % 100 == 0){
logger.info("应用文档权限已刷新{}个",count);
}
}
}
}
CacheManager.notify(Document.class);
}
lock.unlock();
}
CacheManager.notify(Document.class);
} catch (Exception e) {
lock.unlock();
logger.error(e);
}
}
}
public boolean refreshDocumentPermissionByCategory(String categoryId) {
boolean flag = false;
try {
if(lock.tryLock()) {
List<String> documentIds = null;
try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
EntityManager em = emc.get( Document.class );
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<String> cq = cb.createQuery( String.class );
Root<Document> root = cq.from( Document.class );
Predicate p = cb.equal(root.get( Document_.categoryId ), categoryId );
p = cb.and( p, cb.equal( root.get( Document_.documentType), "信息"));
cq.select( root.get( Document_.id) ).where(p);
documentIds = em.createQuery( cq ).getResultList();
}
if (ListTools.isNotEmpty(documentIds)) {
logger.info("刷新分类{}的数据共{}条",categoryId,documentIds.size());
int count = 0;
for (List<String> partDocIds : ListTools.batch(documentIds, 10)){
count = count + 10;
List<CompletableFuture<Void>> futures = new TreeList<>();
for (String documentId : partDocIds) {
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
ReviewService reviewService = new ReviewService();
boolean fullRead = reviewService.refreshDocumentReview(emc, documentId);
Document document = emc.find(documentId, Document.class);
emc.beginTransaction(Document.class);
document.setIsAllRead(fullRead);
emc.commit();
} catch (Exception e) {
logger.warn("刷新文档权限异常1:{}", e.getMessage());
}
});
futures.add(future);
}
for (CompletableFuture<Void> future : futures) {
try {
future.get(200, TimeUnit.SECONDS);
} catch (Exception e) {
logger.warn("刷新文档权限异常2:{}",e.getMessage());
}
}
futures.clear();
if(count > 99 && count % 100 == 0){
logger.info("分类文档权限已刷新{}个",count);
}
}
}
CacheManager.notify(Document.class);
lock.unlock();
flag = true;
logger.info("完成分类{}的权限刷新", categoryId);
}else{
logger.info("有分类正在刷新权限中,请稍后....");
}
} catch (Exception e) {
lock.unlock();
logger.error(e);
}
return flag;
}
}
......@@ -15,6 +15,8 @@ import com.x.cms.core.entity.Review;
import com.x.cms.core.express.tools.filter.QueryFilter;
import org.apache.commons.lang3.StringUtils;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import java.util.ArrayList;
import java.util.List;
......@@ -567,20 +569,23 @@ public class ReviewService {
*/
private void refreshDocumentReview( EntityManagerContainer emc, AppInfo appInfo, CategoryInfo categoryInfo, Document document, List<String> permissionPersons) throws Exception {
Business business = new Business(emc);
Review review = null;
List<Review> reviews = null;
//先检查该文档是否存在Review信息
List<String> oldReviewIds = business.reviewFactory().listByDocument( document.getId(), 9999 );
//先删除原来所有的Review信息
if( ListTools.isNotEmpty( oldReviewIds )) {
Review oldReview = null;
emc.beginTransaction( Review.class );
int i = 0;
for( String reviewId : oldReviewIds ){
oldReview = emc.find( reviewId, Review.class );
Review oldReview = emc.find( reviewId, Review.class );
if( oldReview != null ){
emc.remove( oldReview, CheckRemoveType.all );
i++;
if(i>99 && i % 100 ==0){
emc.commit();
emc.beginTransaction( Review.class );
}
}
}
emc.commit();
......@@ -592,6 +597,7 @@ public class ReviewService {
emc.beginTransaction( Review.class );
Person personObj = null;
String personName = null;
int i = 0;
for( String person : permissionPersons ) {
if( !person.equalsIgnoreCase( "*" )) {
//检查一下个人是否存在,防止姓名或者唯一标识变更过了导致文档权限不正确
......@@ -604,11 +610,16 @@ public class ReviewService {
}
if( StringUtils.isNotEmpty( personName )) {
//查询一下,数据库里, 是否有相同的数据,如果有,就不再添加了
oldReviewIds = business.reviewFactory().listByDocumentAndPerson( document.getId(), personName );
if( ListTools.isEmpty( oldReviewIds )) {
review = createReviewWithDocument( appInfo, categoryInfo, document, personName );
emc.persist( review, CheckPersistType.all );
}
oldReviewIds = business.reviewFactory().listByDocumentAndPerson( document.getId(), personName );
if( ListTools.isEmpty( oldReviewIds )) {
Review review = createReviewWithDocument( appInfo, categoryInfo, document, personName );
emc.persist( review, CheckPersistType.all );
i++;
if(i>99 && i % 100 ==0){
emc.commit();
emc.beginTransaction( Review.class );
}
}
}
}
emc.commit();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册