Browse Source

添加入住和叫醒的消息提醒功能

许智捷 2 years ago
parent
commit
2f0ef58518

+ 8 - 0
jeecg-boot-base-core/src/main/java/org/jeecg/common/api/dto/message/MessageDTO.java

@@ -23,6 +23,10 @@ public class MessageDTO implements Serializable {
      * 发送给(用户登录账户)
      */
     protected String toUser;
+    /**
+     * 发送给(租户id)
+     */
+    protected String tenantId;
 
     /**
      * 发送给所有人
@@ -43,6 +47,10 @@ public class MessageDTO implements Serializable {
      * 消息类型 1:消息  2:系统消息
      */
     protected String category;
+    /**
+     * 消息类型 1:消息  2:系统消息
+     */
+    protected String msgCategoryDetail;
 
     //-----------------------------------------------------------------------
     //update-begin---author:taoyan ---date:20220705  for:支持自定义推送类型,邮件、钉钉、企业微信、系统消息-----------

+ 14 - 0
jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java

@@ -147,6 +147,20 @@ public interface CommonConstant {
     String MSG_CATEGORY_1 = "1";
     String MSG_CATEGORY_2 = "2";
 
+    /**房间消息*/
+    String MSG_ROOM = "1";
+    /**门店消息*/
+    String MSG_STORE = "2";
+    /**资产消息*/
+    String MSG_ASSETS = "3";
+    /**订单消息*/
+    String MSG_ORDER = "4";
+    /**商城消息*/
+    String MSG_CLIQUE = "5";
+    /**集团*/
+    String MSG_ = "6";
+
+
     /**
      * 是否配置菜单的数据权限 1是0否
      */

+ 39 - 9
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/BusRoomBookingOrdersServiceImpl.java

@@ -1,7 +1,6 @@
 package org.jeecg.modules.business.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.date.DateTime;
 import cn.hutool.core.lang.Snowflake;
 import cn.hutool.core.util.BooleanUtil;
 import cn.hutool.core.util.ObjectUtil;
@@ -13,10 +12,12 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
-import org.checkerframework.checker.units.qual.C;
+import org.jeecg.common.api.dto.message.MessageDTO;
+import org.jeecg.common.constant.CommonConstant;
 import org.jeecg.common.exception.JeecgBootException;
 import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.common.util.DateUtils;
@@ -48,11 +49,12 @@ import org.jeecg.modules.rooms.Vo.LivingContinueVo;
 import org.jeecg.modules.rooms.Vo.LivingRealtimeVo;
 import org.jeecg.modules.rooms.entity.*;
 import org.jeecg.modules.rooms.service.*;
+import org.jeecg.modules.system.entity.SysUser;
+import org.jeecg.modules.system.service.ISysUserService;
+import org.jeecg.modules.system.service.impl.SysBaseApiImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
-
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
@@ -166,6 +168,12 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
     @Resource
     private IKcDepositoryInGoodsService depositoryInGoodsService;
 
+    @Resource
+    private ISysUserService sysUserService;
+
+    @Resource
+    private IBusHotelService busHotelService;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public String bookingOrderSave(BookingOrderSaveDto item, Boolean isTeam,Boolean isLiving,String hotelId) {
@@ -351,7 +359,6 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
                         addBusTeams(hotelId, bookingId);
                     }
                 }
-
             }
             //</editor-fold>
             roomsService.getReserveRoom();
@@ -1141,13 +1148,34 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
             feeService.save(dayOrderFee);
         }
 
+        /*添加消息通知*/
+        BusHotel busHotel = busHotelService.getById(room.getHotelId());
+        LambdaQueryWrapper<SysUser> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(SysUser::getDelFlag, 0);
+        lambdaQueryWrapper.eq(SysUser::getRelTenantIds, busHotel.getTenantId());
+        List<SysUser> sysUsers = sysUserService.list(lambdaQueryWrapper);
+        String userIds = "";
+        for (SysUser sysUser : sysUsers) {
+            userIds += sysUser.getUsername() + ",";
+        }
+        if (!userIds.isEmpty()) {
+            MessageDTO messageDTO = new MessageDTO();
+            messageDTO.setFromUser("");
+            messageDTO.setToUser(userIds);
+            messageDTO.setTenantId(busHotel.getTenantId());
+            messageDTO.setTitle(room.getPrefix() + room.getName() + "房间被入住-" + DateUtils.formatDate(new Date()));
+            messageDTO.setContent(room.getPrefix() + room.getName() + "房间被入住-" + DateUtils.formatDate(new Date()));
+            messageDTO.setCategory(CommonConstant.MSG_CATEGORY_1);
+            messageDTO.setMsgCategoryDetail(CommonConstant.MSG_ORDER);
+            sysBaseAPI.sendSysAnnouncement(messageDTO);
+        }
+
         CesAllDayPriceRule cesAllDayPriceRule =  allDayPriceRuleService.getOne(Wrappers.<CesAllDayPriceRule>lambdaQuery().eq(CesAllDayPriceRule::getHotelId,hotelId).eq(CesAllDayPriceRule::getInvalid,false));
         if(ObjectUtils.isEmpty(cesAllDayPriceRule)) {
             throw new JeecgBootException("未找到超时收费规则");
         }
         Calendar calendar = getRemindTime(livingOrder, cesAllDayPriceRule, livingRoomOrderInfo.getBookingType());
         SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
-        System.out.println(format.format(calendar.getTime()));
         redisTemplate.opsForZSet().add("overTimerOrder", livingOrder.getId(), calendar.getTimeInMillis());
         roomsService.getReserveRoom();
         //</editor-fold>
@@ -1173,7 +1201,8 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
         }
         return calendar;
     }
-
+    @Resource
+    private SysBaseApiImpl sysBaseAPI;
     @Override
     @Transactional(rollbackFor = Exception.class)
     public String customerLiving(BookingOrderSaveDto livingData, Boolean isTeam, String hotelId) {
@@ -1580,7 +1609,8 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
 
     public Boolean syncRoomOverTimeOrder(String hotelId) {
         // 查询出当前时间内需要处理的超时订单
-        Set<Object> set = redisTemplate.opsForZSet().rangeByScore("overTimerOrder", 0, Calendar.getInstance().getTimeInMillis());CesAllDayPriceRule cesAllDayPriceRule =  allDayPriceRuleService.getOne(Wrappers.<CesAllDayPriceRule>lambdaQuery().eq(CesAllDayPriceRule::getHotelId,hotelId).eq(CesAllDayPriceRule::getInvalid,false));
+        Set<Object> set = redisTemplate.opsForZSet().rangeByScore("overTimerOrder", 0, Calendar.getInstance().getTimeInMillis());
+        CesAllDayPriceRule cesAllDayPriceRule =  allDayPriceRuleService.getOne(Wrappers.<CesAllDayPriceRule>lambdaQuery().eq(CesAllDayPriceRule::getHotelId,hotelId).eq(CesAllDayPriceRule::getInvalid,false));
         if(CollUtil.isEmpty(set)){
             return true;
         }
@@ -2308,7 +2338,7 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
         depositoryInGoods.setNum(feeGood.getNum());
         depositoryInGoods.setFeeId(feeGood.getOrderFeeId());
         depositoryInGoods.setHotelId(feeGood.getHotelId());
-//        depositoryInGoods.setTenantId(user.getRelTenantIds());
+        depositoryInGoods.setTenantId(TokenUtils.getAuthUser().getRelTenantIds());
         depositoryInGoods.setCreateTime(new Date());
         return depositoryInGoods;
     }

+ 15 - 7
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/fw/controller/FwLivingJxController.java

@@ -38,6 +38,7 @@ import org.jeecgframework.poi.excel.entity.ImportParams;
 import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
 import org.jeecg.common.system.base.controller.JeecgController;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.multipart.MultipartHttpServletRequest;
@@ -61,12 +62,14 @@ import org.apache.shiro.authz.annotation.RequiresPermissions;
 public class FwLivingJxController extends JeecgController<FwLivingJx, IFwLivingJxService> {
 	@Autowired
 	private IFwLivingJxService fwLivingJxService;
-@Resource
-private IBusRoomsLivingOrderService busRoomsLivingOrderService;
-@Resource
-private IBusBookingRoomsService busBookingRoomsService;
-@Resource
-private CesRoomsServiceImpl cesRoomsService;
+	@Resource
+	private IBusRoomsLivingOrderService busRoomsLivingOrderService;
+	@Resource
+	private IBusBookingRoomsService busBookingRoomsService;
+	@Resource
+	private CesRoomsServiceImpl cesRoomsService;
+	 @Resource
+	 private RedisTemplate<String, Object> redisTemplate;
 
 	/**
 	 * 分页列表查询
@@ -115,6 +118,7 @@ private CesRoomsServiceImpl cesRoomsService;
 	@PostMapping(value = "/add")
 	public Result<String> add(@RequestBody FwLivingJx fwLivingJx) {
 		fwLivingJxService.save(fwLivingJx);
+		fwLivingJxService.addJxCache(fwLivingJx);
 		return Result.OK("添加成功!");
 	}
 
@@ -129,7 +133,11 @@ private CesRoomsServiceImpl cesRoomsService;
 	//@RequiresPermissions("fw:fw_living_jx:edit")
 	@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
 	public Result<String> edit(@RequestBody FwLivingJx fwLivingJx) {
-		fwLivingJxService.updateById(fwLivingJx);
+		boolean b = fwLivingJxService.updateById(fwLivingJx);
+		if (b){
+			redisTemplate.opsForZSet().remove("jxLiving", fwLivingJx.getId());
+			fwLivingJxService.addJxCache(fwLivingJx);
+		}
 		return Result.OK("编辑成功!");
 	}
 

+ 3 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/fw/service/IFwLivingJxService.java

@@ -11,4 +11,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface IFwLivingJxService extends IService<FwLivingJx> {
 
+    void addJxCache(FwLivingJx fwLivingJx);
+
+    void addJxMess(String hotel);
 }

+ 94 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/fw/service/impl/FwLivingJxServiceImpl.java

@@ -1,12 +1,38 @@
 package org.jeecg.modules.fw.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import net.sf.saxon.expr.instruct.ForEach;
+import org.jeecg.common.api.dto.message.MessageDTO;
+import org.jeecg.common.constant.CommonConstant;
+import org.jeecg.common.util.DateUtils;
+import org.jeecg.common.util.TokenUtils;
+import org.jeecg.modules.business.entity.BusHotel;
+import org.jeecg.modules.business.service.IBusHotelService;
 import org.jeecg.modules.fw.entity.FwLivingJx;
 import org.jeecg.modules.fw.mapper.FwLivingJxMapper;
 import org.jeecg.modules.fw.service.IFwLivingJxService;
+import org.jeecg.modules.rooms.entity.CesAllDayPriceRule;
+import org.jeecg.modules.rooms.entity.CesRooms;
+import org.jeecg.modules.rooms.service.CesRoomsServiceImpl;
+import org.jeecg.modules.system.entity.SysUser;
+import org.jeecg.modules.system.service.ISysUserService;
+import org.jeecg.modules.system.service.impl.SysBaseApiImpl;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 
+import javax.annotation.Resource;
+import java.io.Serializable;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Set;
+
 /**
  * @Description: fw_living_jx
  * @Author: jeecg-boot
@@ -16,4 +42,72 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 @Service
 public class FwLivingJxServiceImpl extends ServiceImpl<FwLivingJxMapper, FwLivingJx> implements IFwLivingJxService {
 
+    @Resource
+    private RedisTemplate<String, Object> redisTemplate;
+
+    @Resource
+    private CesRoomsServiceImpl cesRoomsService;
+    @Resource
+    private SysBaseApiImpl sysBaseAPI;
+    @Resource
+    private ISysUserService sysUserService;
+    @Resource
+    private IBusHotelService busHotelService;
+
+    @Override
+    public void addJxCache(FwLivingJx fwLivingJx) {
+        Calendar calendar = Calendar.getInstance();
+        Calendar jxTimeCalendar = Calendar.getInstance();
+        SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm");
+        try {
+            Date time = timeFormat.parse(fwLivingJx.getJxTime());
+            jxTimeCalendar.setTime(time);
+        } catch (ParseException ex) {
+            throw new RuntimeException(ex);
+        }
+        calendar.setTime(fwLivingJx.getJxDate());
+        calendar.set(Calendar.HOUR, jxTimeCalendar.get(Calendar.HOUR));
+        calendar.set(Calendar.MINUTE, jxTimeCalendar.get(Calendar.MINUTE)-2);
+        redisTemplate.opsForZSet().add("jxLiving", fwLivingJx.getId(), new Date().getTime());
+    }
+
+    @Override
+    public void addJxMess(String hotel) {
+        Set<Object> set = redisTemplate.opsForZSet().rangeByScore("jxLiving", 0, Calendar.getInstance().getTimeInMillis());
+        if (CollUtil.isEmpty(set)){
+            return;
+        }
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        set.forEach(e -> {
+            FwLivingJx livingJx = getById((Serializable) e);
+            if (livingJx == null){
+                return;
+            }
+            List<CesRooms> cesRooms = cesRoomsService.list(Wrappers.<CesRooms>lambdaQuery().eq(CesRooms::getLivingOrderId, livingJx.getLivingOrderId()));
+            if (!cesRooms.isEmpty()){
+                /*添加消息通知*/
+                BusHotel busHotel = busHotelService.getById(cesRooms.get(0).getHotelId());
+                LambdaQueryWrapper<SysUser> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+                lambdaQueryWrapper.eq(SysUser::getDelFlag, 0);
+                lambdaQueryWrapper.eq(SysUser::getRelTenantIds, busHotel.getTenantId());
+                List<SysUser> sysUsers = sysUserService.list(lambdaQueryWrapper);
+                String userIds = "";
+                for (SysUser sysUser : sysUsers) {
+                    userIds += sysUser.getUsername() + ",";
+                }
+                if (!userIds.isEmpty()) {
+                    MessageDTO messageDTO = new MessageDTO();
+                    messageDTO.setFromUser("");
+                    messageDTO.setToUser(userIds);
+                    messageDTO.setTenantId(busHotel.getTenantId());
+                    messageDTO.setTitle(cesRooms.get(0).getPrefix() + cesRooms.get(0).getName() + "房间需要被叫醒-" + format.format(livingJx.getJxDate()) + " " + livingJx.getJxTime());
+                    messageDTO.setContent(cesRooms.get(0).getPrefix() + cesRooms.get(0).getName() + "房间需要被叫醒-" + format.format(livingJx.getJxDate()) + " " + livingJx.getJxTime());
+                    messageDTO.setCategory(CommonConstant.MSG_CATEGORY_1);
+                    messageDTO.setMsgCategoryDetail(CommonConstant.MSG_ROOM);
+                    sysBaseAPI.sendSysAnnouncement(messageDTO);
+                }
+            }
+            redisTemplate.opsForZSet().remove("jxLiving", livingJx.getId());
+        });
+    }
 }

+ 6 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/quartz/job/LivingRoomOrderFeeJob.java

@@ -3,6 +3,9 @@ package org.jeecg.modules.quartz.job;
 
 import lombok.extern.slf4j.Slf4j;
 import org.jeecg.modules.business.service.IBusRoomBookingOrdersService;
+import org.jeecg.modules.fw.entity.FwLivingJx;
+import org.jeecg.modules.fw.service.IFwLivingJxService;
+import org.jeecg.modules.fw.service.impl.FwLivingJxServiceImpl;
 import org.quartz.Job;
 import org.quartz.JobExecutionContext;
 import org.quartz.JobExecutionException;
@@ -23,6 +26,8 @@ class LivingRoomOrderFeeJob implements Job {
     }
     @Resource
     private IBusRoomBookingOrdersService bookingOrdersService;
+    @Resource
+    private IFwLivingJxService fwLivingJxService;
 
     @Override
     public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
@@ -31,6 +36,7 @@ class LivingRoomOrderFeeJob implements Job {
         Thread thread = new Thread(runnable);
         thread.start();
 
+        fwLivingJxService.addJxMess(parameter);
 //        bookingOrdersService.syncDayRoomOrder(parameter);
     }
 }

+ 2 - 2
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysAnnouncementController.java

@@ -327,9 +327,9 @@ public class SysAnnouncementController {
 		LoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal();
 		String userId = sysUser.getId();
 		// 1.将系统消息补充到用户通告阅读标记表中
-		LambdaQueryWrapper<SysAnnouncement> querySaWrapper = new LambdaQueryWrapper<SysAnnouncement>();
+		LambdaQueryWrapper<SysAnnouncement> querySaWrapper = new LambdaQueryWrapper<>();
         //全部人员
-		querySaWrapper.eq(SysAnnouncement::getMsgType,CommonConstant.MSG_TYPE_ALL);
+		querySaWrapper.or(e -> e.eq(SysAnnouncement::getMsgType,CommonConstant.MSG_TYPE_ALL).eq(SysAnnouncement::getTenantId,sysUser.getRelTenantIds()));
         //未删除
 		querySaWrapper.eq(SysAnnouncement::getDelFlag,CommonConstant.DEL_FLAG_0.toString());
         //已发布

+ 12 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysAnnouncement.java

@@ -70,6 +70,12 @@ public class SysAnnouncement implements Serializable {
     @Dict(dicCode = "msg_category")
     private java.lang.String msgCategory;
     /**
+     * 消息类型1:通知公告2:系统消息
+     */
+    @Excel(name = "消息类型", width = 15, dicCode = "msg_category")
+    @Dict(dicCode = "msg_category")
+    private java.lang.String msgCategoryDetail;
+    /**
      * 通告对象类型(USER:指定用户,ALL:全体用户)
      */
     @Excel(name = "通告对象类型", width = 15, dicCode = "msg_type")
@@ -123,6 +129,12 @@ public class SysAnnouncement implements Serializable {
      * 指定用户
      **/
     private java.lang.String userIds;
+
+    /**
+     * 发送给(租户id)
+     */
+    protected String tenantId;
+
     /**
      * 业务类型(email:邮件 bpm:流程)
      */

+ 9 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysAnnouncementServiceImpl.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.shiro.SecurityUtils;
 import org.jeecg.common.constant.CommonConstant;
+import org.jeecg.common.constant.CommonSendStatus;
 import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.common.util.oConvertUtils;
 import org.jeecg.modules.system.entity.SysAnnouncement;
@@ -13,6 +14,7 @@ import org.jeecg.modules.system.entity.SysAnnouncementSend;
 import org.jeecg.modules.system.mapper.SysAnnouncementMapper;
 import org.jeecg.modules.system.mapper.SysAnnouncementSendMapper;
 import org.jeecg.modules.system.service.ISysAnnouncementService;
+import org.jeecg.modules.system.util.XssUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -41,6 +43,13 @@ public class SysAnnouncementServiceImpl extends ServiceImpl<SysAnnouncementMappe
 	@Transactional(rollbackFor = Exception.class)
 	@Override
 	public void saveAnnouncement(SysAnnouncement sysAnnouncement) {
+		// update-begin-author:liusq date:20210804 for:标题处理xss攻击的问题
+		String title = XssUtils.scriptXss(sysAnnouncement.getTitile());
+		sysAnnouncement.setTitile(title);
+		// update-end-author:liusq date:20210804 for:标题处理xss攻击的问题
+		sysAnnouncement.setDelFlag(CommonConstant.DEL_FLAG_0.toString());
+		//未发布
+		sysAnnouncement.setSendStatus(CommonSendStatus.UNPUBLISHED_STATUS_0);
 		if(sysAnnouncement.getMsgType().equals(CommonConstant.MSG_TYPE_ALL)) {
 			sysAnnouncementMapper.insert(sysAnnouncement);
 		}else {

+ 6 - 2
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java

@@ -327,9 +327,10 @@ public class SysBaseApiImpl implements ISysBaseAPI {
 	public void sendSysAnnouncement(MessageDTO message) {
 		this.sendSysAnnouncement(message.getFromUser(),
 				message.getToUser(),
+				message.getTenantId(),
 				message.getTitle(),
 				message.getContent(),
-				message.getCategory());
+				message.getCategory(),message.getMsgCategoryDetail());
 		try {
 			// 同步发送第三方APP消息
 			wechatEnterpriseService.sendMessage(message, true);
@@ -963,16 +964,19 @@ public class SysBaseApiImpl implements ISysBaseAPI {
 	 * @param msgContent
 	 * @param setMsgCategory
 	 */
-	private void sendSysAnnouncement(String fromUser, String toUser, String title, String msgContent, String setMsgCategory) {
+	public void sendSysAnnouncement(String fromUser, String toUser,String tenantId, String title, String msgContent, String setMsgCategory,String msgCategoryDetail) {
 		SysAnnouncement announcement = new SysAnnouncement();
 		announcement.setTitile(title);
 		announcement.setMsgContent(msgContent);
 		announcement.setSender(fromUser);
+		announcement.setTenantId(tenantId);
 		announcement.setPriority(CommonConstant.PRIORITY_M);
 		announcement.setMsgType(CommonConstant.MSG_TYPE_UESR);
 		announcement.setSendStatus(CommonConstant.HAS_SEND);
+		announcement.setEndTime(new Date());
 		announcement.setSendTime(new Date());
 		announcement.setMsgCategory(setMsgCategory);
+		announcement.setMsgCategoryDetail(msgCategoryDetail);
 		announcement.setDelFlag(String.valueOf(CommonConstant.DEL_FLAG_0));
 		sysAnnouncementMapper.insert(announcement);
 		// 2.插入用户通告阅读标记表记录