From efc1bcac36eeae076a0dbf5ce9f1d387207303d2 Mon Sep 17 00:00:00 2001 From: wenlukang1 Date: Tue, 19 Aug 2025 18:22:46 +0800 Subject: [PATCH] feat: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 应收票据台账报表 --- .../BillReceivableReportFormPlugin.java | 297 +------- .../BillReceivableReportListDataPlugin.java | 641 ++++++++++++++++++ 2 files changed, 673 insertions(+), 265 deletions(-) create mode 100644 sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/report/BillReceivableReportListDataPlugin.java diff --git a/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/report/BillReceivableReportFormPlugin.java b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/report/BillReceivableReportFormPlugin.java index bb7b639..5281c89 100644 --- a/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/report/BillReceivableReportFormPlugin.java +++ b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/report/BillReceivableReportFormPlugin.java @@ -1,284 +1,51 @@ package shkd.sys.sys.plugin.report; -import kd.bos.algo.DataSet; -import kd.bos.algo.JoinType; import kd.bos.context.RequestContext; -import kd.bos.db.DB; -import kd.bos.db.DBRoute; -import kd.bos.entity.report.AbstractReportListDataPlugin; +import kd.bos.entity.datamodel.events.PropertyChangedArgs; import kd.bos.entity.report.ReportQueryParam; -import kd.bos.orm.query.QCP; +import kd.bos.form.FormShowParameter; +import kd.bos.form.control.Control; +import kd.bos.form.field.BasedataEdit; +import kd.bos.form.field.events.BeforeF7SelectEvent; +import kd.bos.form.field.events.BeforeF7SelectListener; +import kd.bos.form.field.events.BeforeFilterF7SelectEvent; +import kd.bos.list.ListShowParameter; import kd.bos.orm.query.QFilter; -import kd.bos.permission.api.HasPermOrgResult; -import kd.bos.servicehelper.QueryServiceHelper; +import kd.bos.report.plugin.AbstractReportFormPlugin; import kd.bos.servicehelper.permission.PermissionServiceHelper; -import shkd.sys.sys.plugin.report.util.ReportUtils; +import kd.sdk.plugin.Plugin; -import java.util.Arrays; -import java.util.Collections; +import java.util.EventObject; import java.util.List; /** - * 应收票据台账报表查询插件 + * 报表界面插件 */ -public class BillReceivableReportFormPlugin extends AbstractReportListDataPlugin { +public class BillReceivableReportFormPlugin extends AbstractReportFormPlugin implements Plugin, BeforeF7SelectListener { + + //有权的组织 + private static final List hasPermOrgS = PermissionServiceHelper.getUserHasPermOrgs( + RequestContext.get().getCurrUserId(),true).getHasPermOrgs(); + @Override + public void registerListener(EventObject e) { + super.registerListener(e); + BasedataEdit control = this.getControl("shkd_org"); + control.addBeforeF7SelectListener(this); + } @Override - public DataSet query(ReportQueryParam reportQueryParam, Object o) throws Throwable { - - - HasPermOrgResult userHasPermOrgS = PermissionServiceHelper.getUserHasPermOrgs( - RequestContext.get().getCurrUserId(),true); - //有权的组织 - List hasPermOrgS = userHasPermOrgS.getHasPermOrgs(); - - //票面基本信息1 - String selectFields = "id,company as shkd_skdw,bizdate as shkd_spyf,bizdate as shkd_sprq,draftbillno as shkd_pjhm," + - "supperbillamount as shkd_hpje,availableamount as shkd_kyje"; - QFilter qFilter1 = new QFilter("source", QCP.not_equals, "cdm"); - QFilter qFilter2 = new QFilter("company", QCP.in, hasPermOrgS); - DataSet draftBillData1 = QueryServiceHelper.queryDataSet(this.getClass().getSimpleName(),"cdm_receivablebill", - selectFields, new QFilter[]{qFilter1.and(qFilter2)}, null); - String[] fieldNames = draftBillData1.getRowMeta().getFieldNames(); - - //当前质押金额 - DataSet pledgeCyData = getPledgeCyData(); - String[] newFieldNames0 = ReportUtils.ExpansionArray(fieldNames, Collections.singletonList("shkd_zyje")); - - //拼接1 - DataSet finish1 = draftBillData1.join(pledgeCyData, JoinType.LEFT) - .on("id", "pjid5").select(newFieldNames0).finish(); - String[] fieldNames1 = finish1.getRowMeta().getFieldNames(); - - //票面基本信息2 - String fields2 = "id,drawername as shkd_cprqc,delivername as shkd_jprqcqs,acceptername as shkd_cdrqc," + - "issuedate as shkd_cprq, draftbillexpiredate as shkd_pjdqr"; - DataSet draftBillData2 = QueryServiceHelper.queryDataSet(this.getClass().getSimpleName(),"cdm_receivablebill", - fields2, new QFilter[]{qFilter1.and(qFilter2)}, null); - String[] draftBillData2NewFieldNames = ReportUtils.ExpansionArray(fieldNames1, - Arrays.asList("shkd_cprqc", "shkd_jprqcqs","shkd_cdrqc","shkd_cprq","shkd_pjdqr")); - - //拼接2 - DataSet finish2 = finish1.join(draftBillData2, JoinType.LEFT) - .on("id", "id").select(draftBillData2NewFieldNames).finish(); - String[] finish2FieldNames2 = finish2.getRowMeta().getFieldNames(); - - //拼接贴现、质押、质押解除、背书、托收相关字段 - String[] newFieldNames1 = ReportUtils.ExpansionArray(finish2FieldNames2, Arrays.asList("shkd_txrq", "shkd_txjg","shkd_txje")); - String[] newFieldNames2 = ReportUtils.ExpansionArray(newFieldNames1, Arrays.asList("shkd_tsrq", "shkd_tsyh","shkd_tsje")); - String[] newFieldNames3 = ReportUtils.ExpansionArray(newFieldNames2, Arrays.asList("shkd_bsrq", "shkd_bsr","shkd_bsje")); - String[] newFieldNames4 = ReportUtils.ExpansionArray(newFieldNames3, Arrays.asList("shkd_zyrq", "shkd_zyr","shkd_yzyje")); - String[] newFieldNames5 = ReportUtils.ExpansionArray(newFieldNames4, Arrays.asList("shkd_zyjcrq", "shkd_zyjcje")); - - //相关查询结果 - DataSet disCountData = getDisCountData(); - DataSet pledgeData = getPledgeData(); - DataSet rePledgeData = getRePledgeData(); - DataSet endorseData = getEndorseData(); - DataSet collectData = getCollectData(); - - //票面信息3 - DataSet draftBillData3 = QueryServiceHelper.queryDataSet(this.getClass().getSimpleName(),"cdm_receivablebill", - "id,draftbilltype.name as shkd_pjlx,description as shkd_bz", - new QFilter[]{new QFilter("source", QCP.not_equals,"cdm")}, null); - String[] newFieldNames6 = ReportUtils.ExpansionArray(newFieldNames5, Arrays.asList("shkd_pjlx","shkd_bz")); - - return finish2.join(disCountData, JoinType.LEFT) - .on("id","pjid3").select(newFieldNames1).finish() - .join(collectData, JoinType.LEFT) - .on("id","pjid1").select(newFieldNames2).finish() - .join(endorseData, JoinType.LEFT) - .on("id","pjid2").select(newFieldNames3).finish() - .join(pledgeData, JoinType.LEFT) - .on("id","pjid4").select(newFieldNames4).finish() - .join(rePledgeData, JoinType.LEFT) - .on("id","pjid6").select(newFieldNames5).finish() - .join(draftBillData3, JoinType.LEFT) - .on("id","id").select(newFieldNames6).finish(); - } - - //贴现 - private DataSet getDisCountData(){ - return DB.queryDataSet(this.getClass().getSimpleName(), DBRoute.of("fi"), - "/*dialect*/ SELECT\n" + - " pjid3,\n" + - " MAX(discountid) AS discountid,\n" + - " MAX(discounttradetype) AS discounttradetype,\n" + - " LISTAGG(TO_CHAR(bizdate, 'YYYY-MM-DD'), '\n')\n" + - " WITHIN GROUP (ORDER BY bizdate) AS shkd_txrq,\n" + - " LISTAGG(\n" + - " disfrecbodyname || ';¥' ||\n" + - " TRIM(TO_CHAR(TRUNC(discamt), 'FM999,999,999,990')) || '.' ||\n" + - " LPAD(TO_CHAR(MOD(ROUND(discamt * 100), 100)), 2, '0'),\n" + - " '\n'\n" + - " ) WITHIN GROUP (ORDER BY bizdate) AS shkd_txjg,\n" + - " SUM(discamt) AS shkd_txje\n" + - "FROM (\n" + - " SELECT\n" + - " t1.fid AS pjid3,\n" + - " t2.fid AS discountid,\n" + - " t2.ftradetype AS discounttradetype,\n" + - " t2.frecbodyname AS disfrecbodyname,\n" + - " t2.FBIZDATE AS bizdate,\n" + - " t3.fdis_discamt AS discamt\n" + - " FROM t_cdm_draftbill t1\n" + - " JOIN t_cdm_discountentry t3 ON t1.fid = t3.fdis_selectbillid\n" + - " JOIN t_cdm_drafttradebill t2 ON t2.fid = t3.fid\n" + - " WHERE t1.fsource <> 'cdm'\n" + - " AND t2.ftradetype = 'discount'\n" + - ") src\n" + - "GROUP BY pjid3;"); + public void propertyChanged(PropertyChangedArgs e) { + super.propertyChanged(e); } - //背书 - private DataSet getEndorseData() { - return DB.queryDataSet(this.getClass().getSimpleName(), DBRoute.of("fi"), - "/*dialect*/ SELECT\n" + - " pjid2,\n" + - " MAX(discountid) AS discountid,\n" + - " MAX(discounttradetype) AS discounttradetype,\n" + - " LISTAGG(TO_CHAR(bizdate, 'YYYY-MM-DD'), CHR(10))\n" + - " WITHIN GROUP (ORDER BY bizdate) AS shkd_bsrq,\n" + - " LISTAGG(\n" + - " endorsename || ';¥' ||\n" + - " TRIM(TO_CHAR(TRUNC(endorseamt), 'FM999,999,999,990')) || '.' ||\n" + - " LPAD(TO_CHAR(MOD(ROUND(endorseamt * 100), 100)), 2, '0'),\n" + - " CHR(10)\n" + - " ) WITHIN GROUP (ORDER BY bizdate) AS shkd_bsr,\n" + - " SUM(endorseamt) AS shkd_bsje\n" + - "FROM (\n" + - " SELECT\n" + - " t1.fid AS pjid2,\n" + - " t2.fid AS discountid,\n" + - " t2.ftradetype AS discounttradetype,\n" + - " t2.fbeendorsortext AS endorsename,\n" + - " t2.FBIZDATE AS bizdate,\n" + - " t3.fs_billamount AS endorseamt\n" + - " FROM t_cdm_draftbill t1\n" + - " JOIN t_cdm_drafttrdbill_entry t3 ON t1.fid = t3.fdraftbillid\n" + - " JOIN t_cdm_drafttradebill t2 ON t2.fid = t3.fid\n" + - " WHERE t1.fsource <> 'cdm'\n" + - " AND t2.ftradetype = 'endorse'\n" + - ") src\n" + - "GROUP BY pjid2;"); - } - - //托收 - private DataSet getCollectData(){ - return DB.queryDataSet(this.getClass().getSimpleName(), DBRoute.of("fi"), - "/*dialect*/ SELECT " + - " t1.fid AS pjid1," + - " t2.fid AS discountid," + - " t2.ftradetype AS discounttradetype," + - " t4.freceivername AS shkd_tsyh," + - " TO_CHAR(t2.FBIZDATE, 'YYYY-MM-DD') AS shkd_tsrq," + - " NVL(t2.fcollection, 0) AS shkd_tsje " + - " FROM t_cdm_draftbill t1" + - " LEFT JOIN t_cdm_draftbill_e t4 ON t4.fid = t1.fid" + - " LEFT JOIN t_cdm_drafttrdbill_entry t3 ON t1.fid = t3.fdraftbillid" + - " LEFT JOIN t_cdm_drafttradebill t2 ON t2.fid = t3.fid" + - " WHERE t1.fsource <> 'cdm' AND t2.ftradetype = 'collect'"); + @Override + public void beforeF7Select(BeforeF7SelectEvent beforeF7SelectEvent) { + String name = beforeF7SelectEvent.getProperty().getName(); + if (name.equals("shkd_org")) { + ListShowParameter listShowParameter = (ListShowParameter)beforeF7SelectEvent.getFormShowParameter(); + listShowParameter.getListFilterParameter().setFilter(new QFilter("id", QFilter.in, hasPermOrgS)); + } } - - //质押 - private DataSet getPledgeData(){ - return DB.queryDataSet(this.getClass().getSimpleName(), DBRoute.of("fi"), - "/*dialect*/ SELECT\n" + - " pjid4,\n" + - " MAX(t2id4) AS t2id4,\n" + - " MAX(tradetype4) AS tradetype4,\n" + - " LISTAGG(\n" + - " TO_CHAR(bizdate, 'YYYY-MM-DD'), '\n'\n" + - " ) WITHIN GROUP (ORDER BY bizdate) AS shkd_zyrq,\n" + - " LISTAGG(\n" + - " pledgename || ';¥' ||\n" + - " TRIM(TO_CHAR(TRUNC(pledgeamt), 'FM999,999,999,990')) || '.' ||\n" + - " LPAD(TO_CHAR(MOD(ROUND(pledgeamt * 100), 100)), 2, '0'),\n" + - " '\n'\n" + - " ) WITHIN GROUP (ORDER BY bizdate) AS shkd_zyr,\n" + - " SUM(pledgeamt) AS shkd_yzyje\n" + - " FROM (\n" + - " SELECT\n" + - " t1.fid AS pjid4,\n" + - " t2.fid AS t2id4,\n" + - " t2.ftradetype AS tradetype4,\n" + - " t2.fpledgeetext AS pledgename,\n" + - " t2.FBIZDATE AS bizdate,\n" + - " t3.fs_billamount AS pledgeamt\n" + - " FROM t_cdm_draftbill t1\n" + - " LEFT JOIN t_cdm_drafttrdbill_entry t3 ON t1.fid = t3.fdraftbillid\n" + - " LEFT JOIN t_cdm_drafttradebill t2 ON t2.fid = t3.fid\n" + - " WHERE t1.fsource <> 'cdm'\n" + - " AND t2.ftradetype = 'pledge'\n" + - " ) src\n" + - " GROUP BY pjid4;"); - - } - - //质押解除 - private DataSet getRePledgeData(){ - return DB.queryDataSet(this.getClass().getSimpleName(), DBRoute.of("fi"), - "/*dialect*/ SELECT \n" + - " pjid6,\n" + - " MAX(t2id6) AS t2id6,\n" + - " MAX(tradetype4) AS tradetype4,\n" + - " LISTAGG(\n" + - " TO_CHAR(bizdate, 'YYYY-MM-DD'),';' \n" + - " ) WITHIN GROUP (ORDER BY bizdate) AS shkd_zyjcrq,\n" + - " LISTAGG(\n" + - " '¥' ||\n" + - " TRIM(TO_CHAR(TRUNC(pledgeamt), 'FM999,999,999,990')) || '.' ||\n" + - " LPAD(TO_CHAR(MOD(ROUND(pledgeamt*100), 100)), 2, '0'),\n" + - " ';'\n" + - " ) WITHIN GROUP (ORDER BY bizdate) AS shkd_zyjcje\n" + - " FROM (\n" + - " SELECT \n" + - " t1.fid AS pjid6,\n" + - " t2.fid AS t2id6,\n" + - " t2.ftradetype AS tradetype4,\n" + - " t2.fpledgeetext AS pledgename,\n" + - " t2.FBIZDATE AS bizdate,\n" + - " t3.fs_billamount AS pledgeamt\n" + - " FROM t_cdm_draftbill t1\n" + - " LEFT JOIN t_cdm_drafttrdbill_entry t3 ON t1.fid = t3.fdraftbillid\n" + - " LEFT JOIN t_cdm_drafttradebill t2 ON t2.fid = t3.fid\n" + - " WHERE t1.fsource <> 'cdm' AND t2.ftradetype = 'rlspledge'\n" + - " ) src\n" + - " GROUP BY pjid6;"); - - } - - //质押金额合计-质押解除金额合计 - private DataSet getPledgeCyData(){ - return DB.queryDataSet(this.getClass().getSimpleName(), DBRoute.of("fi"), - "/*dialect*/ SELECT \n" + - " pjid5,\n" + - " MAX(CASE WHEN ftradetype = 'rlspledge' THEN fbizdate END) AS shkd_zyjcrq,\n" + - " SUM(CASE WHEN ftradetype = 'rlspledge' THEN fs_billamount ELSE 0 END) AS shkd_zyjcje,\n" + - " SUM(CASE WHEN ftradetype = 'pledge' THEN fs_billamount ELSE 0 END) AS shkd_zyjehj,\n" + - " SUM(CASE WHEN ftradetype = 'pledge' THEN fs_billamount ELSE 0 END) - " + - " SUM(CASE WHEN ftradetype = 'rlspledge' THEN fs_billamount ELSE 0 END) " + - " AS shkd_zyje\n" + - " FROM (\n" + - " SELECT \n" + - " t1.fid AS pjid5,\n" + - " t1.fbillno AS billno,\n" + - " t2.fbizdate,\n" + - " t3.fs_billamount,\n" + - " t2.ftradetype\n" + - " FROM t_cdm_draftbill t1\n" + - " LEFT JOIN t_cdm_drafttrdbill_entry t3 \n" + - " ON t1.fid = t3.fdraftbillid\n" + - " LEFT JOIN t_cdm_drafttradebill t2 \n" + - " ON t2.fid = t3.fid\n" + - " WHERE \n" + - " t1.fsource <> 'cdm' \n" + - " AND t2.ftradetype IN ('pledge', 'rlspledge')\n" + - " ) src\n" + - " GROUP BY pjid5;"); - - } - } \ No newline at end of file diff --git a/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/report/BillReceivableReportListDataPlugin.java b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/report/BillReceivableReportListDataPlugin.java new file mode 100644 index 0000000..5808e3d --- /dev/null +++ b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/report/BillReceivableReportListDataPlugin.java @@ -0,0 +1,641 @@ +package shkd.sys.sys.plugin.report; + +import kd.bos.algo.DataSet; +import kd.bos.algo.JoinType; +import kd.bos.context.RequestContext; +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.db.DB; +import kd.bos.db.DBRoute; +import kd.bos.entity.report.AbstractReportListDataPlugin; +import kd.bos.entity.report.ReportQueryParam; +import kd.bos.orm.ORM; +import kd.bos.orm.query.QCP; +import kd.bos.orm.query.QFilter; +import kd.bos.servicehelper.QueryServiceHelper; +import kd.bos.servicehelper.permission.PermissionServiceHelper; +import shkd.sys.sys.plugin.report.util.ReportUtils; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 应收票据台账报表查询插件 + */ +public class BillReceivableReportListDataPlugin extends AbstractReportListDataPlugin { + + @Override + public ReportQueryParam getQueryParam() { + return super.getQueryParam(); + } + + @Override + public DataSet query(ReportQueryParam reportQueryParam, Object o) throws Throwable { + + List hasPermOrgS = PermissionServiceHelper.getUserHasPermOrgs( + RequestContext.get().getCurrUserId(), true).getHasPermOrgs(); + QFilter qFilter1 = new QFilter("source", QCP.not_equals, "cdm"); + QFilter qFilter2 = new QFilter("company", QCP.in, hasPermOrgS); + QFilter qFilter3 = new QFilter("billstatus", QCP.equals, "C"); + QFilter qFilter0 = qFilter1.and(qFilter2).and(qFilter3); + + //票面基本信息1 + String selectFields = "id,company as shkd_skdw,bizdate as shkd_spyf,bizdate as shkd_sprq,draftbillno as shkd_pjhm," + + "supperbillamount as shkd_hpje,availableamount as shkd_kyje,drawername as shkd_cprqc,delivername as shkd_jprqcqs,acceptername as shkd_cdrqc," + + " issuedate as shkd_cprq, draftbillexpiredate as shkd_pjdqr,draftbilltype.name as shkd_pjlx,description as shkd_bz"; + + Object type = null; + Object date1 = null; + Object date2 = null; + Object date0 = null; + + //获取所有过滤控件的值 + List listQFilter = ReportUtils.getListQFilter(reportQueryParam); + for (QFilter qFilter : listQFilter) { + switch (qFilter.getProperty()) { + case "shkd_org": + if (Objects.nonNull(qFilter.getValue())) { + DynamicObject org = (DynamicObject) qFilter.getValue(); + qFilter0 = qFilter0.and(new QFilter("company", QCP.equals, org.get("id"))); + } + break; + case "shkd_type": + if (Objects.nonNull(qFilter.getValue())) { + type = qFilter.getValue(); + } + break; + case "shkd_date1": + if (Objects.nonNull(qFilter.getValue())) { + date1 = qFilter.getValue(); + } + break; + case "shkd_date2": + if (Objects.nonNull(qFilter.getValue())) { + date2 = qFilter.getValue(); + } + break; + case "shkd_date0": + if (Objects.nonNull(qFilter.getValue())) { + date0 = qFilter.getValue(); + } + break; + default: + break; + } + } + // 主表按收票月份过滤 + if (date1 != null) { + qFilter0 = qFilter0.and(createDateRangeFilter(date1)); + } + // 主表所有满足基本过滤条件的数据 + DataSet draftBillData1 = QueryServiceHelper.queryDataSet(this.getClass().getSimpleName(), "cdm_receivablebill", + selectFields, new QFilter[]{qFilter0}, null); + String[] fieldNames = draftBillData1.getRowMeta().getFieldNames(); + List pjid0 = ORM.create().toPlainDynamicObjectCollection(draftBillData1.copy()).stream() + .map(obj -> obj.getString("id")).collect(Collectors.toList()); + + // 业务处理月 + String date2String = getYearMonth(date2); + //主表数据的基础上查询其子表数据 + DataSet disCountData = getDisCountData(date2String, null); + DataSet pledgeData = getPledgeData(date2String, null); + DataSet rePledgeData = getRePledgeData(date2String, null); + DataSet endorseData = getEndorseData(date2String, null); + DataSet collectData = getCollectData(date2String, null); + + //当前质押金额 + DataSet pledgeCyData = getPledgeCyData(); + String[] newFieldNames0 = ReportUtils.ExpansionArray(fieldNames, Collections.singletonList("shkd_zyje")); + //拼接1 + DataSet finish1 = draftBillData1.join(pledgeCyData, JoinType.LEFT) + .on("id", "pjid5").select(newFieldNames0).finish(); + String[] fieldNames1 = finish1.getRowMeta().getFieldNames(); + + //拼接贴现、质押、质押解除、背书、托收相关字段 + String[] newFieldNames1 = ReportUtils.ExpansionArray(fieldNames1, Arrays.asList("pjid3", "shkd_txrq", "shkd_txjg", "shkd_txlx", "shkd_txje", "shkd_txhk")); + String[] newFieldNames2 = ReportUtils.ExpansionArray(newFieldNames1, Arrays.asList("pjid1", "shkd_tsrq", "shkd_tsyh", "shkd_tsje")); + String[] newFieldNames3 = ReportUtils.ExpansionArray(newFieldNames2, Arrays.asList("pjid2", "shkd_bsrq", "shkd_bsr", "shkd_bsje")); + String[] newFieldNames4 = ReportUtils.ExpansionArray(newFieldNames3, Arrays.asList("pjid4", "shkd_zyrq", "shkd_zyr", "shkd_yzyje")); + String[] newFieldNames5 = ReportUtils.ExpansionArray(newFieldNames4, Arrays.asList("pjid6", "shkd_zyjcrq", "shkd_zyjcje")); + + //所有数据 + DataSet result = finish1.join(disCountData, JoinType.LEFT) + .on("id", "pjid3").select(newFieldNames1).finish() + .join(collectData, JoinType.LEFT) + .on("id", "pjid1").select(newFieldNames2).finish() + .join(endorseData, JoinType.LEFT) + .on("id", "pjid2").select(newFieldNames3).finish() + .join(pledgeData, JoinType.LEFT) + .on("id", "pjid4").select(newFieldNames4).finish() + .join(rePledgeData, JoinType.LEFT) + .on("id", "pjid6").select(newFieldNames5).finish(); + + + //所有满足条件的票据id集合 + List idLists = new ArrayList<>(); + + // 业务发生月取收票月份+业务处理月份的数据 + String date0String = getYearMonth(date0); + //1、业务发生月——业务处理月 + DataSet disCountData1 = getDisCountData(date2String, date0String); + List pjid3 = ORM.create().toPlainDynamicObjectCollection(disCountData1.copy()).stream() + .map(obj -> obj.getString("pjid3")).collect(Collectors.toList()); + DataSet pledgeData1 = getPledgeData(date2String, date0String); + List pjid4 = ORM.create().toPlainDynamicObjectCollection(pledgeData1.copy()).stream() + .map(obj -> obj.getString("pjid4")).collect(Collectors.toList()); + DataSet rePledgeData1 = getRePledgeData(date2String, date0String); + List pjid6 = ORM.create().toPlainDynamicObjectCollection(rePledgeData1.copy()).stream() + .map(obj -> obj.getString("pjid6")).collect(Collectors.toList()); + DataSet endorseData1 = getEndorseData(date2String, date0String); + List pjid2 = ORM.create().toPlainDynamicObjectCollection(endorseData1.copy()).stream() + .map(obj -> obj.getString("pjid2")).collect(Collectors.toList()); + DataSet collectData1 = getCollectData(date2String, date0String); + List pjid1 = ORM.create().toPlainDynamicObjectCollection(collectData1.copy()).stream() + .map(obj -> obj.getString("pjid1")).collect(Collectors.toList()); + pjid4.addAll(pjid6); + + // 实现date0、date1、date2的独立和组合过滤 + idLists = new ArrayList<>(); + + // 判断是否有日期过滤条件 + boolean hasDateFilter = (date0 != null || date1 != null || date2 != null); + + if (hasDateFilter) { + Set finalIds = new HashSet<>(); + boolean needIntersection = (date0 != null && date2 != null); + + // 处理业务处理月 (date2) - 子表业务数据 + if (needIntersection) { + // 当需要交集时,先收集业务处理月的票据 + Set processIds = new HashSet<>(); + processIds.addAll(pjid3); // 贴现 + processIds.addAll(pjid1); // 托收 + processIds.addAll(pjid2); // 背书 + processIds.addAll(pjid4); // 质押和质押解除 + finalIds.addAll(processIds); + } else if(date0 != null || date2 != null){ + // 不需要交集时,直接添加 + idLists.addAll(pjid3); // 贴现 + idLists.addAll(pjid1); // 托收 + idLists.addAll(pjid2); // 背书 + idLists.addAll(pjid4); // 质押和质押解除 + } + + // 处理业务发生月 (date0) - 主表数据 + if (date0 != null) { + // 查询满足业务发生月条件的票据 + QFilter tempFilter = qFilter0.and(createDateRangeFilter(date0)); + DataSet draftBillDataFilter = QueryServiceHelper.queryDataSet(this.getClass().getSimpleName(), + "cdm_receivablebill", selectFields, new QFilter[]{tempFilter}, null); + List pjid0Biz = ORM.create().toPlainDynamicObjectCollection(draftBillDataFilter.copy()).stream() + .map(obj -> obj.getString("id")).collect(Collectors.toList()); + + if (needIntersection) { + // 当需要交集时,取与已有ID的交集 + if (finalIds.isEmpty()) { + finalIds.addAll(pjid0Biz); + } else { + finalIds.retainAll(pjid0Biz); + } + } else { + // 不需要交集时,直接添加 + idLists.addAll(pjid0Biz); + } + } + + // 如果需要交集,使用交集结果 + if (needIntersection && !finalIds.isEmpty()) { + idLists = new ArrayList<>(finalIds); + } + // 去重并应用过滤 + if (!idLists.isEmpty()) { + List uniqueIds = idLists.stream().distinct().collect(Collectors.toList()); + String ids = String.join(",", uniqueIds); + result = result.where("id in(" + ids + ")"); + } + + } else { + // 没有任何日期过滤条件时,显示所有主表数据 + idLists.addAll(pjid0); + if (!idLists.isEmpty()) { + List uniqueIds = idLists.stream().distinct().collect(Collectors.toList()); + String ids = String.join(",", uniqueIds); + result = result.where("id in(" + ids + ")"); + } + } + + if (type != null) { + String typeStr = type.toString(); + // 去除首尾逗号并按逗号分割 + String[] typeArray = typeStr.replaceFirst("^,", "").replaceFirst(",$", "").split(","); + // 处理type值,将其转换为列表形式 + List typeList = Arrays.asList(typeArray); + if (!typeList.isEmpty()){ + //根据type值往typeList中添加的票据id实现type过滤 + idLists = new ArrayList<>(); + if (typeList.contains("1")) idLists.addAll(pjid3); + if (typeList.contains("2")) idLists.addAll(pjid1); + if (typeList.contains("3")) idLists.addAll(pjid2); + if (typeList.contains("4")) idLists.addAll(pjid4); + //最终筛选,type不为空时,根据type进行筛选,type为空时,根据所有票据id进行筛选 + if (!idLists.isEmpty()) { + List collect = idLists.stream().distinct().collect(Collectors.toList()); + String ids = String.join(",", collect); + result = result.where("id in(" + ids + ")"); + } + } + } + + return result; + } + + /** + * 获取指定日期的年月字符串 + * + * @param date 输入的日期对象,可以为null + * @return 返回格式为"yyyy-MM"的年月字符串,如果输入为null则返回null + */ + private String getYearMonth(Object date) { + if (date == null) { + return null; + } + java.util.Calendar cal = java.util.Calendar.getInstance(); + cal.setTime((java.util.Date) date); + // 获取年份和月份 + int year = cal.get(java.util.Calendar.YEAR); + int month = cal.get(java.util.Calendar.MONTH) + 1; // Calendar中的月份从0开始,需要加1 + // 构造该月的第一天和最后一天 + return String.format("%04d-%02d", year, month); + } + + + /** + * 创建日期范围过滤器 + * + * @param date 日期对象,用于确定年月范围 + * @return QFilter 日期范围过滤器,包含指定月份的开始和结束日期条件 + */ + private QFilter createDateRangeFilter(Object date) { + String yearMonth = getYearMonth(date); + String startDate = yearMonth + "-01"; // 月份第一天 + + if (String.valueOf(date).contains(":")) { + startDate = yearMonth + "-01 00:00:00.000"; // 月份第一天 + } + String endDate = getMonthEndDateString(yearMonth); // 月份最后一天 + + // 构造日期范围条件:大于上月的最后一天(即大于等于本月第一天) + QFilter dateFilter1 = new QFilter("bizdate", QCP.large_equals, startDate); + // 构造日期范围条件:小于下月的第一天(即小于等于本月最后一天的下一天) + QFilter dateFilter2 = new QFilter("bizdate", QCP.less_than, getNextDay(endDate)); + // 构造日期范围条件:大于上月的最后一天(即大于等于本月第一天) + return dateFilter1.and(dateFilter2); + } + + + /** + * 获取指定日期的前一天 + * + * @param dateStr 输入的日期字符串 + * @return 返回前一天的日期字符串,如果解析失败则返回原字符串 + */ + private String getPrevDay(String dateStr) { + try { + // 根据输入格式自动判断 + String pattern = getInputDateFormatPattern(dateStr); + java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(pattern); + + java.util.Date date = sdf.parse(dateStr); + java.util.Calendar cal = java.util.Calendar.getInstance(); + cal.setTime(date); + // 计算前一天日期 + cal.add(java.util.Calendar.DAY_OF_MONTH, -1); + + return sdf.format(cal.getTime()); + } catch (Exception e) { + return dateStr; + } + } + + + /** + * 获取指定日期的后一天 + * + * @param dateStr 输入的日期字符串 + * @return 返回指定日期的后一天日期字符串,如果解析失败则返回原字符串 + */ + private String getNextDay(String dateStr) { + try { + // 根据输入格式自动判断日期格式模式 + String pattern = getInputDateFormatPattern(dateStr); + java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(pattern); + + // 解析日期并加一天 + java.util.Date date = sdf.parse(dateStr); + java.util.Calendar cal = java.util.Calendar.getInstance(); + cal.setTime(date); + cal.add(java.util.Calendar.DAY_OF_MONTH, 1); + + return sdf.format(cal.getTime()); + } catch (Exception e) { + return dateStr; + } + } + + + /** + * 计算指定月份的最后一天 + * + * @param yearMonth 年月字符串,格式为 "yyyy-MM" + * @return 指定月份的最后一天,格式为 "yyyy-MM-dd" + */ + private String getMonthEndDateString(String yearMonth) { + try { + if (yearMonth == null || yearMonth.isEmpty()) { + return yearMonth; + } + + // 解析年月字符串 + String[] parts = yearMonth.split("-"); + int year = Integer.parseInt(parts[0]); + int month = Integer.parseInt(parts[1]); + + // 计算下一月的第一天,然后减去一天得到当前月的最后一天 + java.util.Calendar cal = java.util.Calendar.getInstance(); + cal.set(year, month - 1, 1); // month在Calendar中是从0开始的 + cal.add(java.util.Calendar.MONTH, 1); + cal.add(java.util.Calendar.DAY_OF_MONTH, -1); + + int lastDay = cal.get(java.util.Calendar.DAY_OF_MONTH); + return String.format("%04d-%02d-%02d", year, month, lastDay); + } catch (Exception e) { + // 出错时返回原日期加上-31作为默认值 + return yearMonth + "-31"; + } + } + + + /** + * 根据输入字符串判断日期格式 + * + * @param dateStr 日期字符串 + * @return 对应的日期格式模式 + */ + private String getInputDateFormatPattern(String dateStr) { + if (dateStr == null || dateStr.isEmpty()) { + return "yyyy-MM"; + } + + // 根据字符串特征判断格式 + if (dateStr.contains(":")) { + // 包含时间部分 + if (dateStr.contains(".")) { + // 包含毫秒 + return "yyyy-MM-dd HH:mm:ss.SSS"; + } else { + // 不包含毫秒 + return "yyyy-MM-dd HH:mm:ss"; + } + } else if (dateStr.contains("-")) { + // 只包含日期部分 + String[] parts = dateStr.split("-"); + if (parts.length == 3) { + // yyyy-MM-dd格式 + return "yyyy-MM-dd"; + } else { + // yyyy-MM格式 + return "yyyy-MM"; + } + } else { + // 默认格式 + return "yyyy-MM"; + } + } + + + //贴现 + private DataSet getDisCountData(Object date, Object date0String) { + StringBuilder sql = new StringBuilder(); + sql.append("/*dialect*/ SELECT ") + .append(" pjid3,\n") + .append(" MAX(discountid) AS discountid,\n") + .append(" MAX(discounttradetype) AS discounttradetype,\n") + .append(" LISTAGG(TO_CHAR(bizdate, 'YYYY-MM-DD'), char(10))\n") + .append(" WITHIN GROUP (ORDER BY bizdate) AS shkd_txrq,\n") + .append(" LISTAGG(\n") + .append(" disfrecbodyname ,\n") + .append(" char(10)\n") + .append(" ) WITHIN GROUP (ORDER BY bizdate) AS shkd_txjg,\n") + .append(" SUM(disinterest) AS shkd_txlx,\n") + .append(" SUM(disamount) AS shkd_txje,\n") + .append(" SUM(discamt) AS shkd_txhk\n") + .append(" FROM (\n") + .append(" SELECT\n") + .append(" t1.fid AS pjid3,\n") + .append(" t2.fid AS discountid,\n") + .append(" t2.ftradetype AS discounttradetype,\n") + .append(" t2.frecbodyname AS disfrecbodyname,\n") + .append(" t2.FBIZDATE AS bizdate,\n") + .append(" t2.fdiscamt AS discamt,\n") + .append(" t3.fdis_interest AS disinterest,\n") + .append(" t2.famount AS disamount\n") + .append(" FROM t_cdm_draftbill t1\n") + .append(" JOIN t_cdm_discountentry t3 ON t1.fid = t3.fdis_selectbillid\n") + .append(" JOIN t_cdm_drafttradebill t2 ON t2.fid = t3.fid\n") + .append(" WHERE t1.fsource <> 'cdm'\n") + .append(" AND t2.ftradetype = 'discount' AND t2.fbillstatus = 'C'\n"); + + addDateFilter(date, date0String, sql); + + sql.append(" ) src\n") + .append(" GROUP BY pjid3;"); + + return DB.queryDataSet(this.getClass().getSimpleName(), DBRoute.of("fi"), sql.toString()); + } + + //背书 + private DataSet getEndorseData(Object date, Object date0String) { + StringBuilder sql = new StringBuilder(); + sql.append("/*dialect*/ SELECT\n") + .append(" pjid2,\n") + .append(" MAX(discountid) AS discountid,\n") + .append(" MAX(discounttradetype) AS discounttradetype,\n") + .append(" LISTAGG(TO_CHAR(bizdate, 'YYYY-MM-DD'), CHR(10))\n") + .append(" WITHIN GROUP (ORDER BY bizdate) AS shkd_bsrq,\n") + .append(" LISTAGG(\n") + .append(" endorsename || ';¥' ||\n") + .append(" TRIM(TO_CHAR(TRUNC(endorseamt), 'FM999,999,999,990')) || '.' ||\n") + .append(" LPAD(TO_CHAR(MOD(ROUND(endorseamt * 100), 100)), 2, '0'),\n") + .append(" CHR(10)\n") + .append(" ) WITHIN GROUP (ORDER BY bizdate) AS shkd_bsr,\n") + .append(" SUM(endorseamt) AS shkd_bsje\n") + .append(" FROM (\n") + .append(" SELECT\n") + .append(" t1.fid AS pjid2,\n") + .append(" t2.fid AS discountid,\n") + .append(" t2.ftradetype AS discounttradetype,\n") + .append(" t2.fbeendorsortext AS endorsename,\n") + .append(" t2.FBIZDATE AS bizdate,\n") + .append(" t3.fs_billamount AS endorseamt\n") + .append(" FROM t_cdm_draftbill t1\n") + .append(" JOIN t_cdm_drafttrdbill_entry t3 ON t1.fid = t3.fdraftbillid\n") + .append(" JOIN t_cdm_drafttradebill t2 ON t2.fid = t3.fid\n") + .append(" WHERE t1.fsource <> 'cdm'\n") + .append(" AND t2.ftradetype = 'endorse' AND t2.fbillstatus = 'C'\n"); + + addDateFilter(date, date0String, sql); + + sql.append(" ) src\n") + .append(" GROUP BY pjid2;"); + + return DB.queryDataSet(this.getClass().getSimpleName(), DBRoute.of("fi"), sql.toString()); + } + + //托收 + private DataSet getCollectData(Object date, Object date0String) { + StringBuilder sql = new StringBuilder(); + sql.append("/*dialect*/ SELECT ") + .append(" t1.fid AS pjid1,") + .append(" t2.fid AS discountid,") + .append(" t2.ftradetype AS discounttradetype,") + .append(" t2.frecbodyname AS shkd_tsyh,") + .append(" TO_CHAR(t2.FBIZDATE, 'YYYY-MM-DD') AS shkd_tsrq,") + .append(" NVL(t2.fcollection, 0) AS shkd_tsje ") + .append(" FROM t_cdm_draftbill t1") + .append(" LEFT JOIN t_cdm_draftbill_e t4 ON t4.fid = t1.fid") + .append(" LEFT JOIN t_cdm_drafttrdbill_entry t3 ON t1.fid = t3.fdraftbillid") + .append(" LEFT JOIN t_cdm_drafttradebill t2 ON t2.fid = t3.fid") + .append(" WHERE t1.fsource <> 'cdm' AND t2.ftradetype = 'collect' AND t2.fbillstatus = 'C'"); + + addDateFilter(date, date0String, sql); + + return DB.queryDataSet(this.getClass().getSimpleName(), DBRoute.of("fi"), sql.toString()); + } + + //质押 + private DataSet getPledgeData(Object date, Object date0String) { + StringBuilder sql = new StringBuilder(); + sql.append("/*dialect*/ SELECT\n") + .append(" pjid4,\n") + .append(" MAX(t2id4) AS t2id4,\n") + .append(" MAX(tradetype4) AS tradetype4,\n") + .append(" LISTAGG(\n") + .append(" TO_CHAR(bizdate, 'YYYY-MM-DD'), '\n'\n") + .append(" ) WITHIN GROUP (ORDER BY bizdate) AS shkd_zyrq,\n") + .append(" LISTAGG(\n") + .append(" pledgename || ';¥' ||\n") + .append(" TRIM(TO_CHAR(TRUNC(pledgeamt), 'FM999,999,999,990')) || '.' ||\n") + .append(" LPAD(TO_CHAR(MOD(ROUND(pledgeamt * 100), 100)), 2, '0'),\n") + .append(" '\n'\n") + .append(" ) WITHIN GROUP (ORDER BY bizdate) AS shkd_zyr,\n") + .append(" SUM(pledgeamt) AS shkd_yzyje\n") + .append(" FROM (\n") + .append(" SELECT\n") + .append(" t1.fid AS pjid4,\n") + .append(" t2.fid AS t2id4,\n") + .append(" t2.ftradetype AS tradetype4,\n") + .append(" t2.fpledgeetext AS pledgename,\n") + .append(" t2.FBIZDATE AS bizdate,\n") + .append(" t3.fs_billamount AS pledgeamt\n") + .append(" FROM t_cdm_draftbill t1\n") + .append(" LEFT JOIN t_cdm_drafttrdbill_entry t3 ON t1.fid = t3.fdraftbillid\n") + .append(" LEFT JOIN t_cdm_drafttradebill t2 ON t2.fid = t3.fid\n") + .append(" WHERE t1.fsource <> 'cdm'\n") + .append(" AND t2.ftradetype = 'pledge' AND t2.fbillstatus = 'C'\n"); + + addDateFilter(date, date0String, sql); + + sql.append(" ) src\n") + .append(" GROUP BY pjid4;"); + + return DB.queryDataSet(this.getClass().getSimpleName(), DBRoute.of("fi"), sql.toString()); + } + + //质押解除 + private DataSet getRePledgeData(Object date, Object date0String) { + StringBuilder sql = new StringBuilder(); + sql.append("/*dialect*/ SELECT \n") + .append(" pjid6,\n") + .append(" MAX(t2id6) AS t2id6,\n") + .append(" MAX(tradetype4) AS tradetype4,\n") + .append(" LISTAGG(\n") + .append(" TO_CHAR(bizdate, 'YYYY-MM-DD'),';' \n") + .append(" ) WITHIN GROUP (ORDER BY bizdate) AS shkd_zyjcrq,\n") + .append(" LISTAGG(\n") + .append(" '¥' ||\n") + .append(" TRIM(TO_CHAR(TRUNC(pledgeamt), 'FM999,999,999,990')) || '.' ||\n") + .append(" LPAD(TO_CHAR(MOD(ROUND(pledgeamt*100), 100)), 2, '0'),\n") + .append(" ';'\n") + .append(" ) WITHIN GROUP (ORDER BY bizdate) AS shkd_zyjcje\n") + .append(" FROM (\n") + .append(" SELECT \n") + .append(" t1.fid AS pjid6,\n") + .append(" t2.fid AS t2id6,\n") + .append(" t2.ftradetype AS tradetype4,\n") + .append(" t2.fpledgeetext AS pledgename,\n") + .append(" t2.FBIZDATE AS bizdate,\n") + .append(" t3.fs_billamount AS pledgeamt\n") + .append(" FROM t_cdm_draftbill t1\n") + .append(" LEFT JOIN t_cdm_drafttrdbill_entry t3 ON t1.fid = t3.fdraftbillid\n") + .append(" LEFT JOIN t_cdm_drafttradebill t2 ON t2.fid = t3.fid\n") + .append(" WHERE t1.fsource <> 'cdm' AND t2.ftradetype = 'rlspledge' AND t2.fbillstatus = 'C'\n"); + + addDateFilter(date, date0String, sql); + + sql.append(" ) src\n") + .append(" GROUP BY pjid6;"); + + return DB.queryDataSet(this.getClass().getSimpleName(), DBRoute.of("fi"), sql.toString()); + } + + //质押金额合计-质押解除金额合计 + private DataSet getPledgeCyData() { + + String sql = "/*dialect*/ SELECT \n" + + " pjid5,\n" + + " MAX(CASE WHEN ftradetype = 'rlspledge' THEN fbizdate END) AS shkd_zyjcrq,\n" + + " SUM(CASE WHEN ftradetype = 'rlspledge' THEN fs_billamount ELSE 0 END) AS shkd_zyjcje,\n" + + " SUM(CASE WHEN ftradetype = 'pledge' THEN fs_billamount ELSE 0 END) AS shkd_zyjehj,\n" + + " SUM(CASE WHEN ftradetype = 'pledge' THEN fs_billamount ELSE 0 END) - " + + " SUM(CASE WHEN ftradetype = 'rlspledge' THEN fs_billamount ELSE 0 END) " + + " AS shkd_zyje\n" + + " FROM (\n" + + " SELECT \n" + + " t1.fid AS pjid5,\n" + + " t1.fbillno AS billno,\n" + + " t2.fbizdate,\n" + + " t3.fs_billamount,\n" + + " t2.ftradetype\n" + + " FROM t_cdm_draftbill t1\n" + + " LEFT JOIN t_cdm_drafttrdbill_entry t3 \n" + + " ON t1.fid = t3.fdraftbillid\n" + + " LEFT JOIN t_cdm_drafttradebill t2 \n" + + " ON t2.fid = t3.fid\n" + + " WHERE \n" + + " t1.fsource <> 'cdm' \n" + + " AND t2.ftradetype IN ('pledge', 'rlspledge') AND t2.fbillstatus = 'C'\n" + + " ) src\n" + + " GROUP BY pjid5;"; + + return DB.queryDataSet(this.getClass().getSimpleName(), DBRoute.of("fi"), sql); + } + + /** + * 添加日期过滤条件到SQL语句中 + * + * @param date 业务处理月份 + * @param date0String 业务发生月 + * @param sql SQL语句构建器,用于拼接过滤条件 + */ + private void addDateFilter(Object date, Object date0String, StringBuilder sql) { + if (date0String != null && date == null) { + sql.append(" AND TO_CHAR(t2.FBIZDATE, 'YYYY-MM') = '").append(date0String).append("'\n"); + } else if (date != null && date0String == null) { + sql.append(" AND TO_CHAR(t2.FBIZDATE, 'YYYY-MM') = '").append(date).append("'\n"); + } else if (date != null) { + sql.append(" AND TO_CHAR(t2.FBIZDATE, 'YYYY-MM') = '").append(date).append("'\n"); + sql.append(" AND TO_CHAR(t2.FBIZDATE, 'YYYY-MM') = '").append(date0String).append("'\n"); + } + } + + +} \ No newline at end of file