Files
PastSaid 08d8878eef a
2024-03-11 14:47:23 +08:00

206 lines
9.2 KiB
Python
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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")
clr.AddReference("ExtensionMethods")
# clr.AddReference("K3CExttensionMethods")
from Kingdee.BOS import*
from Kingdee.BOS.Contracts import*
from Kingdee.BOS.Contracts.Report import*
from Kingdee.BOS.Core import *
from Kingdee.BOS.Core.Metadata import *
from Kingdee.BOS.Core.Report import*
from Kingdee.BOS.Core.SqlBuilder import*
from Kingdee.BOS.Core.Enums import *
from Kingdee.BOS.App.Data import*
from Kingdee.BOS.Orm.DataEntity import*
from System import *
from System.ComponentModel import*
from System.Collections.Generic import*
from System.Text import*
from System.Threading.Tasks 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 K3CExttensionMethods import ListHeaderExtension as lhObjEx
#初始化,在此事件中设置报表的属性全局参数
def Initialize():
this.ReportProperty.ReportType= ReportType.REPORTTYPE_NORMAL;
this.IsCreateTempTableByPlugin=True;
#是否支持分组汇总,在后面GetSummaryColumnInfo方法中添加汇总字段,
#要在BOS中过滤框的汇总页签配置汇总信息,可参考:简单账表分组汇总设置
this.ReportProperty.IsGroupSummary=True;
#IsUIDesignerColumns=False,表示报表的列通过插件控制,后续在GetReportHeaders中构建列头
#需要在BOS过滤框的显示隐藏列中维护,字段标识与临时表字段保持一致
#账表列头构建更多详细说明参考:账表列构建
this.ReportProperty.IsUIDesignerColumns=False;
this.ReportProperty.PrimaryKeyFieldName = "FID";
#创建临时报表,正式进入账表取数sql拼接并取数把账表取数结果放到创建的临时表中
#如果参数(this.IsCreateTempTableByPlugin=True)即调用BuilderReportSqlAndTempTable构建临时表
#否则调用以下3个接口完成账表取数逻辑的sql指令即BuilderSelectFieldSQL、BuilderTempTableOrderBySQL、BuilderFormWhereSQL
#rptfilter:账表参数,可以从这里获取过滤条件等
#tableName:系统自动创建的账表临时表名,具备唯一性,最终报表页面展示的数据绑定此临时表,所以最终的报表结果数据要写入此临时表中
def BuilderReportSqlAndTempTable(rptfilter,tableName):
#baseDataTemp=filter.BaseDataTempTable;#基础资料临时表;若设置了数据范围权限,该表会把根据数据范围过滤出来的内码存入临时表;
#循环获取所有基础资料数据范围的数据可用来拼接到报表SQL里面实现数据权限过滤
#for b in baseDataTemp:
# baseType=b.BaseDataFormId;#基础资料FormId
# PKFldName=b.PKFieldName;#临时表中基础资料主键字段名,例如,FORGID
# baseTempTab=b.TempTable;#基础资料数据范围临时表名
#filterStr=filter.FilterParameter.FilterString;#过滤框条件页签过滤表达式
#过滤框快捷过滤页签的实体数据包,从这里面获取自定义的过滤字段值
#DynamicObject类型,用前面讲的实体数据包操作方式取值,用绑定实体属性标识
custFilter = rptfilter.FilterParameter.CustomFilter;
if(custFilter == None):
return;
whereSql = "";
_lcId = this.Context.UserLocale.LCID;
#raise Exception(str.Join(',',fldsSql));#调试时可用此行代码看看构建的动态列SQL对不对
#组装最终写入报表临时表的SQL
#注意!!!: 最终临时表一定要有FIDENTITYID 要从1开始且不重复 ,不断号,不然前台显示空白!!!!
sql=("""/*dialect*/ 
DECLARE @LCID int
SET @LCID = {1}
SELECT
ROW_NUMBER() OVER(ORDER BY t0.FDATE DESC,t0.FID DESC,t0e.FSEQ ASC) AS FIDENTITYID--1.行号
,t0.FID
,t0e.FSEQ
,t0e.FENTRYID
,t0.FDATE --2.单据日期
,t1.FBILLNO AS 'FPPBOMBILLNO'--3.生产投料单号
,t1.FID AS 'FPPBOMID'
,t0e.FSALEORDERNO --4.销售订单号
,t0.FBILLNO--7.生产任务单号
,t0e.FPLANSTARTDATE--38.计划开工日期
,t0e.FPLANFINISHDATE--39.计划完工日期
,t0e.FQTY--12.产品生产数量
,t0e.FYIELDRATE
,t0e.FROUTINGID
,t0e.FMATERIALID AS 'ProMaterialId'
,t0e.FUNITID AS 'PrdUnitId'
,t1e.FENTRYID AS 'PPBOMENTRYID'
,t1e.FMATERIALID
,(t1e.FNUMERATOR / t1e.FDENOMINATOR) AS 'FUnitNeedQty' --18.物料单位用量
,t1e.FNEEDQTY --22.物料总需求
,t1e.FUNITID
,t1e.FBOMENTRYID
,t1e.FSTDQTY --标准用量 --29.标准数量
,t1e.FMUSTQTY --应发数量 --30.应发数量
,t1.FWORKSHOPID
,(CASE t0e.FPRODUCTTYPE WHEN 1 THEN '主产品' WHEN 2 THEN '联产品' WHEN 3 THEN '副产品' ELSE '' END) AS 'PRODUCTTYPE'--43.生产类型
,(CASE t0e_a.FSTATUS WHEN 6 THEN '已结案'ELSE '' END) AS 'StatusIs6'--45.生产任务单结案否
,(CASE t1.FDOCUMENTSTATUS WHEN 'A' THEN '创建' WHEN 'B' THEN '审核中' WHEN 'C' THEN '已审核' WHEN 'D' THEN '重新审核' WHEN 'Z' THEN '暂存' ELSE '' END) AS 'PPBOMStatus'--46.生产投料单状态
INTO #TmpTable0
FROM T_PRD_MO t0
INNER JOIN T_PRD_MOENTRY t0e on t0.FID = t0e.FID
INNER JOIN T_PRD_MOENTRY_A t0e_a on t0e_a.FENTRYID = t0e.FENTRYID
INNER JOIN T_PRD_PPBOM t1 on t1.FMOENTRYID = t0e.FENTRYID AND t1.FMOID = t0e.FID
INNER JOIN T_PRD_PPBOMENTRY t1e on t1e.FID = t1.FID
WHERE 1 = 1 {2}
SELECT
tt.*
,t0e_q.FBASEWIPQTY --23.当前在制品数量
,t0e_q.FPICKEDQTY --27.已领数量
,t0e_q.FNOPICKEDQTY --28.未领数量
,t0e_l.FMEMO --31.备注
,t0e_q.FPICKEDQTY * (100 - tt.FYIELDRATE) AS 'FLossQty'--32.损耗数量
,t0e_q.FSCRAPQTY --33.报废数量
,t0e_q.FREPICKEDQTY --37.补料数量
,t0e_q.FINVENTORYQTY
,t0e_c.FSTOCKID
,t0e_c.FSTOCKLOCID
INTO #TmpTable1
FROM #TmpTable0 tt
LEFT JOIN T_PRD_PPBOMENTRY_Q t0e_q ON t0e_q.FENTRYID = tt.PPBOMENTRYID --生产用料清单数量拆分表
LEFT JOIN T_PRD_PPBOMENTRY_C t0e_c ON t0e_c.FENTRYID = tt.PPBOMENTRYID
LEFT JOIN T_PRD_PPBOMENTRY_L t0e_l on t0e_l.FENTRYID = tt.PPBOMENTRYID AND t0e_l.FLOCALEID = @LCID
SELECT tt.*
,t1.FMNEMONICCODE AS 'ProMnemonicCode'--6.助记码
,t1.FNUMBER AS 'ProNumber'--8.产品编码
,t1_l.FNAME AS 'ProName'--9.产品名称
,t1_l.FSPECIFICATION AS 'ProSpecification'--10.产品规格型号
,t2_l.FNAME AS 'ProUnitName'--11.产品单位
,t3.FNUMBER AS 'MaterialNumber'--8.物料编码
,t3_l.FNAME AS 'MaterialName'--9.物料名称
,t3_l.FSPECIFICATION AS 'MaterialSpecification'--10.物料规格型号
,t4_l.FNAME AS 'MaterialUnitName'--11.物料单位
,(CASE t3.FMATERIALSRC WHEN 'A' THEN 'PLM' WHEN 'B' THEN 'ERP' ELSE '' END) AS 'Materialsrc' --15.物料来源
,t6_l.FNAME AS 'WORKSHOPNAME' --44.生产车间
,t3.FMASTERID
,t3.FUSEORGID
,t7_l.FMEMO AS 'BOMMEMO' --42.BOM备注项
,t5_l.FNAME AS 'FSTOCKNAME'
INTO #TmpTable2
FROM #TmpTable1 tt
LEFT JOIN T_BD_MATERIAL t1 ON t1.FMATERIALID = tt.ProMaterialId
LEFT JOIN T_BD_MATERIAL_L t1_l ON t1_l.FMATERIALID = tt.ProMaterialId AND t1_l.FLOCALEID = @LCID
LEFT JOIN T_BD_UNIT_L t2_l ON t2_l.FUNITID = tt.PrdUnitId AND t2_l.FLOCALEID = @LCID
LEFT JOIN T_BD_MATERIAL t3 ON t3.FMATERIALID = tt.FMATERIALID
LEFT JOIN T_BD_MATERIAL_L t3_l ON t3_l.FMATERIALID = tt.FMATERIALID AND t3_l.FLOCALEID = @LCID
LEFT JOIN T_BD_UNIT_L t4_l ON t4_l.FUNITID = tt.FUNITID AND t4_l.FLOCALEID = @LCID
LEFT JOIN T_BD_STOCK_L t5_l ON t5_l.FSTOCKID = tt.FSTOCKID AND t5_l.FLOCALEID =@LCID
LEFT JOIN T_BD_DEPARTMENT_L t6_l on t6_l.FDEPTID = tt.FWORKSHOPID AND t6_l.FLOCALEID = @LCID
LEFT JOIN T_ENG_BOMCHILD_L t7_l ON t7_l.FENTRYID = tt.FBOMENTRYID AND t7_l.FLOCALEID = @LCID
SELECT tt.*
,t1.FBASEQTY
,t2_l.FNAME AS 'ROUTENAME'
,t3e_A.FBASEINVQTY
,t3e.FBASELACKQTY AS 'FBASELACKQTY'--24.欠料
,t3e_A.FBASEONORDERQTY AS 'FBASEONORDERQTY' --25.物料在途数
,t3e_A.FPURCHASEQTY --采购在途数量
,t3e_A.FREQUISITIONQTY --采购申请在途数量
,6 AS 'LOWEST6'
,t3e_A.FREQUISITIONQTY - t3e_A.FPURCHASEQTY AS 'PR_C2PO_QTY'
,0 AS 'ToBeInspectQTY'
,0 AS 'PlanThrowInQty'
,'' AS 'PlanThrowInDate'
,'' AS 'CubicleName'
,'' AS 'OTHERMEMO'
INTO {0}
FROM #TmpTable2 tt
LEFT JOIN (
SELECT
t0.FMATERIALID
,t0.FSTOCKORGID
,sum(t0.FBASEQTY) AS FBASEQTY
FROM
T_STK_INVENTORY t0
GROUP BY
t0.FMATERIALID
,t0.FSTOCKORGID
) t1 on t1.FMATERIALID = tt.FMASTERID AND t1.FSTOCKORGID = tt.FUSEORGID
LEFT JOIN T_ENG_ROUTE_L t2_L on t2_L.FID = tt.FROUTINGID AND t2_L.FLOCALEID = @LCID
LEFT JOIN T_PRD_PMPPBOMENTRY t3e on t3e.FPPBOMENTRYID = tt.PPBOMENTRYID AND t3e.FMATERIALIDSUB = tt.FMATERIALID --AND t3e.FMATERIALID = t0.FMATERIALID
LEFT JOIN T_PRD_PMPPBOMENTRY_A t3e_A ON t3e_A.FENTRYID = t3e.FENTRYID
DROP TABLE #TmpTable0
DROP TABLE #TmpTable1
DROP TABLE #TmpTable2
""").format(tableName,_lcId,whereSql);
# raise Exception(sql);#可以通过此方法弹出Sql语句进行调试验证
DBUtils.Execute(this.Context,sql);#执行SQL将报表数据写入临时表
#构建账表列头
def GetReportHeaders(rptfilter):
header = ReportHeader();
localEid = this.Context.UserLocale.LCID;#获取当前语言环境代码,中文为2052
header.AddChild("FBILLNO", LocaleValue("生产任务单号", localEid), 0)
return header;
#报表关闭触发,通常在此处清理报表过程产生的临时表
def CloseReport():
this.DropTempTable();