金蝶云星空获取实时库存
#引入clr运行库
import clr
#添加对cloud插件开发的常用组件的引用
clr.AddReference('System')
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('Newtonsoft.Json')
# clr.AddReference('Kingdee.K3.SCM')
#clr.AddReference('Kingdee.BOS.Orm')
#导入cloud基础库中的常用实体对象(分命名空间导入,不会递归导入)
from Kingdee.BOS import *
from Kingdee.BOS.Core import *
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 System import *
from System.Data import *
from Kingdee.BOS.App.Data import *
#from System.Collections.Generic import List
from System.Collections.Generic import *
from Kingdee.BOS.ServiceHelper import *
from Newtonsoft.Json import JsonConvert
from Newtonsoft.Json.Linq import *
from Kingdee.BOS.Orm import *
from Kingdee.BOS.DataEntity import *
from System.Text import *
# from Kingdee.K3.SCM.App.Core import *
def OnPreparePropertys(e):
e.FieldKeys.Add("FBillTypeId"); #单据单据类型,标识 667e76c006c8a9
e.FieldKeys.Add("F_TXBE_InvenQty"); #库存量
e.FieldKeys.Add("Qty"); #实发数量
e.FieldKeys.Add("F_TXBE_Ten_Qty"); #十里商贸库存量
#def EndOperationTransaction(e):
def BeginOperationTransaction(e):#AfterExecuteOperationTransaction(e):
#这里获取单据数据包方式和前面一样
SrcBillNolist=[];
PkIds=List[object]();#执行空操作的单据内码集合
for billObj in e.DataEntitys: #获取单据整体数据(可能是多个单据)
billId=billObj["Id"];#单据ID 113907
billNo=billObj["BillNo"];#单据编号 WLYS2406290004
BillTypeId=billObj["BillTypeId"] #获取单据类型
#typeID=BillTypeId["ID"] #获取单据类型ID
typeNumber=""
stockid=0
matstockid=""
matfmid=""
StockDirect=billObj["StockDirect"] #获取库存方向
if BillTypeId!=None:
typeNumber=BillTypeId["Number"] #获取单据类型编码
#raise Exception(str(typeNumber)) #QTCKD01_SYS
Dept=billObj["DeptId"] #获取领料部门信息
if Dept!=None:
stocknc=Dept["F_TXBE_Base_qtr_83g"] #获取商贸农场仓库信息
if stocknc!=None:
stockid=stocknc["Id"]
matstockid="and stock.FStockId='{0}'".format(stockid)
#stockjc=Dept["F_TXBE_Base_qtr"] #获取商贸集采仓库信息
F_TXBE_Stock=billObj["F_TXBE_Stock"] #获取库存是否充足
F_TXBE_feiliao=billObj["F_TXBE_feiliao"] #是否农药或肥料
StockOrg=billObj["StockOrgId"] #获取库存组织
stockTrue=False
if StockOrg!=None:
StockOrgId=StockOrg["Id"] #获取库存组织ID
#if StockOrgId in('1082','1087','4101','4102','4103','4104','4105','4107','4109','4110','4111','4112','4115','4117','9999'):
stockTrue=True
if typeNumber=="QTCKD01_SYS" and F_TXBE_Stock>=1 and F_TXBE_feiliao>0 and stockTrue==True:
entity=billObj["BillEntry"]#进一步解析单据体,明细信息
fmid=""
i=0;
for rObj in entity:#在单据体中开始取值,判断,赋值
i=i+1;
FMATERIALID=rObj["MaterialId"] #获取物料信息
Fentryid=rObj["Id"] #获取单据体的ID
if FMATERIALID!=None:
fmateid=FMATERIALID["Id"] #获取物料ID
fmid=FMATERIALID["Number"]
matfmid="and m.fnumber='{0}'".format(fmid)
fhStock=rObj["StockId"] #获取发货仓库
if fhStock !=None:
fhStockId=fhStock["Id"] #获取发货仓库ID
# service = StockLockService.GetInstance();
#raise Exception(str(FMATERIALID))
# #根据库存维度等信息查找即时库存
# invStock = service.getInvStockID(this.Context, stockId, stockLocID, lotID, ownerTypeID, ownerID,materialID).FirstOrDefault();
Qty=rObj["BaseQty"] #获取实发数量
#获取当前物料对应的库存
stockds=GetInventory(StockOrgId,fhStockId,fmid)
stockdstab = stockds.Tables[0];
F_TXBE_InvenQty=0
stockcount=stockdstab.Rows.Count
stocksql=StringBuilder();
if stockcount==0:
F_TXBE_InvenQty=0
else:
for dr in stockdstab.Rows:
F_TXBE_InvenQty=dr["FBASEQTY"]; #获取发货仓库对应的库存量
tosql="update T_STK_MISDELIVERYENTRY set F_TXBE_InvenQty={0} where fid={1} and FMATERIALID={2};".format(F_TXBE_InvenQty,billId,fmateid)
stocksql.AppendLine(tosql)
DBUtils.Execute(this.Context,str(stocksql)); #更新发货仓库库存量
if Qty>F_TXBE_InvenQty: #实发数量大于库存量
ds=GetInventory(1137712,stockid,fmid)
tab = ds.Tables[0];
FBASEQTY=0
tabcount=tab.Rows.Count
updatesql=StringBuilder();
if tabcount==0:
FBASEQTY=0
else:
for dr in tab.Rows:
FBASEQTY=dr["FBASEQTY"]; #获取十里商贸对应的库存量
if Qty>F_TXBE_InvenQty: #实发数量大于库存量,进入购买环节
if Qty-F_TXBE_InvenQty>FBASEQTY and StockDirect=="GENERAL":
#raise Exception(str(Qty)+":"+str(F_TXBE_InvenQty)+":"+str(FBASEQTY))
raise Exception("第{0}行十里商贸库存量小于实发数量,无法申请采购".format(i))
else:
usql="update T_STK_MISDELIVERYENTRY set F_TXBE_TEN_QTY={0} where fid={1} and Fentryid={2};".format(FBASEQTY,billId,Fentryid)
updatesql.Append(usql)
#rObj["F_TXBE_Ten_Qty"]=FBASEQTY
DBUtils.Execute(this.Context,str(updatesql)); #更新十里商贸库存量
# rObj["F_TXBE_Ten_Qty"]=FBASEQTY
#获取库存
def GetInventory(FSTOCKORGID,stockid,fmid):
sql="""
select
a.FBASEQTY-0 as FBASEQTY
from T_STK_INVENTORY a
left join T_BD_LOTMASTER lotStock on lotStock.FLOTID=a.FLOT and lotStock.FMATERIALID=a.FMATERIALID and a.FSTOCKORGID=lotStock.FUSEORGID
left JOIN (SELECT TLKE.FSUPPLYINTERID AS FINVENTRYID, SUM(TLKE.FBASEQTY) AS FBASELOCKQTY,
SUM(TLKE.FSECQTY) AS FSECLOCKQTY
FROM T_PLN_RESERVELINKENTRY TLKE INNER JOIN T_PLN_RESERVELINK TLKH ON TLKE.FID = TLKH.FID
WHERE TLKE.FSUPPLYFORMID = 'STK_Inventory' AND TLKE.FLINKTYPE = '4'
GROUP BY TLKE.FSUPPLYINTERID) TSUB ON a.FID = TSUB.FINVENTRYID
inner join T_BD_MATERIAL m on m.FMATERIALID=a.FMATERIALID
inner join T_BD_MATERIAL_L mL on ml.FMATERIALID=m.FMATERIALID and ml.FLOCALEID=2052
inner join t_BD_StockStatus kczt on kczt.FSTOCKSTATUSID=a.FSTOCKSTATUSID
inner join T_BD_STOCKSTATUS_L kcztL on kcztL.FSTOCKSTATUSID=kczt.FSTOCKSTATUSID and kcztL.FLOCALEID=2052
inner join T_BD_UNIT_L baseUnit on baseUnit.FUNITID=a.FBASEUNITID and baseUnit.FLOCALEID=2052
inner join T_BD_Stock_L stockL on stockL.FSTOCKID=a.FSTOCKID and stockL.FLOCALEID=2052
inner join T_BD_Stock stock on stockL.FSTOCKID=stock.FSTOCKID
where FSTOCKORGID={0} and stock.FStockId={1} and m.fnumber='{2}'
""".format(FSTOCKORGID,stockid,fmid)#format(matstockid,matfmid)1137712
ds=DBUtils.ExecuteDataSet(this.Context,sql);
return ds
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通