diff --git a/modules/core/src/main/java/com/jeesite/modules/msg/service/MsgInnerService.java b/modules/core/src/main/java/com/jeesite/modules/msg/service/MsgInnerService.java index dce8a761..9ae8c03e 100644 --- a/modules/core/src/main/java/com/jeesite/modules/msg/service/MsgInnerService.java +++ b/modules/core/src/main/java/com/jeesite/modules/msg/service/MsgInnerService.java @@ -4,49 +4,20 @@ */ package com.jeesite.modules.msg.service; -import com.jeesite.common.collect.ListUtils; -import com.jeesite.common.config.Global; import com.jeesite.common.entity.Page; -import com.jeesite.common.lang.StringUtils; -import com.jeesite.common.service.CrudService; -import com.jeesite.common.web.http.ServletUtils; -import com.jeesite.modules.file.utils.FileUploadUtils; -import com.jeesite.modules.msg.dao.MsgInnerDao; -import com.jeesite.modules.msg.dao.MsgInnerRecordDao; +import com.jeesite.common.service.api.CrudServiceApi; import com.jeesite.modules.msg.entity.MsgInner; import com.jeesite.modules.msg.entity.MsgInnerRecord; -import com.jeesite.modules.msg.entity.MsgPush; -import com.jeesite.modules.msg.entity.content.*; -import com.jeesite.modules.msg.utils.MsgPushUtils; -import com.jeesite.modules.sys.entity.EmpUser; -import com.jeesite.modules.sys.entity.User; -import com.jeesite.modules.sys.service.EmpUserService; -import io.netty.util.concurrent.DefaultThreadFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; -import java.util.Date; import java.util.List; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; /** * 内部消息Service * @author ThinkGem * @version 2019-03-12 */ -public class MsgInnerService extends CrudService { - - @Autowired - private EmpUserService empUserService; - @Autowired - private MsgInnerRecordDao msgInnerRecordDao; - - private static ExecutorService msgPushThreadPool = new ThreadPoolExecutor(5, 20, - 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), - new DefaultThreadFactory("cms-update-expired-weight")); +public interface MsgInnerService extends CrudServiceApi { /** * 获取单条数据 @@ -54,9 +25,7 @@ public class MsgInnerService extends CrudService { * @return */ @Override - public MsgInner get(MsgInner msgInner) { - return super.get(msgInner); - } + MsgInner get(MsgInner msgInner); /** * 查询分页数据 @@ -64,16 +33,12 @@ public class MsgInnerService extends CrudService { * @return */ @Override - public Page findPage(MsgInner msgInner) { - return super.findPage(msgInner); - } + Page findPage(MsgInner msgInner); /** * 查询消息记录数据 */ - public List findRecordList(MsgInnerRecord msgInnerRecord){ - return msgInnerRecordDao.findList(msgInnerRecord); - } + List findRecordList(MsgInnerRecord msgInnerRecord); /** * 保存数据(插入或更新) @@ -81,139 +46,13 @@ public class MsgInnerService extends CrudService { */ @Override @Transactional - public void save(MsgInner msgInner) { - if (msgInner.getIsNewRecord()){ - User user = msgInner.currentUser(); - msgInner.setSendUserCode(user.getUserCode()); - msgInner.setSendUserName(user.getUserName()); - // 没有设置状态,则默认新增后是草稿状态 - if (StringUtils.isBlank(msgInner.getStatus())){ - msgInner.setStatus(MsgInner.STATUS_DRAFT); - } - } - msgInner.setSendDate(new Date()); - msgInner.setIsAttac(msgInner.getDataMap() != null && StringUtils.isNotBlank((String)msgInner.getDataMap().get("msgInner_file")) - || StringUtils.isNotBlank(ServletUtils.getParameter("msgInner_file")) ? Global.YES : Global.NO); - super.save(msgInner); - // 保存上传附件 - FileUploadUtils.saveFileUpload(msgInner, msgInner.getId(), "msgInner_file"); - // 发送内部消息 - if (MsgInner.STATUS_NORMAL.equals(msgInner.getStatus())){ - this.updateStatus(msgInner); // 更新状态 - List empUserList = null; - if (MsgInner.RECEIVE_TYPE_ALL.equals(msgInner.getReceiveType())){ - EmpUser empUser = new EmpUser(); - empUser.setCodes(new String[]{}); - empUserList = empUserService.findUserList(empUser); - }else{ - String[] codes = StringUtils.splitComma(msgInner.getReceiveCodes()); - String[] names = StringUtils.splitComma(msgInner.getReceiveNames()); - if (codes != null && names != null && codes.length > 0 && codes.length == names.length){ - EmpUser empUser = new EmpUser(); - empUser.setCodes(codes); - switch(msgInner.getReceiveType()){ - case MsgInner.RECEIVE_TYPE_USER: - empUserList = ListUtils.newArrayList(); - for (int i=0; i empUserList){ - if (empUserList == null || empUserList.size() <= 0){ - return; - } - String[] notifyTypes = StringUtils.splitComma(msgInner.getNotifyTypes()); - List recordList = ListUtils.newArrayList(); - empUserList.forEach(user -> { - MsgInnerRecord r = new MsgInnerRecord(); - r.setMsgInnerId(msgInner.getId()); - r.setReceiveUserCode(user.getUserCode()); - r.setReceiveUserName(user.getUserName()); - r.setReadStatus(MsgInnerRecord.READ_STATUS_UNREAD); - recordList.add(r); - // 发送消息通知(消息推送) - if (notifyTypes != null){ - for (String type : notifyTypes){ - BaseMsgContent msgContent = null; - if (MsgPush.TYPE_PC.equals(type)){ - msgContent = new PcMsgContent(); - msgContent.setContent(text("你有一条内部消息,点击“详情”进行查阅。")); - ((PcMsgContent)msgContent).addButton(new String[]{text("详情"), - Global.getAdminPath()+"/msg/msgInner/view?id="+msgInner.getId()}); - }else if (MsgPush.TYPE_APP.equals(type)){ - msgContent = new AppMsgContent(); - }else if (MsgPush.TYPE_SMS.equals(type)){ - msgContent = new SmsMsgContent(); - }else if (MsgPush.TYPE_EMAIL.equals(type)){ - msgContent = new EmailMsgContent(); - } - if (msgContent != null){ - msgContent.setTitle(msgInner.getMsgTitle()); - if (msgContent.getContent() == null){ - msgContent.setContent(text("你有一条内部消息请查阅:") - + StringUtils.abbr(msgInner.getMsgTitle(), 30)); - } - msgContent.setMsgPush(new MsgPush()); - msgContent.getMsgPush().setIsRealtimePush(false); // 关闭实时推送,改为手动推送 - MsgPushUtils.push(msgContent, msgInner.getId(), - MsgInner.class.getSimpleName(), user.getUserCode()); - } - } - } - }); - msgInnerRecordDao.insertBatch(recordList, null); - // 手动触发消息推送任务 - if (Global.TRUE.equals(Global.getProperty("msg.realtime.enabled"))){ - msgPushThreadPool.submit(new Runnable() { - @Override - public void run() { - try{ - MsgPushUtils.getMsgPushTask().execute(); - }catch(Exception ex){ - logger.error("实时消息发送失败,推送服务配置不正确。", ex); - } - } - }); - } - } + void save(MsgInner msgInner); /** * 根据消息编号和接受者用户名读取内部消息 */ @Transactional - public void readMsgInnerRecord(MsgInner msgInner){ - MsgInnerRecord msgInnerRecord = new MsgInnerRecord(); - msgInnerRecord.setMsgInnerId(msgInner.getId()); - msgInnerRecord.setReceiveUserCode(msgInner.currentUser().getUserCode()); - msgInnerRecord.setReadStatus(MsgInnerRecord.READ_STATUS_READ); - msgInnerRecord.setReadDate(new Date()); - msgInnerRecordDao.updateReadStatus(msgInnerRecord); - // 将关联的内部消息通知更新为已读(消息推送) - MsgPushUtils.readMsgByBiz(msgInner.getId(), MsgInner.class.getSimpleName(), - msgInnerRecord.getReceiveUserCode()); - } + void readMsgInnerRecord(MsgInner msgInner); /** * 更新状态 @@ -221,9 +60,7 @@ public class MsgInnerService extends CrudService { */ @Override @Transactional - public void updateStatus(MsgInner msgInner) { - super.updateStatus(msgInner); - } + void updateStatus(MsgInner msgInner); /** * 删除数据 @@ -231,8 +68,6 @@ public class MsgInnerService extends CrudService { */ @Override @Transactional - public void delete(MsgInner msgInner) { - super.delete(msgInner); - } + void delete(MsgInner msgInner); } \ No newline at end of file diff --git a/modules/core/src/main/java/com/jeesite/modules/msg/service/support/MsgInnerServiceSupport.java b/modules/core/src/main/java/com/jeesite/modules/msg/service/support/MsgInnerServiceSupport.java new file mode 100644 index 00000000..672ea3f8 --- /dev/null +++ b/modules/core/src/main/java/com/jeesite/modules/msg/service/support/MsgInnerServiceSupport.java @@ -0,0 +1,240 @@ +/** + * Copyright (c) 2013-Now http://jeesite.com All rights reserved. + * No deletion without permission, or be held responsible to law. + */ +package com.jeesite.modules.msg.service.support; + +import com.jeesite.common.collect.ListUtils; +import com.jeesite.common.config.Global; +import com.jeesite.common.entity.Page; +import com.jeesite.common.lang.StringUtils; +import com.jeesite.common.service.CrudService; +import com.jeesite.common.web.http.ServletUtils; +import com.jeesite.modules.file.utils.FileUploadUtils; +import com.jeesite.modules.msg.dao.MsgInnerDao; +import com.jeesite.modules.msg.dao.MsgInnerRecordDao; +import com.jeesite.modules.msg.entity.MsgInner; +import com.jeesite.modules.msg.entity.MsgInnerRecord; +import com.jeesite.modules.msg.entity.MsgPush; +import com.jeesite.modules.msg.entity.content.*; +import com.jeesite.modules.msg.service.MsgInnerService; +import com.jeesite.modules.msg.utils.MsgPushUtils; +import com.jeesite.modules.sys.entity.EmpUser; +import com.jeesite.modules.sys.entity.User; +import com.jeesite.modules.sys.service.EmpUserService; +import io.netty.util.concurrent.DefaultThreadFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; +import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 内部消息Service + * @author ThinkGem + * @version 2019-03-12 + */ +public class MsgInnerServiceSupport extends CrudService + implements MsgInnerService { + + @Autowired + private EmpUserService empUserService; + @Autowired + private MsgInnerRecordDao msgInnerRecordDao; + + private static ExecutorService msgPushThreadPool = new ThreadPoolExecutor(5, 20, + 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), + new DefaultThreadFactory("cms-update-expired-weight")); + + /** + * 获取单条数据 + * @param msgInner + * @return + */ + @Override + public MsgInner get(MsgInner msgInner) { + return super.get(msgInner); + } + + /** + * 查询分页数据 + * @param msgInner 查询条件; page 分页对象 + * @return + */ + @Override + public Page findPage(MsgInner msgInner) { + return super.findPage(msgInner); + } + + /** + * 查询消息记录数据 + */ + public List findRecordList(MsgInnerRecord msgInnerRecord){ + return msgInnerRecordDao.findList(msgInnerRecord); + } + + /** + * 保存数据(插入或更新) + * @param msgInner + */ + @Override + @Transactional + public void save(MsgInner msgInner) { + if (msgInner.getIsNewRecord()){ + User user = msgInner.currentUser(); + msgInner.setSendUserCode(user.getUserCode()); + msgInner.setSendUserName(user.getUserName()); + // 没有设置状态,则默认新增后是草稿状态 + if (StringUtils.isBlank(msgInner.getStatus())){ + msgInner.setStatus(MsgInner.STATUS_DRAFT); + } + } + msgInner.setSendDate(new Date()); + msgInner.setIsAttac(msgInner.getDataMap() != null && StringUtils.isNotBlank((String)msgInner.getDataMap().get("msgInner_file")) + || StringUtils.isNotBlank(ServletUtils.getParameter("msgInner_file")) ? Global.YES : Global.NO); + super.save(msgInner); + // 保存上传附件 + FileUploadUtils.saveFileUpload(msgInner, msgInner.getId(), "msgInner_file"); + // 发送内部消息 + if (MsgInner.STATUS_NORMAL.equals(msgInner.getStatus())){ + this.updateStatus(msgInner); // 更新状态 + List empUserList = null; + if (MsgInner.RECEIVE_TYPE_ALL.equals(msgInner.getReceiveType())){ + EmpUser empUser = new EmpUser(); + empUser.setCodes(new String[]{}); + empUserList = empUserService.findUserList(empUser); + }else{ + String[] codes = StringUtils.splitComma(msgInner.getReceiveCodes()); + String[] names = StringUtils.splitComma(msgInner.getReceiveNames()); + if (codes != null && names != null && codes.length > 0 && codes.length == names.length){ + EmpUser empUser = new EmpUser(); + empUser.setCodes(codes); + switch(msgInner.getReceiveType()){ + case MsgInner.RECEIVE_TYPE_USER: + empUserList = ListUtils.newArrayList(); + for (int i=0; i empUserList){ + if (empUserList == null || empUserList.size() <= 0){ + return; + } + String[] notifyTypes = StringUtils.splitComma(msgInner.getNotifyTypes()); + List recordList = ListUtils.newArrayList(); + empUserList.forEach(user -> { + MsgInnerRecord r = new MsgInnerRecord(); + r.setMsgInnerId(msgInner.getId()); + r.setReceiveUserCode(user.getUserCode()); + r.setReceiveUserName(user.getUserName()); + r.setReadStatus(MsgInnerRecord.READ_STATUS_UNREAD); + recordList.add(r); + // 发送消息通知(消息推送) + if (notifyTypes != null){ + for (String type : notifyTypes){ + BaseMsgContent msgContent = null; + if (MsgPush.TYPE_PC.equals(type)){ + msgContent = new PcMsgContent(); + msgContent.setContent(text("你有一条内部消息,点击“详情”进行查阅。")); + ((PcMsgContent)msgContent).addButton(new String[]{text("详情"), + Global.getAdminPath()+"/msg/msgInner/view?id="+msgInner.getId()}); + }else if (MsgPush.TYPE_APP.equals(type)){ + msgContent = new AppMsgContent(); + }else if (MsgPush.TYPE_SMS.equals(type)){ + msgContent = new SmsMsgContent(); + }else if (MsgPush.TYPE_EMAIL.equals(type)){ + msgContent = new EmailMsgContent(); + } + if (msgContent != null){ + msgContent.setTitle(msgInner.getMsgTitle()); + if (msgContent.getContent() == null){ + msgContent.setContent(text("你有一条内部消息请查阅:") + + StringUtils.abbr(msgInner.getMsgTitle(), 30)); + } + msgContent.setMsgPush(new MsgPush()); + msgContent.getMsgPush().setIsRealtimePush(false); // 关闭实时推送,改为手动推送 + MsgPushUtils.push(msgContent, msgInner.getId(), + MsgInner.class.getSimpleName(), user.getUserCode()); + } + } + } + }); + msgInnerRecordDao.insertBatch(recordList, null); + // 手动触发消息推送任务 + if (Global.TRUE.equals(Global.getProperty("msg.realtime.enabled"))){ + msgPushThreadPool.submit(new Runnable() { + @Override + public void run() { + try{ + MsgPushUtils.getMsgPushTask().execute(); + }catch(Exception ex){ + logger.error("实时消息发送失败,推送服务配置不正确。", ex); + } + } + }); + } + } + + /** + * 根据消息编号和接受者用户名读取内部消息 + */ + @Transactional + public void readMsgInnerRecord(MsgInner msgInner){ + MsgInnerRecord msgInnerRecord = new MsgInnerRecord(); + msgInnerRecord.setMsgInnerId(msgInner.getId()); + msgInnerRecord.setReceiveUserCode(msgInner.currentUser().getUserCode()); + msgInnerRecord.setReadStatus(MsgInnerRecord.READ_STATUS_READ); + msgInnerRecord.setReadDate(new Date()); + msgInnerRecordDao.updateReadStatus(msgInnerRecord); + // 将关联的内部消息通知更新为已读(消息推送) + MsgPushUtils.readMsgByBiz(msgInner.getId(), MsgInner.class.getSimpleName(), + msgInnerRecord.getReceiveUserCode()); + } + + /** + * 更新状态 + * @param msgInner + */ + @Override + @Transactional + public void updateStatus(MsgInner msgInner) { + super.updateStatus(msgInner); + } + + /** + * 删除数据 + * @param msgInner + */ + @Override + @Transactional + public void delete(MsgInner msgInner) { + super.delete(msgInner); + } + +} \ No newline at end of file