parent
							
								
									b6e3f7f8cb
								
							
						
					
					
						commit
						efc1bcac36
					
				| 
						 | 
				
			
			@ -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<Long> 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<Long> 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;");
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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<Long> 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<QFilter> 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<String> 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<String> idLists = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
        // 业务发生月取收票月份+业务处理月份的数据
 | 
			
		||||
        String date0String = getYearMonth(date0);
 | 
			
		||||
        //1、业务发生月——业务处理月
 | 
			
		||||
        DataSet disCountData1 = getDisCountData(date2String, date0String);
 | 
			
		||||
        List<String> pjid3 = ORM.create().toPlainDynamicObjectCollection(disCountData1.copy()).stream()
 | 
			
		||||
                .map(obj -> obj.getString("pjid3")).collect(Collectors.toList());
 | 
			
		||||
        DataSet pledgeData1 = getPledgeData(date2String, date0String);
 | 
			
		||||
        List<String> pjid4 = ORM.create().toPlainDynamicObjectCollection(pledgeData1.copy()).stream()
 | 
			
		||||
                .map(obj -> obj.getString("pjid4")).collect(Collectors.toList());
 | 
			
		||||
        DataSet rePledgeData1 = getRePledgeData(date2String, date0String);
 | 
			
		||||
        List<String> pjid6 = ORM.create().toPlainDynamicObjectCollection(rePledgeData1.copy()).stream()
 | 
			
		||||
                .map(obj -> obj.getString("pjid6")).collect(Collectors.toList());
 | 
			
		||||
        DataSet endorseData1 = getEndorseData(date2String, date0String);
 | 
			
		||||
        List<String> pjid2 = ORM.create().toPlainDynamicObjectCollection(endorseData1.copy()).stream()
 | 
			
		||||
                .map(obj -> obj.getString("pjid2")).collect(Collectors.toList());
 | 
			
		||||
        DataSet collectData1 = getCollectData(date2String, date0String);
 | 
			
		||||
        List<String> 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<String> finalIds = new HashSet<>();
 | 
			
		||||
            boolean needIntersection = (date0 != null && date2 != null);
 | 
			
		||||
 | 
			
		||||
            // 处理业务处理月 (date2) - 子表业务数据
 | 
			
		||||
            if (needIntersection) {
 | 
			
		||||
                // 当需要交集时,先收集业务处理月的票据
 | 
			
		||||
                Set<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue