This commit is contained in:
PastSaid
2024-08-29 09:42:49 +08:00
parent fa480006a8
commit 5472714e30
66 changed files with 7417 additions and 243 deletions

View File

@@ -6,84 +6,293 @@ clr.AddReference("Kingdee.BOS.DataEntity")
clr.AddReference("Kingdee.BOS.App")
clr.AddReference("Kingdee.BOS.Contracts")
clr.AddReference("Kingdee.BOS.ServiceHelper")
clr.AddReference("ExtensionMethods")
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 ExtensionMethods import BooleanExtension as boolObjEx
from ExtensionMethods import DateTimeExtension as dateObjEx
from ExtensionMethods import ObjectExtension as objEx
from ExtensionMethods import StringExtension as strObjEx
from Kingdee.BOS.KDThread import *
def ButtonClick(e):
if e.Key.EndsWith("FToSelectBtn", StringComparison.OrdinalIgnoreCase):
# 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)
billNos = List[str]()
billNos.Add("RO2403280019")
SelectData();
if MoBills.Count > 0:
whereSql = " AND t0.FBILLNO IN ('{0}') ".format("','".join(MoBills))
_whereSql = whereSql
ShowProgressBar();
# DoSetData(whereSql)
def SelectData(billNos):
jsons = []
sqlL = """/*dialect*/
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 "
SELECT t0.FPRODUCTNO
,t0.FPRODUCTID
,SUM(t1.FAMOUNT) AS '领料成本'
,SUM(t1.FQTY) AS '领料数量'
,t2.FMATERIALID
,ISNULL(t4.FNUMBER,'') 'FLOT_TEXT'
,ROW_NUMBER() OVER (PARTITION BY t0.FPRODUCTNO,t0.FPRODUCTID ORDER BY t2.FMATERIALID) RN
,0 plevel
FROM T_CB_PROORDERDIME t0
INNER JOIN V_CB_COSTALLORESULTSEND t1 on t0.FPRODUCTDIMEID = t1.FPRODUCTDIMEID
INNER JOIN T_HS_INIVSTOCKDIMENSION t2 on t2.FENTRYID = t1.FDIMEENTRYID
INNER JOIN V_HS_OUTINSTOCKSEQ t3 on t3.FENTRYID = t1.FOUTINSTOCKID
LEFT JOIN T_BD_LOTMASTER t4 on t4.FLOTID = t2.FLOT
WHERE t0.FPRODUCTNO IN ('{0}')
GROUP BY t0.FPRODUCTNO,t0.FPRODUCTID,t2.FMATERIALID,t4.FNUMBER
moSqlL = """/*dialect*/
DECLARE @period int
DECLARE @dbName varchar(100)
DECLARE @ACCTGORGID int
"""
SET @ACCTGORGID = 100039
SET @period = 201801
SELECT @dbName = DB_NAME()
datas = DBServiceHelper.ExecuteDynamicObject(this.Context, sqlL.format("','".join(billNos)));
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"]
itemBillNos = List[str]()
for item in datas:
lotObjVal = item["FLOT_TEXT"]
lotVal = '' if lotObjVal == None else str(lotObjVal)
jsonData = {"工单编号": item["FPRODUCTNO"],"批号": lotVal}
proRows.Add(row)
if lotVal != '':
itemBillNos.Add(lotVal);
this.View.UpdateView("FEntity")
this.View.Model.EndIniti();
jsons.append(jsonData);
if itemBillNos.Count > 0:
return SelectData(itemBillNos)
return None
else :
return None
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;
#本案例是通过值更新事件,选择年份或者月份的时候,动态加载出对应的数据