
# 如何在生产订单变更业务状态时发送消息通知
## 需求背景
需要在生产订单的业务状态变更发送消息
## 问题现状
1.消息平台只绑定标准操作,不能覆盖所有状态变更的操作调用
2.消息平台发送消息只能整单发送,无法在消息内容中精确定位具体的行状态变更
## 解决方案
1.添加状态机二开插件,实现行执行业务状态变更时发送通知
2.二开生产用料清单加入空操作,按照生产用料清单的空操作添加消息模板,以用料清单的生产订单单据编号以及生产订单行序号作为拼接元素拼接生产订单消息通知。
3.添加生产用料清单消息配置,添加二开插件查看生产订单
## 适用版本
本方案使用PT-146926 [8.0.0.20220922]作为验证环境,推荐使用该补丁版本进行验证,环境不允许的情况下建议在8.0大版本的补丁环境进行测试,基于这个前提下如果有二开不成功的情况,请提单求助。
## 技术要求
1.熟练使用csharp编程
2.熟悉金蝶云星空插件开发
## 部署要求
1.单租户,或线下部署,不支持多租户模式。
2.推荐使用协同云进行开发以及打包。
3.推荐基于在8.0的大版本下进行开发。
## 演示案例(生产订单下达时自动推送消息给业务员)
### 生产用料清单扩展修改
添加空操作【SendNotice】发通知

添加菜单项【tbSendNotice】,不添加菜单项似乎无法在消息配置中被选到,可以在设置完【消息配置】后把菜单项隐藏

### 消息模板设置
按需设置消息格式,可以使用纯文本,或者更复杂的表格形式

### 消息配置设置
1.绑定扩展添加的空操作
2.触发实际设置为操作成功即触发
3.消息模板选择前面设置的模板,消息通道本方案只测试消息通知,其他自行找资料设置消息模板后测试。

4.绑定消息接收人,可以是固定的对象,也可以是单据上的设置,支持业务员或者用户资料的设置,其他设置可以自行测试验证。

5.使用默认的打开消息设置会打开生产用料清单界面,如果要重定向到生产订单则需要勾选使用自定义消息打开插件(该设置仅在PT-146922 [8.0.0.20220811]后的版本支持)

6.打开【消息通知列表】,点击菜单【消息设置】,在左侧目录【通用设置(管理员)\基本设置】进入消息基本设置,寻找【后台操作触发】参数组,勾选【单据后台操作触发消息发送机制】。**不设置该参数,绑定【消息配置设置】的操作仅在界面菜单或按钮点击调用时发送消息,通过代码插件方式调用操作将不会调用消息发送。**
此设置配合步骤2使用。

#### 插件样例
``` Csharp
using Kingdee.BOS.Core.MessageCenter.Plugin;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.MessageCenter.Plugin.Arg;
using Kingdee.BOS;
using Kingdee.BOS.ServiceHelper;
using Kingdee.BOS.Util;
using Kingdee.BOS.Core.Bill;
namespace SamplePlugIn
{
public class NoticeMsgViewPlugIn: AbstractMessageViewPlugIn
{
public override void CustomMessageView(MessageViewEventArgs messageViewEventArgs, IDynamicFormView View)
{
string strSql = @"SELECT FMOID FROM T_PRD_PPBOM WHERE FID = @PPBID";
SqlParam[] sp = new
SqlParam[] {
new SqlParam("@PPBID",KDDbType.Int64,messageViewEventArgs.PkId)
};
var ret = DBServiceHelper.ExecuteDynamicObject(View.Context, strSql, paramList: sp);//查找生产订单内码
if(!ret.IsEmpty())
{
long moid = Convert.ToInt64(ret.FirstOrDefault()["FMOID"]);
BillShowParameter bsp = new BillShowParameter()
{
FormId = "PRD_MO",
Status = Kingdee.BOS.Core.Metadata.OperationStatus.EDIT,
PKey = moid.ToString(),
PageId = Guid.NewGuid().ToString()
};//构造显示生产订单窗体
bsp.OpenStyle.ShowType = ShowType.MainNewTabPage;
View.ShowForm(bsp);
}
}
}
}
```
点击菜单测试消息设置是否发送成功,成功则将菜单隐藏

#### 状态机插件
二开添加状态机插件
##### 插件样例
``` Csharp
using Kingdee.K3.Core.MFG.PRD.PlugIn;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Kingdee.BOS.Util;
using Kingdee.K3.Core.MFG.EnumConst;
using Kingdee.K3.Core.MFG.EntityHelper;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Contracts;
using Ki