import clr clr.AddReference("System") clr.AddReference("Kingdee.BOS") clr.AddReference("Kingdee.BOS.Core") clr.AddReference("Kingdee.BOS.DataEntity") clr.AddReference("Kingdee.BOS.App") clr.AddReference("Kingdee.BOS.Contracts") clr.AddReference("Kingdee.BOS.ServiceHelper") from Kingdee.BOS import* from Kingdee.BOS.Util import * from Kingdee.BOS.Core import * from Kingdee.BOS.Core.DependencyRules import * from Kingdee.BOS.Core.Metadata.EntityElement import * from Kingdee.BOS.Orm.DataEntity import* from Kingdee.BOS.Orm.Metadata.DataEntity import* from Kingdee.BOS.Core.DynamicForm.PlugIn import * from Kingdee.BOS.Core.DynamicForm.PlugIn.Args import * from Kingdee.BOS.Core.CommonFilter import * from System import * from System.ComponentModel import* from System.Collections.Generic import* from System.Text import* from Kingdee.BOS.ServiceHelper import * from Kingdee.BOS.KDThread import * # showParameter = None _whereSql = "" def BarItemClick(e): # 新增过滤窗口 if e.BarItemKey == "tbShowFilterForm": # global showParameter # if showParameter == None: showParameter = FilterShowParameter(); showParameter.FormId = "POSH_CB_PROCOSTRESULTREC_FILTER"; showParameter.ParentPageId = this.View.PageId; this.View.ShowForm(showParameter,lambda x:ShowReturnData(x)); def ShowReturnData(result): global _whereSql _whereSql = ""; if result.ReturnData is None: return else: whereSql = ""; MoBills = List[str]() BatchFilterRows = result.ReturnData.BatchFilterRows; if BatchFilterRows != None and BatchFilterRows.Count > 0: for item in BatchFilterRows: if item.Value.find("[") == -1: MoBills.Add(item.Value) else: vals = JsonUtil.DeserializeObject[List[str]](item.Value) MoBills.AddRange(vals) FilterRows = result.ReturnData.FilterRows if FilterRows != None and FilterRows.Count > 0: for item in FilterRows: MoBills.Add(item.Value) if MoBills.Count > 0: whereSql = " AND t0.FBILLNO IN ('{0}') ".format("','".join(MoBills)) _whereSql = whereSql ShowProgressBar(); # DoSetData(whereSql) def DoSetData(whereSql): date = DateTime.Now; dateVal = (str(date)[0:7]).replace("-","") # raise Exception(str(date)) if whereSql == "": whereSql = " AND CONVERT(INT, CONVERT(VARCHAR(6),t0.FDATE,112)) = @period " moSqlL = """/*dialect*/ DECLARE @period int DECLARE @dbName varchar(100) DECLARE @ACCTGORGID int SET @ACCTGORGID = 100039 SET @period = 201801 SELECT @dbName = DB_NAME() IF @dbName != 'AIS20231110222743' BEGIN SET @period = 202406 SET @ACCTGORGID = 1 END ;WITH #初始数据 AS ( SELECT t0.FPRODUCTNO ,t0.FPRODUCTID ,t0.FBILLID ,t0.FBILLENTRYID ,t0.FFORMID ,t0.FPRODUCTDIMEID ,(t2.FYEAR * 100 + t2.FPERIOD) AS 'FPERIOD' FROM T_CB_PROORDERDIME t0 INNER JOIN V_CB_PROORDERINFO t1 on t0.FPRODUCTDIMEID = t1.FPRODUCTDIMEID INNER JOIN V_HS_OUTACCTG t2 on t2.FID = t1.FACCTGID WHERE 1=1 AND (t2.FYEAR * 100 + t2.FPERIOD) = @period AND t2.FACCTGORGID = @ACCTGORGID AND t2.FCOMPUTEID != '' AND t0.FFORMID = 'PRD_MO' AND t1.FENDINITKEY = 1 --期末标识 ) , #成本数据 AS ( SELECT t0.FPRODUCTNO,t0.FPRODUCTID,t0.FPRODUCTDIMEID,t0.FBILLID,t0.FBILLENTRYID ,t1.FCOSTITEMID ,(CASE WHEN t1.FEXPENSESITEMID = 4655037 AND t1.FCOSTITEMID = 20523 THEN 4655093 ELSE t1.FEXPENSESITEMID END) AS 'FEXPENSESITEMID' ,t1.FEXPTYPE ,t1.FQUALIFIEDINAMOUNT ,t1.FCURRINPUTAMOUNT FROM #初始数据 t0 CROSS APPLY ( SELECT t1.FPRODUCTDIMEID ,t3d.FCOSTITEMID ,t3d.FEXPENSESITEMID ,t3.FEXPTYPE ,SUM(t3d.FQUALIFIEDINAMOUNT) 'FQUALIFIEDINAMOUNT' ,SUM(t3d.FCURRINPUTAMOUNT) 'FCURRINPUTAMOUNT' FROM V_CB_PROORDERINFO t1 INNER JOIN V_HS_OUTACCTG t2 on t1.FACCTGID = t2.FID AND (t2.FYEAR * 100 + t2.FPERIOD) <= t0.FPERIOD INNER JOIN V_CB_COSTMATTERIAL t3 on t3.FID = t1.FID INNER JOIN V_CB_COSTMATTERIALDETAIL t3d on t3d.FENTRYID = t3.FENTRYID WHERE 1 = 1 AND t1.FPRODUCTDIMEID = t0.FPRODUCTDIMEID AND t1.FENDINITKEY = 1 GROUP BY t1.FPRODUCTDIMEID ,t3d.FCOSTITEMID ,t3d.FEXPENSESITEMID ,t3.FEXPTYPE ) t1 ) , #成本转换 AS ( SELECT t1.FPRODUCTNO,t1.FPRODUCTID,t1.FPRODUCTDIMEID,t1.FBILLID,t1.FBILLENTRYID ,t1.O1,t1.O2,t1.O3,t1.O4,t1.O5,t1.O6,t1.O7,t1.O8,t1.O9,t1.O10,t1.O11,t1.O12,t1.O13,t1.O14,t1.O15,t1.O16 FROM ( SELECT t0.FPRODUCTNO,t0.FPRODUCTID,t0.FPRODUCTDIMEID,t0.FBILLID,t0.FBILLENTRYID ,t0.FQUALIFIEDINAMOUNT,t1.fieldName FROM #成本数据 t0 LEFT JOIN V_BD_COST_RESTORE_EXPENSE t1 on t0.FEXPENSESITEMID = t1.FEXPID WHERE NOT (t0.FCOSTITEMID = 20522 AND t0.FEXPENSESITEMID = 20045) )t0 PIVOT ( SUM(t0.FQUALIFIEDINAMOUNT) FOR t0.fieldName IN (O1,O2,O3,O4,O5,O6,O7,O8,O9,O10,O11,O12,O13,O14,O15,O16) ) AS t1 ) SELECT t0.* ,ISNULL(t1.O1,0) AS 'O1' ,ISNULL(t1.O2,0) AS 'O2' ,ISNULL(t1.O3,0) AS 'O3' ,ISNULL(t1.O4,0) AS 'O4' ,ISNULL(t1.O5,0) AS 'O5' ,ISNULL(t1.O6,0) AS 'O6' ,ISNULL(t1.O7,0) AS 'O7' ,ISNULL(t1.O8,0) AS 'O8' ,ISNULL(t1.O9,0) AS 'O9' ,ISNULL(t1.O10,0) AS 'O10' ,ISNULL(t1.O11,0) AS 'O11' ,ISNULL(t1.O12,0) AS 'O12' ,ISNULL(t1.O13,0) AS 'O13' ,ISNULL(t1.O14,0) AS 'O14' ,ISNULL(t1.O15,0) AS 'O15' ,ISNULL(t1.O16,0) AS 'O16' ,ISNULL(t1.O1,0) +ISNULL(t1.O2,0) + ISNULL(t1.O3,0) + ISNULL(t1.O4,0) + ISNULL(t1.O5,0) + ISNULL(t1.O6,0) + ISNULL(t1.O7,0) + ISNULL(t1.O8,0) + ISNULL(t1.O9,0) + ISNULL(t1.O10,0) + ISNULL(t1.O11,0) + ISNULL(t1.O12,0) + ISNULL(t1.O13,0) + ISNULL(t1.O14,0) + ISNULL(t1.O15,0) + ISNULL(t1.O16,0) AS 'CostAll' ,t2.FNUMBER ,t2_l.FNAME ,t2_l.FDESCRIPTION FROM #初始数据 t0 LEFT JOIN #成本转换 t1 on t0.FBILLID = t1.FBILLID AND t0.FBILLENTRYID = t1.FBILLENTRYID INNER JOIN T_BD_MATERIAL t2 on t0.FPRODUCTID = t2.FMATERIALID INNER JOIN T_BD_MATERIAL_L t2_l on t2_l.FMATERIALID = t0.FPRODUCTID AND t2_l.FLOCALEID = 2052 """.format(str(dateVal),whereSql) # raise Exception(moSqlL); datas = DBServiceHelper.ExecuteDynamicObject(this.Context, moSqlL); if datas != None and datas.Count > 0: # raise Exception(str(datas.Count)); proEntity = this.View.Model.BusinessInfo.GetEntryEntity("FEntity") proRows = this.View.Model.GetEntityDataObject(proEntity) this.View.Session["ProcessRateValue"] = 1 this.View.Model.BeginIniti(); proRows.Clear() num = 0; count = datas.Count for data in datas: row = DynamicObject(proEntity.DynamicObjectType) costQ = 0 costT = 0 billno = data["FPRODUCTNO"] num = num + 1 this.View.Session["ProcessRateValue"] = int(num * 100/ count); this.View.Session["ProcessTips"] = "共{0}条数据,已处理{1}条数据,正在处理{2}".format(count,(num-1),billno); resCost = GetExecCost(data["FPRODUCTNO"]) if resCost != None and resCost.Count > 0: resCostRow = resCost[0] costQ = resCostRow["costQ"] costT = resCostRow["costT"] row["FMoBillNo"] = data["FPRODUCTNO"] row["FProMaterialNumber"] = data["FNUMBER"] row["FProMaterialName"] = data["FNAME"] row["FQUALIFIEDINQTY"] = data["FSTOCKINQUASELAUXQTY"] row["FMaterialCostQ"] = costQ row["FLaborCostS"] = data["O1"] row["FProcessCostO"] = data["O"] + costT row["FQ_O_S_T_R"] = data["R"] + costQ + costT row["FSysCostP"] = data["P"] # row["FO1"] = data["O1"] row["FMaterialCostT"] = costT row["FO2"] = data["O2"] row["FO3"] = data["O3"] row["FO4"] = data["O4"] row["FO5"] = data["O5"] row["FO6"] = data["O6"] row["FO7"] = data["O7"] row["FO8"] = data["O8"] row["FO9"] = data["O9"] row["FO10"] = data["O10"] row["FO11"] = data["O11"] row["FO12"] = data["O12"] row["FO13"] = data["O13"] row["FO14"] = data["O14"] row["FO15"] = data["O15"] row["FO16"] = data["O16"] proRows.Add(row) this.View.UpdateView("FEntity") this.View.Model.EndIniti(); def DoComputeData(billNo): return { "CostQ" : 0,"CostT": 0 ,"CostA": 0 } def GetExecCost(billNo): sqlL = """/*dialect*/ EXEC PROC_CB_PRODUCT_COST_SELECT_SINGLE '{0}' """.format(billNo) res = DBServiceHelper.ExecuteDynamicObject(this.Context, sqlL) return res; # 检查批号是否符合类型 def CheckLotText(lotText): if len(lotText) < 12: return False lotFlag = lotText[:2] if lotFlag == "WO" or lotFlag == "RO" or lotFlag == "TO" or lotFlag == "RT" : return True return False; def showRslt(asynResult): if (asynResult != None and asynResult.Exception != None): this.View.ShowErrMessage(asynResult.Exception.Message); #进度条达到100%之后,关闭进度条弹窗,回调此方法,弹出提示信息 def showFinishMsg(formResult): this.View.ShowMessage("数据加载完成!"); def ShowProgressBar(): #调试执行任务时,可以先通过这两行调试任务执行代码 #因为启用进度条之后,是在子线程中运行,不方便分析代码问题。调试成功之后,再屏蔽这两行,启用进度条 # setData(); # return; progressFormParameter = DynamicFormShowParameter(); progressFormParameter.PageId = Guid.NewGuid().ToString(); progressFormParameter.FormId = "BOS_ReportProgressMsg"; progressFormParameter.OpenStyle.ShowType = ShowType.Modal; progressFormParameter.Caption = "正在加载数据..."; progressFormParameter.HiddenCloseButton = True; #true表示使用真实进度,在执行任务的方法中更新进度值:代码示例,this.View.Session["ProcessRateValue"] =10 progressFormParameter.CustomParams.Add("UseTruePro", "true"); this.View.ShowForm(progressFormParameter,Action[FormResult](showFinishMsg)); MainWorker.QuequeTask(this.Context,Action(setData),Action[AsynResult](showRslt)); #自定义方法,在这里实现加载数据的任务,需要根据自己的个性化编写代码 def setData(): DoSetData(_whereSql) #根据代码执行过程大致估算出进度值,整数,最后一定要有100%,否则进度弹窗无法自动关闭 this.View.Session["ProcessRateValue"] = 100; #本案例是通过值更新事件,选择年份或者月份的时候,动态加载出对应的数据