Files
GateDge2023_ljy/07.珠海英搏尔/Enpower.Python/POSH_CB_PROCOSTRESULTREC/产品成本还原构造程序.py
PastSaid 5472714e30 aa
2024-08-29 09:42:49 +08:00

298 lines
11 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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