package com.artfess.bpm.util;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.artfess.base.jms.JmsActor;
import com.artfess.base.jms.JmsProducer;
import com.artfess.base.jms.Notice;
import com.artfess.base.jms.NoticeMessageType;
import com.artfess.base.util.AppUtil;
import com.artfess.base.util.BeanUtils;
import com.artfess.base.util.StringUtil;
import com.artfess.bpm.api.constant.TemplateConstants;
import com.artfess.bpm.api.event.NodeNotifyModel;
import com.artfess.bpm.api.event.NotifyTaskModel;
import com.artfess.bpm.api.service.BpmDefinitionAccessor;
import com.artfess.bpm.persistence.manager.BpmProcessInstanceManager;
import com.artfess.bpm.persistence.model.DefaultBpmTask;
import com.artfess.uc.api.impl.util.ContextUtil;
import com.artfess.uc.api.model.IUser;
import freemarker.template.TemplateException;
public class MessageUtil {
/**
* 获取通知支持的消息类型
*
* 按照key,label的方式返回,例如:{"inner":"内部消息","mail":"邮件"}
*
* @return 通知消息类型
*/
public static Map getHandlerTypes(){
Map map = new HashMap<>();
EnumSet it = EnumSet.allOf(NoticeMessageType.class);
for (NoticeMessageType type : it) {
map.put(type.key(), type.label());
}
return map;
}
/**
* 判断通知类型是否支持html。
* @param notifyType 通知类型为字符串。
* @return
*/
public static boolean isSupportHtml(String notifyType){
EnumSet it = EnumSet.allOf(NoticeMessageType.class);
for (NoticeMessageType type : it) {
if(type.key().equals(notifyType)) {
return !type.isPlain();
}
}
return false;
}
/**
* 解析通知消息类型为枚举数组
* @param nofifyTypes 通知消息类型key集合
* @return 通知消息类型枚举数组
*/
public static NoticeMessageType[] parseNotifyType(List nofifyTypes) {
List messageTypeArrays = new ArrayList<>();
EnumSet it = EnumSet.allOf(NoticeMessageType.class);
for (NoticeMessageType type : it) {
if(nofifyTypes.indexOf(type.key()) > -1) {
messageTypeArrays.add(type);
}
}
NoticeMessageType[] messageTypes = new NoticeMessageType[messageTypeArrays.size()];
messageTypeArrays.toArray(messageTypes);
return messageTypes;
}
/**
* 解析通知消息类型为枚举数组
* @param notifyType 通知消息类型(多个类型之间用逗号分隔)
* @return 通知消息类型枚举数组
*/
public static NoticeMessageType[] parseNotifyType(String notifyType) {
if(notifyType==null) {
notifyType= "";
}
String[] arys = notifyType.split(",");
List list = new ArrayList(Arrays.asList(arys));
return parseNotifyType(list);
}
/**
* 解析账号数组
*
* 将用户集合中各用户的账号取出来构建为一个字符串数组
*
* @param users 用户集合
* @return 账号数组
*/
public static String[] parseAccountOfUser(List users) {
List receiverAccounts = new ArrayList<>();
for(IUser receiver : users) {
if(StringUtil.isEmpty(receiver.getAccount())&&StringUtil.isNotEmpty(receiver.getUserId())){
receiverAccounts.add(receiver.getUserId());
}else{
receiverAccounts.add(receiver.getAccount());
}
}
String[] receivers = new String[receiverAccounts.size()];
receiverAccounts.toArray(receivers);
return receivers;
}
/**
* 发送通知
* @param bpmTask
* @param opinion
* @param receiver
* @param notifyType
* @param typeKey
* void
*/
public static void notify(DefaultBpmTask bpmTask,String opinion,IUser receiver,String notifyType,String typeKey) throws Exception {
if (BeanUtils.isNotEmpty(bpmTask) && StringUtil.isEmpty(notifyType)) {
notifyType = BpmUtil.getNotifyType(bpmTask);
}
NotifyTaskModel model=new NotifyTaskModel();
String baseUrl=PortalDataUtil.getPropertyByAlias(TemplateConstants.TEMP_VAR.BASE_URL);
model.addVars(TemplateConstants.TEMP_VAR.BASE_URL, baseUrl)
.addVars(TemplateConstants.TEMP_VAR.TASK_SUBJECT, bpmTask.getSubject())
.addVars(TemplateConstants.TEMP_VAR.INST_SUBJECT, bpmTask.getSubject())
.addVars(TemplateConstants.TEMP_VAR.TASK_ID, bpmTask.getId())
.addVars(TemplateConstants.TEMP_VAR.NODE_NAME, bpmTask.getName())
.addVars(TemplateConstants.TEMP_VAR.CAUSE, opinion)
.addVars(TemplateConstants.TEMP_VAR.NODE_NAME, bpmTask.getName())
.addVars(TemplateConstants.TEMP_VAR.RECEIVERID,receiver.getUserId())
.addVars(TemplateConstants.TEMP_VAR.RECEIVER,receiver.getFullname());
List identitys = new ArrayList();
identitys.add(receiver);
model.setIdentitys(identitys);
MessageUtil.send(model, notifyType, typeKey);
}
/**
* 发送通知消息。
* @param model
* @param notifyType
* @param typeKey
* void
*/
public static void send(NotifyTaskModel model,String notifyType,String typeKey) throws Exception{
List userList= model.getIdentitys();
sendMsg(typeKey,notifyType,userList,model.getVars());
}
public static void sendMsg(NodeNotifyModel model,String notifyType,String typeKey) throws Exception{
NoticeMessageType[] messageTypes = parseNotifyType(notifyType);
List recieverAccounts = model.getJmsActors();
IUser sender = ContextUtil.getCurrentUser();
Map vars = model.getVars();
vars.put(TemplateConstants.TEMP_VAR.SENDER, BeanUtils.isNotEmpty(sender)?sender.getFullname():"系统执行人");
vars.put(TemplateConstants.TEMP_VAR.SENDERID, BeanUtils.isNotEmpty(sender)?sender.getUserId():"-1");
if(recieverAccounts.size() == 1) vars.put(TemplateConstants.TEMP_VAR.RECEIVER,recieverAccounts.get(0).getAccount());
Notice notice = new Notice();
// 设置为使用模板
notice.setSubject(model.getSubject());
notice.setContent(model.getContent());
notice.setUseTemplate(false);
notice.setMessageTypes(messageTypes);
notice.setSender(sender.getAccount());
notice.setTemplateType(typeKey);
notice.setVars(vars);
notice.setReceiver(recieverAccounts);
JmsProducer jmsProducer = AppUtil.getBean(JmsProducer.class);
jmsProducer.sendToQueue(notice);
}
/**
* 发送通知消息
* @param typeKey 模版类型
* @param notifyType 通知类型
* @param recievers 接收人
* @param vars 变量
* @throws TemplateException
* @throws IOException
*/
public static void sendMsg(String typeKey,String notifyType, List recievers,Map vars) throws Exception{
NoticeMessageType[] messageTypes = parseNotifyType(notifyType);
List recieverAccounts = parseJmsActor(recievers);
IUser sender = ContextUtil.getCurrentUser();
vars.put(TemplateConstants.TEMP_VAR.SENDER, BeanUtils.isNotEmpty(sender)?sender.getFullname():"系统执行人");
vars.put(TemplateConstants.TEMP_VAR.SENDERID, BeanUtils.isNotEmpty(sender)?sender.getUserId():"-1");
if(recievers.size() == 1) vars.put(TemplateConstants.TEMP_VAR.RECEIVER,recievers.get(0).getFullname());
Notice notice = new Notice();
// 设置为使用模板
notice.setUseTemplate(true);
notice.setMessageTypes(messageTypes);
notice.setSender(sender.getAccount());
notice.setTemplateType(typeKey);
notice.setVars(vars);
notice.setReceiver(recieverAccounts);
JmsProducer jmsProducer = AppUtil.getBean(JmsProducer.class);
jmsProducer.sendToQueue(notice);
}
/**
* IUser 转换为 JmsActor
* @param users
* @return
*/
public static List parseJmsActor(List users){
List actors = new ArrayList<>();
for (IUser user:users){
JmsActor actor = new JmsActor();
actor.setId(user.getUserId());
actor.setAccount(user.getAccount());
actor.setEmail(user.getEmail());
actor.setMobile(user.getMobile());
actor.setWeixin(user.getWeixin());
actor.setClientId(user.getClientId());
actor.setClientToken(user.getClientToken());
actors.add(actor);
}
return actors;
}
/**
* 发送通知消息
* @param typeKey 模版类型
* @param notifyType 通知类型
* @param recievers 接收人
* @param vars 变量
* @throws TemplateException
* @throws IOException
*/
public static void sendMsgnew(String notifyType, List recievers,String subject,String content) throws Exception{
NoticeMessageType[] messageTypes = parseNotifyType(notifyType);
List recieverAccounts = parseJmsActor(recievers);
IUser sender = ContextUtil.getCurrentUser();
Notice notice = new Notice();
// 设置为使用模板
notice.setUseTemplate(true);
notice.setSubject(subject);
notice.setContent(content);
notice.setMessageTypes(messageTypes);
notice.setSender(sender.getAccount());
notice.setReceiver(recieverAccounts);
JmsProducer jmsProducer = AppUtil.getBean(JmsProducer.class);
jmsProducer.sendToQueue(notice);
}
}