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 @@ -
+
- {{ $t('webmsg.show_more') }} + {{ $t('webmsg.show_more') }}
@@ -62,6 +62,8 @@