298 lines
11 KiB
Python
298 lines
11 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 *
|
|||
|
|
|
|||
|
|
# 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;
|
|||
|
|
#本案例是通过值更新事件,选择年份或者月份的时候,动态加载出对应的数据
|