微软 Power Apps model drven app 模型驱动应用使用Plugin插件实现业务流程跳转阶段功能

微软 Power Apps model drven app 模型驱动应用使用Plugin插件实现业务流程跳转阶段功能

模型驱动应用使用插件实现跳转业务流程阶段跳转功能

在实际操作中总会遇到使用业务流程的需求,那么如何使用plugin实现跳转阶段的功能呢

需求背景是主表上有业务流程,子表上有一个选项集字段,选项集字段包含所有的业务流程阶段,在更新子表的选项集时主表的业务流程阶段也需要同步跳转。

由于创建和更新查询不同,所以可以写两个plugin 也可以写在一个中使用message去控制

csharp 复制代码
//创建时执行
if (Context.MessageName=="Create")
   {
       //查询刚刚触发创建的业务流程(业务流程实体)
       string strXml = "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>";
              strXml += "<entity name='new_start'>";
              strXml += "<attribute name='businessprocessflowinstanceid' />";
              strXml += "<attribute name='bpf_name' />";
              strXml += "<attribute name='createdon' />";
              strXml += "<attribute name='bpf_new_salesopportunityid' />";
              strXml += "<attribute name='activestageid' />";
              strXml += "<attribute name='statecode' />";
              strXml += "<attribute name='statuscode' />";
              strXml += "<attribute name='createdby' />";
              strXml += "<attribute name='processid' />";
              strXml += "<order attribute='bpf_name' descending='false' />";
              strXml += "<filter type='and'>";
              strXml += "<condition attribute='businessprocessflowinstanceid' operator='eq' value='" + target.Id + "' />";
              strXml += "</filter>";
              strXml += "</entity>";
              strXml += "</fetch>";
              EntityCollection start = Service.RetrieveMultiple(new FetchExpression(strXml));
              if (start.Entities.Count > 0)
              {
                   Entity Entitytag = Service.Retrieve("new_salesopportunity", start.Entities[0].GetAttributeValue<EntityReference>("bpf_new_salesopportunityid").Id, new ColumnSet("new_phase", "new_businesstype"));
                   //如果包含阶段
                   if (Entitytag.Contains("new_phase"))
                   {
                            //查询需要跳转的阶段(流程阶段值实体)
                            string StageFetch = "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>";
                            StageFetch += "<entity name='processstage'>";
                            StageFetch += "<attribute name='processstageid' />";
                            StageFetch += "<attribute name='processid' />";
                            StageFetch += "<attribute name='stagename' />";
                            StageFetch += "<order attribute='stagename' descending='false' />";
                            StageFetch += "<filter type='and'>";
                            //这里是阶段id 也可以再查一次,这里不大严谨就直接放入了id
                            StageFetch += "<condition attribute='processid' operator='eq' value='{5674a97c-e2d7-4ae6-9dfa-15a8ad0fa340}' />";
                            //根据选项集的name搜索我们要跳转的阶段
                            StageFetch += "<condition attribute='stagename' operator='eq' value='" + Entitytag.GetAttributeValue<EntityReference>("new_phase").Name + "' />";
                            StageFetch += "</filter>";
                            StageFetch += "</entity>";
                            StageFetch += "</fetch>";
                            EntityCollection steges = Service.RetrieveMultiple(new FetchExpression(StageFetch));
                            if (steges.Entities.Count > 0)
                            {
                                //修改流程阶段
                                Entity getProcess = new Entity("new_start");
                                getProcess.Id = start.Entities[0].Id;
                                getProcess["activestageid"] = new EntityReference("processstage", steges.Entities[0].Id);
                                //更新流程阶段
                                Service.Update(getProcess);
                            }
                        }
                    }
                }
                

下面是update时执行,我把它拆开了

csharp 复制代码
else if (Context.MessageName == "Update")
        {
            Entity Entitytag = Service.Retrieve("new_salesopportunity", target.Id, new ColumnSet("new_phase", "new_businesstype"));
            if (target.Contains("new_phase"))
               {
                  //查询需要跳转的阶段(update时候直接查询流程阶段实体即可)
                 string StageFetch = "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>";
                        StageFetch += "<entity name='processstage'>";
                        StageFetch += "<attribute name='processstageid' />";
                        StageFetch += "<attribute name='processid' />";
                        StageFetch += "<attribute name='stagename' />";
                        StageFetch += "<order attribute='stagename' descending='false' />";
                        StageFetch += "<filter type='and'>";
                        StageFetch += "<condition attribute='processid' operator='eq' value='{5674a97c-e2d7-4ae6-9dfa-15a8ad0fa340}' />";
                        StageFetch += "<condition attribute='stagename' operator='eq' value='" + Entitytag.GetAttributeValue<EntityReference>("new_phase").Name + "' />";
                        StageFetch += "</filter>";
                        StageFetch += "</entity>";
                        StageFetch += "</fetch>";
                        EntityCollection steges = Service.RetrieveMultiple(new FetchExpression(StageFetch));
                        if (steges.Entities.Count > 0)
                        {
                            //查询触发创建的业务流程
                            string strXml = "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>";
                            strXml += "<entity name='new_start'>";
                            strXml += "<attribute name='businessprocessflowinstanceid' />";
                            strXml += "<attribute name='bpf_name' />";
                            strXml += "<attribute name='createdon' />";
                            strXml += "<attribute name='bpf_new_salesopportunityid' />";
                            strXml += "<attribute name='activestageid' />";
                            strXml += "<attribute name='statecode' />";
                            strXml += "<attribute name='statuscode' />";
                            strXml += "<attribute name='createdby' />";
                            strXml += "<attribute name='processid' />";
                            strXml += "<order attribute='bpf_name' descending='false' />";
                            strXml += "<filter type='and'>";
                            strXml += "<condition attribute='bpf_new_salesopportunityid' operator='eq' value='" + target.Id + "' />";
                            strXml += "</filter>";
                            strXml += "</entity>";
                            strXml += "</fetch>";
                            EntityCollection start = Service.RetrieveMultiple(new FetchExpression(strXml));
                            if (start.Entities.Count>0)
                            {
                                //修改流程阶段
                                Entity getProcess = new Entity("new_start");
                                getProcess.Id = start.Entities[0].Id;
                                getProcess["activestageid"] = new EntityReference("processstage", steges.Entities[0].Id);
                                //更新流程阶段
                                Service.Update(getProcess);
                            }
                        }
                    }
                }

然后把这个plugin注册在子表上的create 和 update 即可,这里看具体的业务需求实现

当然如果觉得plugin麻烦也可以同理写一个前端的js来实现。

感谢大佬指正 小Monkey
如果你觉得有用的话,就留个赞吧!蟹蟹

相关推荐
HackTwoHub5 小时前
AI大模型网关存在SQL注入、附 POC 复现、影响版本LiteLLM 1.81.16~1.83.7(CVE-2026-42208)
数据库·人工智能·sql·网络安全·系统安全·网络攻击模型·安全架构
l1t5 小时前
DeepSeek总结的DuckLake构建基于 SQL 原生表格式的下一代数据湖仓
数据库·sql
KmSH8umpK5 小时前
Redis分布式锁从原生手写到Redisson高阶落地,附线上死锁复盘优化方案进阶第八篇
数据库·redis·分布式
TDengine (老段)6 小时前
从施工监测到运营预警,桥科院用 TDengine 提升桥梁数据管理能力
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
S1998_1997111609•X7 小时前
论mysql国盾shell-sfa犯罪行为集团下的分项工程及反向注入原理尐深度纳米算法下的鐌檵鄐鉎行为
网络·数据库·网络协议·百度·开闭原则
KmSH8umpK8 小时前
Redis分布式锁从原生手写到Redisson高阶落地,附线上死锁复盘优化方案进阶第七篇
数据库·redis·分布式
BU摆烂会噶9 小时前
【LangGraph】持久化实现的三大能力——时间旅行
数据库·人工智能·python·postgresql·langchain
l1t10 小时前
DeepSeek总结的DuckLake 入门
数据库
Joseph Cooper10 小时前
RAG 与 AI Agent:智能体真的需要检索增强生成吗?
数据库·人工智能·ai·agent·rag·上下文工程
light blue bird10 小时前
主子端台二分法任务汇总组件
前端·数据库·.net·桌面端winform