NCC业务和通知消息配置

NCC业务和通知消息配置

业务和通知类消息

以任务分配为例

1、注册消息类型

  • 打开“动态建模平台->开发配置->消息管理->消息模板类型注册”,在业务消息的企业报表模块下新建一个消息模板分类
    在这里插入图片描述
  • 这里预置了两个业务函数字段,这里的字段是靠系统预置和元数据字段无法满足消息内容配置的时候,需要通过新增的这个自定义变量去实现。如果没有需求的话可不预置

2、注册消息模板

  • 新建好了之后在“动态建模平台->客户化配置->同一沟通平台->消息模板-全局”中就能看到上一步建好的分类,然后在对应分类下新建一个消息模板
    在这里插入图片描述
  • 可以看到右侧有三个页签,系统变量是平台预置好的,不需要关心,元数据和业务函数是我们预置的,具体实现参考第5步

3、注册业务消息配置信息

  • 设置好模板之后,打开“动态建模平台->客户化配置->同一沟通平台->业务消息配置”节点
    在这里插入图片描述
  • 左树是不能新增的,这里需要我们自己去写SQL插入,我这里的插入SQL如下:
insert into pub_msgres_reg (CODE, CREATIONTIME, CREATOR, DR, FOLDERNAME, INNERCODE, METAID, MODIFIEDTIME, MODIFIER, MODULEID, MSGTEMPTYPE_CODE, NAME, PK_BILLTYPECODE, PK_MSGRES_REG, RESID, TS) values ('ufoe_taskassign', null, '~', 0, '', null, '766e7c90-2de7-415a-8d3f-4c690721aa2f', null, '~', '1820', 'TASKASSIGN', '任务分配', 'UFOE', '1001ZE10000000000001', '', '2020-11-14 17:25:24');
  • 其中“MSGTEMPTYPE_CODE”字段是第1步里面新建的那个分类的编码,我这里是“TASKASSIGN”
    在这里插入图片描述
  • 数据插入之后就可以在“业务消息配置”左边树里看到数据了
  • 然后配置好消息模板和消息接收人,然后就可以开始编写代码了
    在这里插入图片描述

4、代码实现

注:代码可参考nccloud.ufoepub.msg.utils.UfoeBuziMsgUtils类

/**
 * 发送NCC消息-任务分配
 * 
 * @param taskAssignVO
 * @param sender        消息发送人
 * @param pk_group      集团主键
 * @return
 * @throws BusinessException
 */
public static void sendNCCMessage(TaskAssignVO taskAssignVO, String sender, String pk_group) throws BusinessException {
	UfoeBuziMsgDTO dto = new UfoeBuziMsgDTO();
	// 构造消息体
	dto.setSender(sender);
	// 消息发送时间取当前时间
	dto.setSendtime(new UFDateTime());
	// 发送通知消息
	dto.setMsgsourcetype(UfoeMsgConsts.MSG_TYPE_NOTICE);
	dto.setPk_group(pk_group);
	dto.setPk_org(taskAssignVO.getPk_receiveorg());
	//设置跳转单据传递的参数
	dto.setParam("pk_org=" + taskAssignVO.getPk_receiveorg());
	// 设置应用编码,用于跳转
	dto.setAppcode(UfoeMsgConsts.APPCODE_RECEIVETASK);
	// 设置消息类型
	dto.setMsgType(UfoeMsgConsts.MSG_TYPE_NOTICE);
	//设置单据主键(用于消息状态设置时定位该消息)
	dto.setBillid(taskAssignVO.getPk_taskassign());

	// 构造消息配置信息
	dto.setMsgrescode(UfoeMsgConsts.MSG_CONFIG_TASKASSIGN);
	// 设置接收的组织
	dto.setPkorgs(new String[] { taskAssignVO.getPk_receiveorg() });
	// 给元数据字段赋值
	dto.setBillVO(taskAssignVO);
	// 给业务函数字段赋值
	dto.setCalculater(new TaskAssignBusiVarCalculater(taskAssignVO));
	UfoeBuziMsgUtils.sendBuziMsgReturnReceiver(dto);
}

其中有一个params字段,可以设置用户自定义的参数,用于页面跳转时的传参。以“key=value”的形式传递,多个参数之间用“&”隔开。不过要注意的是,如果发送的是业务消息,需要在前面加一个“?”

5、业务函数字段的设置

  • 业务函数是消息配置时,系统预置字段和元数据字段无法满足消息模板配置的需求时,需要预置额外的字段去实现
  • 业务函数字段需要实现nc.message.templet.bs.IMsgVarCalculater接口或者继承平台的nc.message.templet.bs.AbstractBusiVarCalculater类,里面对业务函数字段值进行解析并赋值,详情请参考: nccloud.ufoepub.msg.calculater.TaskAssignBusiVarCalculater
/**
 * 翻译任务分配中的业务函数字段
 * @author youjw11
 *
 */
public class TaskAssignBusiVarCalculater extends AbstractBusiVarCalculater {

	//个性化规则
	private static final String PERSONALRULE = "personalRule";
	//任务所属节点类型
	private static final String TASKNODETYPE = "taskNodeType";
	
	Map<String, String> varMap = new HashMap<String, String>();

	public TaskAssignBusiVarCalculater(TaskAssignVO taskAssignVO) {
		
		StringBuffer personalRule = new StringBuffer();
		
		if (taskAssignVO.getFlag_reassign().booleanValue() == true) {
			personalRule.append(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1820001_0","01820001-1059")/*@res "接收组织可再分配、"*/);
		}
		else {
			personalRule.append(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1820001_0","01820001-1060")/*@res "接收组织不可再分配、"*/);
		}
		if (taskAssignVO.getFlag_privfml().booleanValue() == true) {
			personalRule.append(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1820001_0","01820001-1061")/*@res "可进行个性化公式设置、"*/);
		}
		else {
			personalRule.append(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1820001_0","01820001-1062")/*@res "不可进行个性化公式设置、"*/);
		}
		if (taskAssignVO.getFlag_privprint().booleanValue() == true) {
			personalRule.append(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1820001_0","01820001-1063")/*@res "可进行个性化打印设置"*/);
		}
		else {
			personalRule.append(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("1820001_0","01820001-1064")/*@res "不可进行个性化打印设置"*/);
		}
		
		String sendOrgName = OrgUtil.getOrgName(taskAssignVO.getPk_assignorg());

		//设置个性化规则的值
		varMap.put(PERSONALRULE, personalRule.toString());
		//设置任务所属节点类型
		varMap.put(TASKNODETYPE, sendOrgName);
	}

	@Override
	public String calculateValue(String express) {
		if (varMap.containsKey(express)) {
			if (StringUtils.isEmpty(express)) {
				return "";
			}else {
				return varMap.get(express);
			}
		}
		return "";
	}

	public Map<String, String> getVarMap() {
		return varMap;
	}

	public void setVarMap(Map<String, String> varMap) {
		this.varMap = varMap;
	}
}

6、消息设置已读/未读和删除

  • 业务类消息又称代办消息,需要代码处理消息的已读未读,如果业务执行完毕,则需要设置消息为已读,如果业务回退,需要主动将消息删除

  • 通知消息只需要关注发送和删除,如果业务操作进行了逆操作,需要将发出去的消息删除

  • 下面介绍两个改变消息状态的方法

    方法1:用平台封装好的接口
    代码处理
    • 消息的状态改变可以调用:

    nccloud.message.itf.INCCMessageUtil.setMsgRead(String msgType,String pk_message);

    • 消息的删除的话则调用:

    nccloud.message.itf.INCCMessageUtil.setMsgDeleted(String msgType,String pk_message);

    定位消息
    • 正常情况下我们需要先获取消息的主键,这样才能定位到对应的消息进行删除,可调用 nccloud.message.itf.INCCMessageUtil.getNCCMessage(NCCMessageVO msgVO, String msgType) 方法去先将需要改变状态的消息找出来
    方法2:直接调用底层接口
    代码处理
    • 消息的状态改变可以调用:

    nccloud.message.itf.IMessageManageService.setRead(Map<String, Object> params, boolean isRead, String datasource)

    • 消息的删除的话则调用:

    nccloud.message.itf.IMessageManageService.setDelete(Map<String, Object> params, boolean isDelete, String datasource)

    参数解释
    • param 是一个map类型,用于拼接whereSql,用来过滤出需要删除的消息,param参数中可用的key,调用的时候可以根据需要自行组装
    key含义可取值
    isread是否已读“R”
    userId和userIds接收人主键和数组主键或主键数组
    message_type消息类型“todo”、“notice”、“prealert”、“approve”
    pk_message和pk_messages消息主键和消息主键数组主键或主键数组
    pk_message_usersm_msg_user表主键主键
    pk_detail和pk_details单据明细主键和数组主键或主键数组
    billid和billids单据主键和数组主键或主键数组
    • isReadisDelete 是boolean类型的,标志该消息设置成已读还是未读,设置删除还是恢复删除
    • datasource 设为null,跟代码发现该字段没用上
    • 详情请参考实现类: nccloud.message.bs.MessageManageServiceImpl

7、业务消息发送与页面跳转原理

消息发送原理
  • 消息发送无非就是构造 nccloud.message.vo.NCCMessage ,这个类里面含有消息的所有数据,包括消息内容、发送方信息、接收方信息等所有信息
  • 但是业务消息内容和接收方都是通过读取“业务消息配置”节点来实现的,这个时候就需要用到 nc.buzimsg.vo.BuziMsgSendingContext 。通过设置它的信息来匹配配置信息,从而取出消息模板配置的内容。元数据和业务函数的值就是通过这个类里面的billVO和calculater两个字段来赋值的
    在这里插入图片描述
  • 通过调用平台消息发送接口 nccloud.buzimsg.itf.IBuziMsgSending 来发送消息,我们只需要设置好上面两个类相应的值,就能匹配到相应的配置信息,从而进行消息的发送。
消息跳转原理
  • 消息跳转的话在 nccloud.message.vo.NCCMessage 的成员变量 nccloud.message.vo.NCCMessageVO 类中可设置消息体的跳转信息
通知消息的跳转
  • 我们先来看看前端代码
    在这里插入图片描述

  • 当消息体里面传了应用编码,但是没传单据类型的时候,可直接跳转到对应的小应用,并将一些配置信息拼接进去。
    在这里插入图片描述

  • 也可以在detail字段中拼接“PURL”,如果这个里面指定了跳转信息,则直接跳过去,否则就按设置的单据类型跳转。

  • 现在我们来看后端代码
    在这里插入图片描述

  • 结合前后端代码,总结一下detail字段的格式为:

    单据主键@单据类型编码@单据号@appcode@PURL=appcode=应用编码&pagecode=页面编码

    • 数据不一定要全,但是格式得按这个来
业务消息的跳转
  • 前端代码:
    在这里插入图片描述
  • 先会判断传入的params中是否有“|”字符,有就代表需要选择打开的交易类型,会弹一个框,选择需要跳转的交易类型
    如果没有该字符则直接按传入的信息跳转
    在这里插入图片描述
    前端代码中的this.state.message对应的就是后端代码中的NCCMessage里的NCCMessageVO里面的信息,具体开发过程需要传递字段的话可参考前端代码拼接的字段去设置想要的值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值