Jelajahi Sumber

[task-5885]公告/通知,增加范围(对应公告保存,首页查询,列表查询)

huangws 1 Minggu lalu
induk
melakukan
a68a1922e3

+ 4 - 1
ibps-common-root/modules/org-biz/src/main/java/com/lc/ibps/common/system/repository/NewsRepository.java

@@ -45,5 +45,8 @@ public interface NewsRepository extends IRepository<String, NewsPo,News>{
 	public List<NewsPo> findNotPublicNewsOutOfUser(String currentUserId);
 	public List<NewsPo> findNotPublicNewsOutOfUser(String currentUserId);
 
 
 	public List<NewsPo> findByExpired(Date date);
 	public List<NewsPo> findByExpired(Date date);
-	 
+
+	public List<NewsPo> getScopeNews(List<NewsPo> originalList);
+
+	public boolean isTableExists(String tableName);
 }
 }

+ 97 - 0
ibps-common-root/modules/org-biz/src/main/java/com/lc/ibps/common/system/repository/impl/NewsRepositoryImpl.java

@@ -1,11 +1,20 @@
 package com.lc.ibps.common.system.repository.impl;
 package com.lc.ibps.common.system.repository.impl;
 
 
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.ResultSet;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.Date;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
+import javax.sql.DataSource;
 
 
+import com.lc.ibps.base.framework.table.ICommonDao;
+import com.lc.ibps.base.web.context.ContextUtil;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Repository;
 import org.springframework.stereotype.Repository;
 
 
 import com.lc.ibps.api.base.constants.CacheKeyConstants;
 import com.lc.ibps.api.base.constants.CacheKeyConstants;
@@ -18,6 +27,7 @@ import com.lc.ibps.common.system.domain.News;
 import com.lc.ibps.common.system.persistence.dao.NewsQueryDao;
 import com.lc.ibps.common.system.persistence.dao.NewsQueryDao;
 import com.lc.ibps.common.system.persistence.entity.NewsPo;
 import com.lc.ibps.common.system.persistence.entity.NewsPo;
 import com.lc.ibps.common.system.repository.NewsRepository;
 import com.lc.ibps.common.system.repository.NewsRepository;
+import org.springframework.util.CollectionUtils;
 
 
 /**
 /**
  * ibps_news 仓库的实现类
  * ibps_news 仓库的实现类
@@ -35,6 +45,12 @@ public class NewsRepositoryImpl extends AbstractRepository<String, NewsPo,News>
 	@Resource
 	@Resource
 	private  NewsQueryDao newsQueryDao;
 	private  NewsQueryDao newsQueryDao;
 
 
+	@Autowired
+	private ICommonDao<?> commonDao;
+
+	@Resource
+	private DataSource dataSource;
+
 	public News newInstance() {
 	public News newInstance() {
 		NewsPo po = new NewsPo();
 		NewsPo po = new NewsPo();
 		News news = AppUtil.getBean(News.class);
 		News news = AppUtil.getBean(News.class);
@@ -88,5 +104,86 @@ public class NewsRepositoryImpl extends AbstractRepository<String, NewsPo,News>
 				b().a("curDate", date).p());
 				b().a("curDate", date).p());
         return newsPos;
         return newsPos;
 	}
 	}
+
+	/**
+	 * 根据 t_ggfwb 表范围过滤公告列表
+	 * 兼容旧系统:如果表不存在,直接返回原列表
+	 */
+	public List<NewsPo> getScopeNews(List<NewsPo> originalList) {
+		// 1. 空值保护
+		if (CollectionUtils.isEmpty(originalList)) {
+			return originalList;
+		}
+		if (!isTableExists("t_ggfwb")) {
+			// 表不存在,直接返回,不执行后续逻辑
+			return originalList;
+		}
+		String currentUserId = ContextUtil.getCurrentUserId();
+		String safeUserId = "'" + currentUserId + "'";
+		List<String> allowedNewsIds = new ArrayList<>();
+		// 2. 尝试从 t_ggfwb 表获取范围数据
+		// 使用 try-catch 来兼容旧系统(表不存在的情况)
+		try {
+			// SQL:查询当前用户可见,或者全员可见('ALL')的公告ID
+			String sql = "SELECT DISTINCT gong_gao_id_ FROM t_ggfwb " +
+					"WHERE gong_gao_mu_biao_ = 'ALL' " +
+					"OR gong_gao_mu_biao_ = " + safeUserId;
+			// commonDao.query 返回 List<Map<String, Object>>
+			List<Map<String, Object>> dbList = (List<Map<String, Object>>) commonDao.query(sql, new Object[]{currentUserId});
+			if (!CollectionUtils.isEmpty(dbList)) {
+				for (Map<String, Object> map : dbList) {
+					Object val = map.get("gong_gao_id_");
+					if (val != null) {
+						allowedNewsIds.add(val.toString());
+					}
+				}
+			}
+		} catch (Exception e) {
+			// 捕获异常,判断是否因为“表不存在”引起的
+			String errorMsg = e.getMessage();
+			return originalList;
+		}
+		// 3. 执行过滤
+		// “表存在但为空”时显示所有公告(后面需要屏蔽)
+		if (allowedNewsIds.isEmpty()) return originalList;
+		return originalList.stream()
+				.filter(news -> {
+					String newsId = news.getId(); // 假设 NewsPo 有 getId()
+					return newsId != null && allowedNewsIds.contains(newsId);
+				})
+				.collect(Collectors.toList());
+	}
+
+	public boolean isTableExists(String tableName) {
+		Connection connection = null;
+		try {
+			// 1. 从注入的 DataSource 获取连接
+			connection = dataSource.getConnection();
+
+			// 2. 获取数据库元数据
+			DatabaseMetaData metaData = connection.getMetaData();
+
+			// 3. 查询表信息
+			String[] types = {"TABLE"};
+			ResultSet rs = metaData.getTables(null, null, tableName, types);
+
+			// 4. 如果结果集有下一行,说明表存在
+			return rs.next();
+
+		} catch (Exception e) {
+			// 如果发生异常(如连接失败),默认认为表不存在
+			// log.warn("检查表是否存在时发生异常: " + e.getMessage());
+			return false;
+		} finally {
+			// 5. 关闭连接,避免连接泄漏
+			if (connection != null) {
+				try {
+					connection.close();
+				} catch (Exception e) {
+					// 忽略关闭连接的异常
+				}
+			}
+		}
+	}
 	
 	
 }
 }

+ 2 - 0
ibps-common-root/modules/org-biz/src/main/java/com/lc/ibps/common/system/service/INewsService.java

@@ -60,5 +60,7 @@ public interface INewsService {
 	 * @return
 	 * @return
 	 */
 	 */
 	public List<NewsPo> query(QueryFilter queryFilter);
 	public List<NewsPo> query(QueryFilter queryFilter);
+
+	public void saveNewsScope(String newsType, List<String> scopeUserIds, String newsId);
 	
 	
 }
 }

+ 55 - 0
ibps-common-root/modules/org-biz/src/main/java/com/lc/ibps/common/system/service/impl/NewsService.java

@@ -5,6 +5,9 @@ import java.util.Map;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
 
 
+import com.lc.ibps.base.framework.id.UniqueIdUtil;
+import com.lc.ibps.base.framework.table.ICommonDao;
+import com.lc.ibps.base.web.context.ContextUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
@@ -17,6 +20,9 @@ import com.lc.ibps.common.system.persistence.entity.NewsPo;
 import com.lc.ibps.common.system.repository.NewsRepository;
 import com.lc.ibps.common.system.repository.NewsRepository;
 import com.lc.ibps.common.system.service.INewsRightsService;
 import com.lc.ibps.common.system.service.INewsRightsService;
 import com.lc.ibps.common.system.service.INewsService;
 import com.lc.ibps.common.system.service.INewsService;
+import org.springframework.util.CollectionUtils;
+
+import static com.lc.ibps.base.framework.repository.IRepository.logger;
 
 
 @Service("newsService")
 @Service("newsService")
 public class NewsService implements INewsService {
 public class NewsService implements INewsService {
@@ -28,6 +34,9 @@ public class NewsService implements INewsService {
 	@Resource
 	@Resource
 	private INewsRightsService newsRightsService;
 	private INewsRightsService newsRightsService;
 
 
+	@Resource
+	private ICommonDao commonDao;
+
 	@Override
 	@Override
 	public List<NewsPo> findByIdAndPublic(Map<String, String> pm, Page page) {
 	public List<NewsPo> findByIdAndPublic(Map<String, String> pm, Page page) {
 		return newsRepository.findByIdAndPublic(pm, page);
 		return newsRepository.findByIdAndPublic(pm, page);
@@ -66,4 +75,50 @@ public class NewsService implements INewsService {
 		return newsRepository.query(queryFilter);
 		return newsRepository.query(queryFilter);
 	}
 	}
 
 
+	/**
+ 	* 增加公告范围逻辑
+ 	* **/
+	@Override
+	public void saveNewsScope(String newsType, List<String> scopeUserIds, String newsId) {
+
+		// 1. 获取当前用户ID(用于填充 create_by_)
+		String currentUserId = ContextUtil.getCurrentUserId();
+		try {
+			// 2. 先删除该公告旧的范围记录
+			String delSql = "DELETE FROM t_ggfwb WHERE gong_gao_id_ = '%s'";
+			delSql = String.format(delSql, newsId);
+			commonDao.execute(delSql);
+
+			// 3. 判断是“全员”还是“指定人”
+			if (CollectionUtils.isEmpty(scopeUserIds)) {
+				// --- 情况 A:前端传了 [] 或 null,视为“全员可见” ---
+				// 插入一条特殊记录,用 'ALL' 作为标记
+				String insertSql = "INSERT INTO t_ggfwb (id_, create_by_, create_time_, gong_gao_id_, gong_gao_lei_xing, gong_gao_mu_biao_) " +
+						"VALUES ('%s', '%s', NOW(), '%s', 'ALL', 'ALL')";
+
+				// 生成ID并格式化SQL
+				String id = UniqueIdUtil.getId();
+				insertSql = String.format(insertSql, id, currentUserId, newsId);
+
+				commonDao.execute(insertSql);
+
+			} else {
+				// --- 情况 B:前端传了具体的用户ID列表 ---
+				// 遍历列表,为每个用户插入一条记录
+				for (String targetUserId : scopeUserIds) {
+					String insertSql = "INSERT INTO t_ggfwb (id_, create_by_, create_time_, gong_gao_id_, gong_gao_lei_xing, gong_gao_mu_biao_) " +
+							"VALUES ('%s', '%s', NOW(), '%s', '%s', '%s')";
+
+					// 生成ID并格式化SQL
+					String id = UniqueIdUtil.getId();
+					insertSql = String.format(insertSql, id, currentUserId, newsId, newsType, targetUserId);
+					commonDao.execute(insertSql);
+				}
+			}
+		} catch (Exception e){
+			logger.info(String.format("saveNewsScope failed: %s",e));
+			return;
+		}
+	}
+
 }
 }

+ 14 - 0
ibps-model-root/modules/org-model/src/main/java/com/lc/ibps/common/system/persistence/entity/NewsPo.java

@@ -2,6 +2,8 @@ package com.lc.ibps.common.system.persistence.entity;
 
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModel;
 
 
+import java.util.List;
+
 /**
 /**
  * ibps_news 实体对象
  * ibps_news 实体对象
  *
  *
@@ -15,4 +17,16 @@ import io.swagger.annotations.ApiModel;
  @SuppressWarnings("serial")
  @SuppressWarnings("serial")
 @ApiModel(value = "公告对象")
 @ApiModel(value = "公告对象")
 public class NewsPo extends NewsTbl{
 public class NewsPo extends NewsTbl{
+
+ private List<String> scopeUserIds;
+
+ // Getter
+ public List<String> getScopeUserIds() {
+  return scopeUserIds;
+ }
+
+ // Setter
+ public void setScopeUserIds(List<String> scopeUserIds) {
+  this.scopeUserIds = scopeUserIds;
+ }
 }
 }

+ 5 - 0
ibps-provider-root/modules/provider-platform-default/src/main/java/com/lc/ibps/common/provider/DesktopFacadeProvider.java

@@ -61,12 +61,14 @@ import net.sf.json.JSONObject;
 import org.slf4j.event.Level;
 import org.slf4j.event.Level;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RequestParam;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
 import javax.validation.Valid;
 import javax.validation.Valid;
 import java.text.SimpleDateFormat;
 import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.*;
+import java.util.stream.Collectors;
 
 
 /**
 /**
  * 桌面管理数据展示门面实现类
  * 桌面管理数据展示门面实现类
@@ -723,6 +725,9 @@ public class DesktopFacadeProvider extends GenericProvider implements IDesktopFa
 				queryFilter.addFilter("TYPE_", diDian, QueryOP.EQUAL);
 				queryFilter.addFilter("TYPE_", diDian, QueryOP.EQUAL);
 			}
 			}
 			List<NewsPo> list = newsRepository.query(queryFilter);
 			List<NewsPo> list = newsRepository.query(queryFilter);
+			if(!isSuper && newsRepository.isTableExists("t_ggfwb")){
+				list = newsRepository.getScopeNews(list);
+			}
 			result.setData(list);
 			result.setData(list);
 //			queryFilter.setPage(null);
 //			queryFilter.setPage(null);
 //			int totalCount = newsRepository.query(queryFilter).size();
 //			int totalCount = newsRepository.query(queryFilter).size();

+ 62 - 3
ibps-provider-root/modules/provider-platform-default/src/main/java/com/lc/ibps/common/provider/NewsProvider.java

@@ -1,5 +1,6 @@
 package com.lc.ibps.common.provider;
 package com.lc.ibps.common.provider;
 
 
+import java.lang.reflect.Field;
 import java.util.List;
 import java.util.List;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
@@ -28,6 +29,7 @@ import com.lc.ibps.common.system.persistence.entity.NewsPo;
 import com.lc.ibps.common.system.repository.NewsRepository;
 import com.lc.ibps.common.system.repository.NewsRepository;
 import com.lc.ibps.common.system.repository.NewsRightsRepository;
 import com.lc.ibps.common.system.repository.NewsRightsRepository;
 import com.lc.ibps.common.system.service.INewsRightsService;
 import com.lc.ibps.common.system.service.INewsRightsService;
+import com.lc.ibps.common.system.service.impl.NewsService;
 
 
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
@@ -55,6 +57,8 @@ public class NewsProvider extends GenericProvider implements INewsService, INews
 	private NewsRightsRepository newsRightsRepository;
 	private NewsRightsRepository newsRightsRepository;
 	@Resource
 	@Resource
 	private INewsRightsService iNewsRightsService;
 	private INewsRightsService iNewsRightsService;
+	@Resource
+	private NewsService newsService;
 	
 	
 	@ApiOperation(value = "公告列表(分页条件查询)数据", notes = "公告列表(分页条件查询)数据")
 	@ApiOperation(value = "公告列表(分页条件查询)数据", notes = "公告列表(分页条件查询)数据")
 	@Override
 	@Override
@@ -86,6 +90,10 @@ public class NewsProvider extends GenericProvider implements INewsService, INews
 			queryFilter.addParamsFilter("curUserId", ContextUtil.getCurrentUserId());
 			queryFilter.addParamsFilter("curUserId", ContextUtil.getCurrentUserId());
 			
 			
 			List<NewsPo> newsPos = newsRepository.query(queryFilter);
 			List<NewsPo> newsPos = newsRepository.query(queryFilter);
+			boolean isSuper = ContextUtil.isSuper();
+			if(!isSuper){
+				newsPos = newsRepository.getScopeNews(newsPos);
+			}
 			APIPageList<NewsPo> pageList = getAPIPageList(newsPos);
 			APIPageList<NewsPo> pageList = getAPIPageList(newsPos);
 			result.setData(pageList);
 			result.setData(pageList);
 			result.addVariable("pageResult", pageList.getPageResult());
 			result.addVariable("pageResult", pageList.getPageResult());
@@ -94,7 +102,7 @@ public class NewsProvider extends GenericProvider implements INewsService, INews
 		}
 		}
 		return result;
 		return result;
 	}
 	}
-	
+
 	@ApiOperation(value = "查询公告信息", notes = "根据传入id查询,并返回公告信息")
 	@ApiOperation(value = "查询公告信息", notes = "根据传入id查询,并返回公告信息")
 	@Override
 	@Override
 	public APIResult<NewsPo> get(
 	public APIResult<NewsPo> get(
@@ -109,8 +117,8 @@ public class NewsProvider extends GenericProvider implements INewsService, INews
 		}
 		}
 		return result;
 		return result;
 	}
 	}
-	
-	@ApiOperation(value = "保存", notes = "保存公告信息", 
+
+	@ApiOperation(value = "保存", notes = "保存公告信息",
 			extensions = {
 			extensions = {
 					@Extension(properties = {
 					@Extension(properties = {
 							@ExtensionProperty(name = "submitCtrl", value = StringPool.Y)
 							@ExtensionProperty(name = "submitCtrl", value = StringPool.Y)
@@ -119,6 +127,56 @@ public class NewsProvider extends GenericProvider implements INewsService, INews
 	@Signature
 	@Signature
 	@Override
 	@Override
 	public APIResult<Void> save(
 	public APIResult<Void> save(
+			@ApiParam(name = "newsPo", value = "公告信息对象", required = true)
+			@RequestBody(required = true) NewsPo newsPo) { // 保持原有参数不变
+
+		APIResult<Void> result = new APIResult<>();
+		boolean hasScope = true;
+		List<String> scopeUserIds = null;
+		try {
+			scopeUserIds = newsPo.getScopeUserIds();
+			hasScope = scopeUserIds != null;
+
+			if(StringUtils.isNotEmpty(newsPo.getId())){
+				APIResult<NewsPo> newsPoAPIResult = get(newsPo.getId());
+				NewsPo data = newsPoAPIResult.getData();
+				if(data != null){
+					if(!data.getUserId().equalsIgnoreCase(ContextUtil.getCurrentUserId())){
+						throw new Exception("不能修改其他人的公告!");
+					}
+				}
+			}
+			//构造领域对象和保存数据
+			News news = newsRepository.newInstance(newsPo);
+			news.save();
+			String newsId = newsPo.getId();
+			String deptIdStr = newsPo.getDepId();
+			iNewsRightsService.saveNewsRights(deptIdStr, newsId);
+			result.setMessage(I18nUtil.getMessage("com.lc.ibps.common.provider.NewsProvider.save"));
+			result.addVariable("id", newsId);
+			//使用 scopeUserIds 做业务逻辑
+			if (hasScope == true && scopeUserIds != null && newsRepository.isTableExists("t_ggfwb")) {
+				//暂定newsType为user,后期可扩展(user=用户, dept=部门, role=角色')
+				newsService.saveNewsScope("user", scopeUserIds,newsId);
+			}
+
+		} catch (Exception e) {
+			setExceptionResult(result, StateEnum.ERROR_NEWS.getCode(), I18nUtil.getMessage(StateEnum.ERROR_NEWS.getCode()+""), e);
+		}
+		return result;
+	}
+
+/**
+ * 公告增加可见范围
+	@ApiOperation(value = "保存", notes = "保存公告信息",
+			extensions = {
+					@Extension(properties = {
+							@ExtensionProperty(name = "submitCtrl", value = StringPool.Y)
+					})
+			})
+	@Signature
+	@Override
+	public APIResult<Void> saveold(
 			@ApiParam(name = "newsPo", value = "公告信息对象", required = true) 
 			@ApiParam(name = "newsPo", value = "公告信息对象", required = true) 
 			@RequestBody(required = true) NewsPo newsPo) {
 			@RequestBody(required = true) NewsPo newsPo) {
 		APIResult<Void> result = new APIResult<>();
 		APIResult<Void> result = new APIResult<>();
@@ -146,6 +204,7 @@ public class NewsProvider extends GenericProvider implements INewsService, INews
 		}
 		}
 		return result;
 		return result;
 	}
 	}
+	*/
 	
 	
 	@ApiOperation(value = "删除(批量)", notes = "批量删除公告记录", 
 	@ApiOperation(value = "删除(批量)", notes = "批量删除公告记录", 
 			extensions = {
 			extensions = {