#引入clr运行库 import clr #添加对cloud插件开发的常用组件的引用 clr.AddReference('System') clr.AddReference('System.Core') clr.AddReference('System.Data') clr.AddReference('Kingdee.BOS') clr.AddReference('Kingdee.BOS.Core') clr.AddReference('Kingdee.BOS.App') clr.AddReference('Kingdee.BOS.DataEntity') clr.AddReference('Kingdee.BOS.Contracts') clr.AddReference('Kingdee.BOS.ServiceHelper') clr.AddReference('Kingdee.BOS.App.LogService') clr.AddReference('Kingdee.K3.MFG.ServiceHelper') clr.AddReference('Kingdee.BOS.Business.Bill') clr.AddReference('Kingdee.K3.Core') clr.AddReference('Newtonsoft.Json') #导入cloud基础库中的常用实体对象(分命名空间导入,不会递归导入) from Kingdee.BOS import * from Kingdee.BOS.Core import * #金蝶的解析json工具 from Kingdee.BOS.JSON import JSONObject #金蝶的上机日志工具 import Kingdee.BOS.Core.Log as Kingdee_Log from Kingdee.BOS.Contracts import * from Kingdee.BOS.Orm.DataEntity import * from Kingdee.BOS.DataEntity import * from Kingdee.BOS.Core.Bill import * from Kingdee.BOS.Core.DynamicForm import * from Kingdee.BOS.Core.DynamicForm.PlugIn import * from Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel import * from Kingdee.BOS.Log import * from Kingdee.BOS.App.LogService import * from Kingdee.BOS.App.Data import * from Kingdee.BOS.ServiceHelper import * #金蝶的查询条件参数对象 from Kingdee.BOS.Core.SqlBuilder import * from Kingdee.BOS.Core.SqlBuilder import QueryBuilderParemeter from Kingdee.BOS.Core.Metadata import * #金蝶json字符串转换成DynamicObjectc对象 from Kingdee.BOS.Util.JsonUtil import DeserializeObject from Kingdee.BOS.Util import SequentialGuid from System import * from System.Linq import * from System.Data import * from System.Collections.Generic import List,Dictionary from Newtonsoft.Json import JsonConvert,JsonSerializer,JsonSerializerSettings,ReferenceLoopHandling from Newtonsoft.Json.Linq import * from System.Net import WebRequest, WebException from System.IO import StreamWriter, StreamReader from System.Text import Encoding from Kingdee.K3.MFG.ServiceHelper import ENG from Kingdee.K3.Core import MFG from Kingdee.K3.Core.MFG.EnumConst import Enums from Kingdee.K3.Core.MFG import Utils from System import Int64 from Kingdee.BOS.Util import * from Kingdee.BOS.Core.Report import * from Kingdee.BOS.Business.Bill.Utils.Args import * from Kingdee.BOS.Business.Bill.Utils.ImportExportUtils import * def AfterSave(e): """ 保存后事件:单据保存成功后执行 触发顺序:AfterSave -> AfterDoOperation """ bomQueryOption=BuildBomExpandOption() lstExpandSource=BuildBomExpandSourceData(277897,252521) lstExpandResult=ENG.BomQueryServiceHelper.GetBomQueryForwardResult(this.Context, lstExpandSource, bomQueryOption) FIDList=List[Int64]() #FIDList=[ int(Row["MaterialId_Id"]) for Row in lstExpandResult if Row["ErpClsID"] in ['1','2'] ] for Row in lstExpandResult: if Row["ErpClsID"] in ['1','2']: FIDList.Add(int(Row["MaterialId_Id"])) SelectItems=SelectorItemInfo.CreateItems("FMATERIALID","FNumber","FName","FSpecification","FPurchaserId","FPurchaserId.FName","FDefaultVendor","FDefaultVendor.FName") FilterClauseWihtKey="FUseOrgId=1" SqlParams=List[SqlParam](); Rst=QueryDynamicObjectCollection("BD_MATERIAL",FIDList,SelectItems,FilterClauseWihtKey,SqlParams) BillMeta=MetaDataServiceHelper.Load(this.Context, "BD_MATERIAL") Heads=List[List[ExcelField]]() ExcelFields=List[ExcelField]() for i in range(len(SelectItems)): HeadlField= ExcelField() FieldObject =BillMeta.BusinessInfo.GetField(SelectItems[i].PropertyName) if not FieldObject: HeadlField.FieldKey=SelectItems[i].PropertyName HeadlField.FieldName =SelectItems[i].PropertyName HeadlField.Caption=SelectItems[i].PropertyName else: HeadlField.FieldKey=FieldObject.PropertyName HeadlField.FieldName =FieldObject.Key HeadlField.Caption=FieldObject.Name ExcelFields.Add(HeadlField) Heads.Add(ExcelFields) CustomExportArgs=DoCustomExportArgs() CustomExportArgs.DataSource = List[DynamicObject](Rst) CustomExportArgs.FileName ='test_'+str(DateTime.Now) CustomExportArgs.Headers =Heads DoCustomExport(this.View,CustomExportArgs) obj=JsonConvert.SerializeObject(SelectItems,JsonSerializerSettings (ReferenceLoopHandling = ReferenceLoopHandling.Ignore)) this.View.ShowMessage(obj) # 示例1:保存成功后显示提示 #this.View.ShowMessage("单据保存成功!Python插件AfterSave事件已触发。") #this.View.ShowMessage(str(lstExpandSource)) def BuildBomExpandOption(): memBomExpandOption = MFG.ENG.ParamOption.MemBomExpandOption_ForPSV() memBomExpandOption.ExpandLevelTo = 0 memBomExpandOption.ExpandVirtualMaterial = True memBomExpandOption.DeleteVirtualMaterial = False memBomExpandOption.ExpandSkipRow = True memBomExpandOption.DeleteSkipRow = False memBomExpandOption.IsShowOutSource = True memBomExpandOption.BomExpandId = str(SequentialGuid.NewGuid()) memBomExpandOption.ParentCsdYieldRate = False memBomExpandOption.ChildCsdYieldRate = False memBomExpandOption.Mode =Enums.BomExpand.Enu_BomExpandMode.KdMemoryOnly memBomExpandOption.IsExpandUnAuditBom = True #从界面获取是否考虑替代方案 #isShowSubMtrl = View.GetUserParam("IsShowSubMtrl", False) #memBomExpandOption.CsdSubstitution = isShowSubMtrl memBomExpandOption.CsdSubstitution=False memBomExpandOption.BomExpandCalType = Enums.Enu_BomExpandCalType.kdBySystemProfile; memBomExpandOption.Option.SetVariableValue("requireDataPermission", True) memBomExpandOption.DeleteExpireMaterial = False return memBomExpandOption; def BuildBomExpandSourceData(bomId,materialId): lstExpandSource = List[DynamicObject]() bomExpandSourceRowView = MFG.ENG.BomExpand.BomForwardSourceDynamicRow.CreateInstance() bomExpandSourceRowView.MaterialId_Id = materialId bomExpandSourceRowView.BomId_Id = bomId bomExpandSourceRowView.NeedQty = 0 bomExpandSourceRowView.TimeUnit = str(1) lstExpandSource.Add(bomExpandSourceRowView) #obj=JsonConvert.SerializeObject(bomExpandSourceRowView) #this.View.ShowMessage(obj) return lstExpandSource def QueryDynamicObjectCollection(FormId,FIDList,SelectItems,FilterClauseWihtKey,SqlParams): query_param = QueryBuilderParemeter() query_param.FormId=FormId #query_param.SelectItems = SelectorItemInfo.CreateItems("FBILLNO"); query_param.SelectItems =SelectItems query_param.FilterClauseWihtKey =FilterClauseWihtKey if len(SqlParams)>0: query_param.SqlParams=SqlParams #这外方法获取了一个子查询,可以用在QueryBuilderParemeter 的ExtJoinTables的属性中作连查询的作用 w=StringUtils.GetSqlWithCardinalityAndParam2(FIDList,"@tvp") query_param.SqlParams.Add(w[1]) joinEntry = ExtJoinTableDescription() joinEntry.JoinFirst = True joinEntry.JoinOption = QueryBuilderParemeter.JoinOption.InnerJoin joinEntry.ScourceKey = "FMATERIALID" joinEntry.TableName =w[0] joinEntry.TableNameAs = "tp" joinEntry.FieldName = "FID" query_param.ExtJoinTables.Add(joinEntry) #obj=JsonConvert.SerializeObject(query_param) #this.View.ShowMessage(obj) #获取动态对像集合 return QueryServiceHelper.GetDynamicObjectCollection(this.Context, query_param)BOM正向展开
张小明
前端开发工程师
STM32F411链接脚本详解:从复位向量到main的硬件级启动流程
1. 为什么 STM32F411 的链接脚本不能照抄 STM32F103?——从复位向量到 main() 的真实路径你手头有一块 STM32F411RE-Nucleo 开发板,烧录了官方 HAL 库的 LED 闪烁例程,一切正常;但当你尝试用裸机方式(不调用 HAL_Init、…
人生几时春?春天不是等来的,是醒来的
三月的风一吹,楼下的杏花没几天就落了。我蹲在院子里收拾冬天冻死的月季,突然就想到“人生几时春”这五个字。这是个挺老的话题,可每到万物复苏的时候,总会被人翻出来重新嚼一遍。春天到底什么时候来?是按节气走&#…
FPGA实现MIL-STD-1553B硬实时通信的工程实践
1. 这不是“又一个FPGA项目”,而是航空电子系统里真正扛压的通信脊梁你可能在实验室里用FPGA跑过UART、I2C,甚至搭过简单的SPI从机——但当你第一次把逻辑代码烧进Xilinx Kintex-7或Intel Cyclone V,连上1553B总线分析仪,看到BC&a…
Claude Sonnet 4 跑 100 万 Token 的 Code Review:Key 用 TaoToken
/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …
AI工具助力论文写作:从文献管理到降重查重
1. 论文写作痛点与AI工具的价值作为一名带过上百篇毕业论文的指导老师,我见过太多学生在论文写作中的挣扎。特别是专科层次的同学,往往面临着三大核心痛点:文献检索效率低、论文框架不清晰、语言表达不专业。这就像让一个刚学会游泳的人直接横…
Agent-Skills工程化实践:TypeScript+Node.js+NX构建可复用智能体能力模块
1. 项目概述:Agent-Skills 不是“智能体技能包”,而是可复用能力模块的工程化实践“agent-skills”这个名称乍看像某个AI Agent的插件库,但实际在工程实践中,它指的是一套面向复杂业务系统中智能体(Agent)能…