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