diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtSysMsgMapper.java b/backend/src/main/java/io/dataease/base/mapper/ext/ExtSysMsgMapper.java
new file mode 100644
index 0000000000..9d5c2ad132
--- /dev/null
+++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtSysMsgMapper.java
@@ -0,0 +1,36 @@
+package io.dataease.base.mapper.ext;
+
+import org.apache.ibatis.annotations.Delete;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Update;
+
+import java.util.List;
+
+@Mapper
+public interface ExtSysMsgMapper {
+
+
+ @Update({
+ ""
+ })
+ int batchStatus(@Param("msgIds") List msgIds);
+
+
+ @Delete({
+ ""
+ })
+ int batchDelete(@Param("msgIds") List msgIds);
+
+
+}
diff --git a/backend/src/main/java/io/dataease/controller/message/MsgController.java b/backend/src/main/java/io/dataease/controller/message/MsgController.java
index 49d6de81c7..a3125df1de 100644
--- a/backend/src/main/java/io/dataease/controller/message/MsgController.java
+++ b/backend/src/main/java/io/dataease/controller/message/MsgController.java
@@ -36,4 +36,15 @@ public class MsgController {
public void setReaded(@PathVariable Long msgId) {
sysMsgService.setReaded(msgId);
}
+
+
+ @PostMapping("/batchRead")
+ public void batchRead(@RequestBody List msgIds) {
+ sysMsgService.setBatchReaded(msgIds);
+ }
+
+ @PostMapping("/batchDelete")
+ public void batchDelete(@RequestBody List msgIds) {
+ sysMsgService.batchDelete(msgIds);
+ }
}
diff --git a/backend/src/main/java/io/dataease/controller/message/dto/MsgRequest.java b/backend/src/main/java/io/dataease/controller/message/dto/MsgRequest.java
index c95b20d637..c081703309 100644
--- a/backend/src/main/java/io/dataease/controller/message/dto/MsgRequest.java
+++ b/backend/src/main/java/io/dataease/controller/message/dto/MsgRequest.java
@@ -3,11 +3,16 @@ package io.dataease.controller.message.dto;
import lombok.Data;
import java.io.Serializable;
+import java.util.List;
@Data
public class MsgRequest implements Serializable {
+ private static final long serialVersionUID = 1920091635946508658L;
+
private Integer type;
private Boolean status;
+
+ private List orders;
}
diff --git a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java
index 7f233d6fa5..b3583a2ebd 100644
--- a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java
+++ b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java
@@ -10,6 +10,7 @@ import io.dataease.commons.constants.JdbcConstants;
import io.dataease.commons.utils.AuthUtils;
import io.dataease.commons.utils.BeanUtils;
import io.dataease.commons.utils.CommonBeanFactory;
+import io.dataease.commons.utils.LogUtil;
import io.dataease.controller.request.chart.ChartExtFilterRequest;
import io.dataease.controller.request.chart.ChartExtRequest;
import io.dataease.controller.request.chart.ChartGroupRequest;
@@ -239,7 +240,17 @@ public class ChartViewService {
else {
data = (List) cache;
}*/
- data = cacheViewData(datasourceProvider, datasourceRequest, id);
+ try{
+ data = cacheViewData(datasourceProvider, datasourceRequest, id);
+ }catch (Exception e) {
+ LogUtil.error(e);
+ }finally {
+ // 如果当前对象被锁 且 当前线程冲入次数 > 0 则释放锁
+ if (lock.isLocked() && lock.getHoldCount() > 0) {
+ lock.unlock();
+ }
+ }
+
}
if (StringUtils.containsIgnoreCase(view.getType(), "pie") && data.size() > 1000) {
data = data.subList(0, 1000);
@@ -320,11 +331,17 @@ public class ChartViewService {
Object cache = CacheUtils.get(JdbcConstants.VIEW_CACHE_KEY, viewId);
if (cache == null) {
if (lock.tryLock()) {// 获取锁成功
- result = datasourceProvider.getData(datasourceRequest);
- if (result != null) {
- CacheUtils.put(JdbcConstants.VIEW_CACHE_KEY, viewId, result, null, null);
+ try{
+ result = datasourceProvider.getData(datasourceRequest);
+ if (result != null) {
+ CacheUtils.put(JdbcConstants.VIEW_CACHE_KEY, viewId, result, null, null);
+ }
+ }catch (Exception e) {
+ LogUtil.error(e);
+ throw e;
+ }finally {
+ lock.unlock();
}
- lock.unlock();
}else {//获取锁失败
Thread.sleep(100);//避免CAS自旋频率过大 占用cpu资源过高
result = cacheViewData(datasourceProvider, datasourceRequest, viewId);
diff --git a/backend/src/main/java/io/dataease/service/message/SysMsgService.java b/backend/src/main/java/io/dataease/service/message/SysMsgService.java
index 754dc6d6ab..6c9a4273c0 100644
--- a/backend/src/main/java/io/dataease/service/message/SysMsgService.java
+++ b/backend/src/main/java/io/dataease/service/message/SysMsgService.java
@@ -4,7 +4,9 @@ package io.dataease.service.message;
import io.dataease.base.domain.SysMsg;
import io.dataease.base.domain.SysMsgExample;
import io.dataease.base.mapper.SysMsgMapper;
+import io.dataease.base.mapper.ext.ExtSysMsgMapper;
import io.dataease.controller.message.dto.MsgRequest;
+import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@@ -16,12 +18,20 @@ public class SysMsgService {
@Resource
private SysMsgMapper sysMsgMapper;
+ @Resource
+ private ExtSysMsgMapper extSysMsgMapper;
+
public List query(Long userId, MsgRequest msgRequest) {
- String orderClause = "";
+ String orderClause = " create_time desc";
SysMsgExample example = new SysMsgExample();
SysMsgExample.Criteria criteria = example.createCriteria();
criteria.andUserIdEqualTo(userId);
+ List orders = msgRequest.getOrders();
+
+ if (CollectionUtils.isNotEmpty(orders)) {
+ orderClause = String.join(", ", orders);
+ }
if (ObjectUtils.isNotEmpty(msgRequest.getType())) {
criteria.andTypeEqualTo(msgRequest.getType());
@@ -29,11 +39,8 @@ public class SysMsgService {
if (ObjectUtils.isNotEmpty(msgRequest.getStatus())) {
criteria.andStatusEqualTo(msgRequest.getStatus());
- }else {
- orderClause += " status asc ,";
}
- orderClause += " create_time desc";
example.setOrderByClause(orderClause);
List sysMsgs = sysMsgMapper.selectByExample(example);
return sysMsgs;
@@ -43,18 +50,20 @@ public class SysMsgService {
SysMsg sysMsg = new SysMsg();
sysMsg.setMsgId(msgId);
sysMsg.setStatus(true);
+ sysMsg.setReadTime(System.currentTimeMillis());
sysMsgMapper.updateByPrimaryKeySelective(sysMsg);
}
- public void save(SysMsg sysMsg) {
-// sysMsg.setStatus(false);
-// sysMsg.setCreateTime(System.currentTimeMillis());
- sysMsgMapper.insert(sysMsg);
+ public void setBatchReaded(List msgIds) {
+ extSysMsgMapper.batchStatus(msgIds);
}
- public void update(SysMsg sysMsg) {
+ public void batchDelete(List msgIds) {
+ extSysMsgMapper.batchDelete(msgIds);
+ }
- sysMsgMapper.updateByPrimaryKey(sysMsg);
+ public void save(SysMsg sysMsg) {
+ sysMsgMapper.insert(sysMsg);
}
diff --git a/backend/src/main/resources/i18n/messages_en_US.properties b/backend/src/main/resources/i18n/messages_en_US.properties
index e0a4e80cf9..94eca1339f 100644
--- a/backend/src/main/resources/i18n/messages_en_US.properties
+++ b/backend/src/main/resources/i18n/messages_en_US.properties
@@ -261,4 +261,8 @@ i18n_sql_delete_not_matching=The data column of incremental delete SQL does not
i18n_cst_ds_tb_or_field_deleted=Custom dataset union data is deleted or field changed,can not display
i18n_no_all_delete_privilege_folder=This folder have sources which have no manage or view privilege,Can Not Be Deleted.
i18n_excel_field_repeat=Excel exists repeat field,please fix and upload again.
-i18n_schema_is_empty=Database schema is empty
\ No newline at end of file
+i18n_schema_is_empty=Database schema is empty
+站内消息=Internal Messages
+所有消息=All Messages
+未读消息=Unread Messages
+已读消息=Read Messages
\ No newline at end of file
diff --git a/backend/src/main/resources/i18n/messages_zh_CN.properties b/backend/src/main/resources/i18n/messages_zh_CN.properties
index 4ab1ba93ff..dcdbac9974 100644
--- a/backend/src/main/resources/i18n/messages_zh_CN.properties
+++ b/backend/src/main/resources/i18n/messages_zh_CN.properties
@@ -261,3 +261,7 @@ i18n_cst_ds_tb_or_field_deleted=自定义数据集所关联数据被删除或字
i18n_no_all_delete_privilege_folder=该目录下存在没有管理权限或查看权限的资源,无法删除
i18n_excel_field_repeat=Excel存在重复字段,请修改后重新上传
i18n_schema_is_empty=数据库 Schema 为空
+站内消息=站内消息
+所有消息=所有消息
+未读消息=未读消息
+已读消息=已读消息
diff --git a/backend/src/main/resources/i18n/messages_zh_TW.properties b/backend/src/main/resources/i18n/messages_zh_TW.properties
index a2653b9066..6ec405edc3 100644
--- a/backend/src/main/resources/i18n/messages_zh_TW.properties
+++ b/backend/src/main/resources/i18n/messages_zh_TW.properties
@@ -263,4 +263,8 @@ i18n_sql_delete_not_matching=增量刪除 sql 的數據列與數據集不匹配,
i18n_cst_ds_tb_or_field_deleted=自定義數據集所關聯數據被刪除或字段發生變化,無法正常顯示
i18n_no_all_delete_privilege_folder=該目錄下存在沒有管理權限或查看權限的資源,無法刪除
i18n_excel_field_repeat=Excel存在重復字段,請修改後重新上傳
-i18n_schema_is_empty=數據庫 Schema 為空
\ No newline at end of file
+i18n_schema_is_empty=數據庫 Schema 為空
+站内消息=站內消息
+所有消息=所有消息
+未读消息=未讀消息
+已读消息=已讀消息
\ No newline at end of file
diff --git a/frontend/src/api/system/msg.js b/frontend/src/api/system/msg.js
index 3b0ce0e055..0f4cc70dfe 100644
--- a/frontend/src/api/system/msg.js
+++ b/frontend/src/api/system/msg.js
@@ -17,3 +17,12 @@ export function updateStatus(msgId) {
})
}
+export function batchRead(data) {
+ return request({
+ url: '/api/sys_msg/batchRead',
+ method: 'post',
+ loading: true,
+ data
+ })
+}
+
diff --git a/frontend/src/components/Notification/index.vue b/frontend/src/components/Notification/index.vue
index e250c84c83..1d2a307a31 100644
--- a/frontend/src/components/Notification/index.vue
+++ b/frontend/src/components/Notification/index.vue
@@ -41,9 +41,9 @@
-