208 lines
8.9 KiB
Python
208 lines
8.9 KiB
Python
|
|
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 *
|
|||
|
|
# 产品成本汇总快捷查询
|
|||
|
|
# POSH_PRODUCTCOSTQUICKQUERY
|
|||
|
|
# showParameter = None
|
|||
|
|
_whereSql = ""
|
|||
|
|
def BarItemClick(e):
|
|||
|
|
# 新增过滤窗口
|
|||
|
|
if e.BarItemKey == "tbShowFilterForm":
|
|||
|
|
# global showParameter
|
|||
|
|
# if showParameter == None:
|
|||
|
|
showParameter = FilterShowParameter();
|
|||
|
|
showParameter.FormId = "POSH_PRODUCTCOSTQUICKQUERY_FILTER";
|
|||
|
|
showParameter.ParentPageId = this.View.PageId;
|
|||
|
|
|
|||
|
|
this.View.ShowForm(showParameter,lambda x:ShowReturnData(x));
|
|||
|
|
|
|||
|
|
def GetExecCost(billNo,period,acctgOrgId):
|
|||
|
|
sqlL = """/*dialect*/
|
|||
|
|
EXEC TEST_CB_CPCBHYFXIBB_COMPUTE '{0}',{1},{2}
|
|||
|
|
""".format(billNo,period,acctgOrgId)
|
|||
|
|
res = DBServiceHelper.ExecuteDynamicObject(this.Context, sqlL)
|
|||
|
|
return res;
|
|||
|
|
|
|||
|
|
def ShowReturnData(resultData):
|
|||
|
|
global _whereSql
|
|||
|
|
dateVal = ""
|
|||
|
|
whereSql = ""
|
|||
|
|
if resultData.ReturnData is None:
|
|||
|
|
return
|
|||
|
|
else:
|
|||
|
|
filterString = resultData.ReturnData.FilterString;
|
|||
|
|
if filterString != None and filterString != "":
|
|||
|
|
whereSql += " AND " + filterString.replace("FBILLNO","t0.FPRODUCTNO");
|
|||
|
|
|
|||
|
|
customFilter = resultData.ReturnData.CustomFilter;
|
|||
|
|
if customFilter != None:
|
|||
|
|
FYear = customFilter["FYear"]
|
|||
|
|
FPeriod = customFilter["FPeriod"]
|
|||
|
|
yearVal = 0 if FYear == None or FYear == "" else int(FYear)
|
|||
|
|
periodVal = 0 if FPeriod == None or FPeriod == "" else int(FPeriod)
|
|||
|
|
if yearVal > 0:
|
|||
|
|
if periodVal > 0:
|
|||
|
|
dateVal = str(yearVal * 100 + periodVal)
|
|||
|
|
whereSql += " AND (t2.FYEAR * 100 + t2.FPERIOD) = {0} ".format(dateVal)
|
|||
|
|
else:
|
|||
|
|
whereSql += " AND t2.FYEAR = {0} ".format(yearVal)
|
|||
|
|
|
|||
|
|
FSelMoBillNo = customFilter["FSelMoBillNo"]
|
|||
|
|
moBillNo = "" if FSelMoBillNo == None else FSelMoBillNo
|
|||
|
|
if moBillNo != "":
|
|||
|
|
whereSql += " AND t0.FPRODUCTNO = '{0}' ".format(moBillNo)
|
|||
|
|
|
|||
|
|
# raise Exception(whereSql)
|
|||
|
|
|
|||
|
|
if whereSql == "":
|
|||
|
|
raise Exception("查询条件不能为空!")
|
|||
|
|
else:
|
|||
|
|
_whereSql = whereSql
|
|||
|
|
ShowProgressBar();
|
|||
|
|
|
|||
|
|
def DocCompute(whereSql):
|
|||
|
|
# whereSql = _whereSql
|
|||
|
|
moSqlL = """/*dialect*/
|
|||
|
|
DECLARE @ACCTGORGID int
|
|||
|
|
SET @ACCTGORGID = 1
|
|||
|
|
;WITH #列表数据 AS (
|
|||
|
|
SELECT t0.FPRODUCTNO
|
|||
|
|
,t0.FBILLID
|
|||
|
|
,t0.FBILLENTRYID
|
|||
|
|
,t0.FPRODUCTID
|
|||
|
|
,t0.FFORMID
|
|||
|
|
,t1.FPRODUCTDIMEID
|
|||
|
|
,t3.FQUALIFIEDINQTY AS '本期完工数量'
|
|||
|
|
,t3.FCURRINPUTQTY AS '本期投入数量'
|
|||
|
|
,t3.FSUMCURRINPUTQTY AS '累计投入数量'
|
|||
|
|
,t3.FSUMQUALIFIEDINQTY AS '累计完工数量'
|
|||
|
|
,RANK() OVER (PARTITION BY t0.FBILLID,t0.FBILLENTRYID ORDER BY (t2.FYEAR * 100 + t2.FPERIOD) DESC) 'RN'
|
|||
|
|
,(t2.FYEAR * 100 + t2.FPERIOD) AS 'FPERIOD'
|
|||
|
|
FROM T_CB_PROORDERDIME t0
|
|||
|
|
INNER JOIN V_CB_PROORDERINFO t1 on t1.FPRODUCTDIMEID = t0.FPRODUCTDIMEID
|
|||
|
|
INNER JOIN V_HS_OUTACCTG t2 on t1.FACCTGID = t2.FID
|
|||
|
|
LEFT JOIN V_CB_COSTCALEXPENSE t3 on t3.FID = t1.FID
|
|||
|
|
WHERE 1 = 1
|
|||
|
|
AND t2.FACCTGORGID = @ACCTGORGID
|
|||
|
|
AND t2.FCOMPUTEID != ''
|
|||
|
|
AND t1.FENDINITKEY = 1
|
|||
|
|
AND t0.FFORMID = 'PRD_MO'
|
|||
|
|
{0}
|
|||
|
|
)
|
|||
|
|
SELECT t0.*,t1.FNUMBER,t1_l.FNAME
|
|||
|
|
FROM #列表数据 t0
|
|||
|
|
INNER JOIN T_BD_MATERIAL t1 on t1.FMATERIALID = t0.FPRODUCTID
|
|||
|
|
INNER jOIN T_BD_MATERIAL_L t1_l on t1_l.FMATERIALID = t0.FPRODUCTID AND t1_l.FLOCALEID = 2052
|
|||
|
|
WHERE t0.RN = 1
|
|||
|
|
|
|||
|
|
""".format(whereSql)
|
|||
|
|
|
|||
|
|
# raise Exception(moSqlL);
|
|||
|
|
proEntity = this.View.Model.BusinessInfo.GetEntryEntity("FEntity")
|
|||
|
|
proRows = this.View.Model.GetEntityDataObject(proEntity)
|
|||
|
|
this.View.Model.BeginIniti();
|
|||
|
|
proRows.Clear()
|
|||
|
|
datas = DBServiceHelper.ExecuteDynamicObject(this.Context, moSqlL);
|
|||
|
|
if datas != None and datas.Count > 0:
|
|||
|
|
# raise Exception(str(datas.Count));
|
|||
|
|
|
|||
|
|
# this.View.Session["ProcessRateValue"] = 1
|
|||
|
|
num = 0;
|
|||
|
|
count = datas.Count
|
|||
|
|
for data in datas:
|
|||
|
|
row = DynamicObject(proEntity.DynamicObjectType)
|
|||
|
|
|
|||
|
|
period = data["FPERIOD"]
|
|||
|
|
billNo = data["FPRODUCTNO"]
|
|||
|
|
|
|||
|
|
# row["FRN"] = data["FRN"]
|
|||
|
|
row["FMoBillNo"] = billNo
|
|||
|
|
row["FProMaterialNumber"] = data["FNUMBER"]
|
|||
|
|
row["FProMaterialName"] = data["FNAME"]
|
|||
|
|
row["FQUALIFIEDINQTY"] = data["本期完工数量"]
|
|||
|
|
# raise Exception("AAAA2");
|
|||
|
|
num = num + 1
|
|||
|
|
this.View.Session["ProcessRateValue"] = int(num * 100/ count);
|
|||
|
|
this.View.Session["ProcessTips"] = "共{0}条数据,已处理{1}条数据,正在处理{2}".format(count,(num-1),billNo);
|
|||
|
|
|
|||
|
|
costDataList = GetExecCost(billNo,period,1)
|
|||
|
|
|
|||
|
|
if costDataList != None and costDataList.Count > 0:
|
|||
|
|
costData = costDataList[0]
|
|||
|
|
row["FMaterialCostQ"] = float(costData["原材料Q1"])
|
|||
|
|
row["FLaborCostS"] = costData["直接人工S"]
|
|||
|
|
row["FProcessCostO"] = costData["制造费用O"]
|
|||
|
|
row["FQ_O_S_T_R"] = costData["原材料Q1"] + costData["直接人工S"] + costData["制造费用O"]
|
|||
|
|
row["FMaterialCostT"] = costData["间接材料Q2"]
|
|||
|
|
row["FO2"] = costData["制造费用_职工薪酬"]
|
|||
|
|
row["FO3"] = costData["制造费用_股份支付"]
|
|||
|
|
row["FO4"] = costData["制造费用_劳动保护费"]
|
|||
|
|
row["FO5"] = costData["制造费用_差旅费"]
|
|||
|
|
row["FO6"] = costData["制造费用_业务招待费"]
|
|||
|
|
row["FO7"] = costData["制造费用_办公费"]
|
|||
|
|
row["FO8"] = costData["制造费用_折旧与摊销"]
|
|||
|
|
row["FO9"] = costData["制造费用_租赁费"]
|
|||
|
|
row["FO10"] = costData["制造费用_水电费"]
|
|||
|
|
row["FO11"] = costData["制造费用_物料消耗"]
|
|||
|
|
row["FO12"] = costData["制造费用_加工_修理_检测费"]
|
|||
|
|
row["FO13"] = costData["制造费用_车辆使用费"]
|
|||
|
|
row["FO14"] = costData["制造费用_其他"]
|
|||
|
|
row["FO15"] = costData["制造费用_委外加工费"]
|
|||
|
|
row["FALLHRWORKTIME"] = costData["总工时"]
|
|||
|
|
|
|||
|
|
proRows.Add(row)
|
|||
|
|
# raise Exception("AAAA3");
|
|||
|
|
this.View.UpdateView("FEntity")
|
|||
|
|
this.View.Model.EndIniti();
|
|||
|
|
|
|||
|
|
|
|||
|
|
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():
|
|||
|
|
DocCompute(_whereSql)
|
|||
|
|
#根据代码执行过程大致估算出进度值,整数,最后一定要有100%,否则进度弹窗无法自动关闭
|
|||
|
|
this.View.Session["ProcessRateValue"] = 100;
|
|||
|
|
#本案例是通过值更新事件,选择年份或者月份的时候,动态加载出对应的数据
|