金蝶云星空获取实时库存


#引入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

posted on   这一生,谢谢自己  阅读(174)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示