如何在生产订单变更业务状态时发送消息通知二开方案
# 如何在生产订单变更业务状态时发送消息通知
## 需求背景
需要在生产订单的业务状态变更发送消息
## 问题现状
1.消息平台只绑定标准操作,不能覆盖所有状态变更的操作调用
2.消息平台发送消息只能整单发送,无法在消息内容中精确定位具体的行状态变更
## 解决方案
1.添加状态机二开插件,实现行执行业务状态变更时发送通知
2.二开生产用料清单加入空操作,按照生产用料清单的空操作添加消息模板,以用料清单的生产订单单据编号以及生产订单行序号作为拼接元素拼接生产订单消息通知。
3.添加生产用料清单消息配置,添加二开插件查看生产订单
## 适用版本
本方案使用PT-146926 [8.0.0.20220922]作为验证环境,推荐使用该补丁版本进行验证,环境不允许的情况下建议在8.0大版本的补丁环境进行测试,基于这个前提下如果有二开不成功的情况,请提单求助。
## 技术要求
1.熟练使用csharp编程
2.熟悉金蝶云星空插件开发
## 部署要求
1.单租户,或线下部署,不支持多租户模式。
2.推荐使用协同云进行开发以及打包。
3.推荐基于在8.0的大版本下进行开发。
## 演示案例(生产订单下达时自动推送消息给业务员)
### 生产用料清单扩展修改
添加空操作【SendNotice】发通知
![生产用料清单扩展.webp](/download/0100ea6d259898854eabbe8121670beeea40.webp)
添加菜单项【tbSendNotice】,不添加菜单项似乎无法在消息配置中被选到,可以在设置完【消息配置】后把菜单项隐藏
![生产用料清单扩展1.webp](/download/01002e1cba1cefdb4088bdf754de204ecdc3.webp)
### 消息模板设置
按需设置消息格式,可以使用纯文本,或者更复杂的表格形式
![消息模板设置.webp](/download/0100f697d198073540d19e045a031eebe49a.webp)
### 消息配置设置
1.绑定扩展添加的空操作
2.触发实际设置为操作成功即触发
3.消息模板选择前面设置的模板,消息通道本方案只测试消息通知,其他自行找资料设置消息模板后测试。
![消息配置设置1.webp](/download/01009a00e2e5bcca4582ab746beb33b654b4.webp)
4.绑定消息接收人,可以是固定的对象,也可以是单据上的设置,支持业务员或者用户资料的设置,其他设置可以自行测试验证。
![消息配置设置2.webp](/download/010074936acd11e7464a8ade73f2f97edc05.webp)
5.使用默认的打开消息设置会打开生产用料清单界面,如果要重定向到生产订单则需要勾选使用自定义消息打开插件(该设置仅在PT-146922 [8.0.0.20220811]后的版本支持)
![消息配置设置3.webp](/download/0100e12d011d5abb4997ad7c0c94e35b9be0.webp)
6.打开【消息通知列表】,点击菜单【消息设置】,在左侧目录【通用设置(管理员)\基本设置】进入消息基本设置,寻找【后台操作触发】参数组,勾选【单据后台操作触发消息发送机制】。**不设置该参数,绑定【消息配置设置】的操作仅在界面菜单或按钮点击调用时发送消息,通过代码插件方式调用操作将不会调用消息发送。**
此设置配合步骤2使用。
![全局消息设置.webp](/download/0100bd86766ba9d146c785023fca15e65ede.webp)
#### 插件样例
``` 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);
}
}
}
}
```
点击菜单测试消息设置是否发送成功,成功则将菜单隐藏
![效果1.webp](/download/01007219fab4076541fab389aadf7bf1d5f4.webp)
#### 状态机插件
二开添加状态机插件
##### 插件样例
``` 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 Kingdee.BOS;
using Kingdee.BOS.Orm.DataEntity;
namespace SamplePlugIn
{
class SendNoticePlugIn : AbstractStateTransferServicePlugIn
{
///
/// 状态机执行后事件
///
/// <param name="e"></param>
public override void AfterExecuteState(AfterExecuteArg e)
{
if (e.InputDataItems.IsEmpty() || !e.OperationResult.IsSuccess) return;
if (e.StateCode == (long)Enums.Enu_MOREQ_Status.KdRelease && e.IsExecuteForward == true)//当前状态为下达,且为正向操作,非反下达
{
var moEntryIds = e.InputDataItems.Select(x => x["Id"].ConvertTo<long>()).Distinct().ToArray();
string sql = string.Format(@"
SELECT T1.FID FROM T_PRD_PPBOM T1
INNER JOIN {0} T ON T1.FMOENTRYID = T.FID", StringUtils.GetSqlWithCardinality(moEntryIds.Length, "@moeids", 1));
var sp = new SqlParam[] {
new SqlParam("@moeids",KDDbType.udt_inttable,moEntryIds)
};
var ret = ServiceFactory.GetService<IDBService>(this.Context).ExecuteDynamicObject(this.Context,
sql, paramList: sp);
if (!ret.IsEmpty())
{
object[] ids = ret.Select(x => x["FID"]).Distinct().ToArray();
var ppbomMeta = ServiceFactory.GetService<IMetaDataService>(this.Context).Load(this.Context, "PRD_PPBOM") as FormMetadata;
DynamicObject[] ppboms = ServiceFactory.GetViewService(this.Context).Load(this.Context, ids, ppbomMeta.BusinessInfo.GetDynamicObjectType());
ServiceFactory.GetService<IDoNothingService>(this.Context).DoNothingWithDataEntity(this.Context, ppbomMeta.BusinessInfo, ppboms,
"SendNotice"
);//调用发消息操作
}
}
}
}
}
```
##### 插件注册
![注册状态机插件.webp](/download/010046e36911886541189e189efb91e19aba.webp)
1.打开BOS设计器>生产制造>基础管理>业务状态机,点击扩展
2.点击运行列表,修改MOStateEngine预插数据,填写状态机插件字段,注意:不要修改任何无关的东西。
## 效果
![效果2.webp](/download/0100fc34938dcdbb4322b1797dd8602d4d1b.webp)
##参考文献
- 制造业务状态机插件二开 https://vip.kingdee.com/article/306357106494839808
- 消息平台的配置使用 https://vip.kingdee.com/article/254607776092541184?productLineId=1&isKnowledge=2
- 消息平台自定义打开插件 https://vip.kingdee.com/article/358186662909774592?productLineId=1&isKnowledge=2
如何在生产订单变更业务状态时发送消息通知二开方案
# 如何在生产订单变更业务状态时发送消息通知## 需求背景需要在生产订单的业务状态变更发送消息## 问题现状1.消息平台只绑定标准操作,...
点击下载文档
上一篇:如何实现库存单据在提交时校验序列号必录下一篇:生产补料业务介绍
本文2024-09-23 03:22:28发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-158446.html
您需要登录后才可以发表评论, 登录登录 或者 注册
最新文档
热门文章