diff --git a/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/report/PlanReportPlugin.java b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/report/PlanReportPlugin.java new file mode 100644 index 0000000..66b45b6 --- /dev/null +++ b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/report/PlanReportPlugin.java @@ -0,0 +1,194 @@ +package shkd.sys.sys.plugin.report; + +import kd.bos.algo.DataSet; +import kd.bos.algo.JoinDataSet; +import kd.bos.algo.JoinType; +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.dataentity.entity.DynamicObjectCollection; +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.BusinessDataServiceHelper; +import shkd.sys.sys.plugin.report.util.ReportUtils; + +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * @FileName PlanReportPlugin + * @Description 计划编制报表 + * @Author csx + * @date 2025-11-14 + **/ +public class PlanReportPlugin extends AbstractReportListDataPlugin { + + //明细字段对应的字段名 + public static final Map zdm = new HashMap() {{ + put("金融机构", "fbankcateid"); + put("存量金融债务余额", "fdetailext12"); + put("有效授信(流贷)", "fdetailext13"); + put("提前还款", "fdetailext15"); + put("到期还款", "fdetailext16"); + put("续贷", "fdetailext17"); + put("新增融资", "fdetailext18"); + put("预计存量金融债务余额", "fdetailext20"); + }}; + + private static final String DANGYUE_SELECT = "fbillno," + + "fstartdate_yyyyMM as dangyueqijian," + + "fbankcateid as shkd_jrjg," + + "total_fdetailext12 as shkd_cljrzwye," + + "total_fdetailext13 as shkd_yxsx," + + "total_fdetailext15 as shkd_dytqhk," + + "total_fdetailext16 as shkd_dydqhk," + + "total_fdetailext17 as shkd_dyxd," + + "total_fdetailext18 as shkd_dyxzrz," + + "total_fdetailext20 as shkd_dyyjcljrzwye"; + + private static final String XIAYUE_SELECT = "" + + "fstartdate_yyyyMM as xiayueqijian," + + "fbankcateid as fbankcateid," + + "total_fdetailext15 as shkd_xytqhk," + + "total_fdetailext16 as shkd_xydqhk," + + "total_fdetailext17 as shkd_xyxd," + + "total_fdetailext18 as shkd_xyxzrz," + + "total_fdetailext20 as shkd_xyyjcljrzwye"; + + @Override + public DataSet query(ReportQueryParam reportQueryParam, Object o) throws Throwable { + List listQFilter = ReportUtils.getListQFilter(reportQueryParam); + Date date = new Date(); + + for (QFilter filter : listQFilter) { + if (filter.getProperty().contains("shkd_date")) { + date= (Date) filter.getValue(); + } + } + //获取当月日期范围 + Map dangyue = getMonthStartAndEnd(date); + Date date1 = getnextMonth(date); + //获取上月日期范围 + Map xiayueyue = getMonthStartAndEnd(date1); + //获取计划编制里的融资计划 + QFilter qFilter = new QFilter("name", QCP.equals, "融资计划"); + DynamicObject fpm_report = BusinessDataServiceHelper.loadSingle("fpm_report", qFilter.toArray()); + long id = fpm_report.getLong("id"); + + StringBuilder dangyuesqlBuilder=getsql(id,zdm,dangyue); + DataSet dangyueres = DB.queryDataSet(this.getClass().getSimpleName(), DBRoute.of("fi"), dangyuesqlBuilder.toString());//财务云 + dangyueres= dangyueres.select(DANGYUE_SELECT); + + StringBuilder xiayueyuesqlBuilder=getsql(id,zdm,xiayueyue); + DataSet xiayueyueres = DB.queryDataSet(this.getClass().getSimpleName(), DBRoute.of("fi"), xiayueyuesqlBuilder.toString());//财务云 + xiayueyueres= xiayueyueres.select(XIAYUE_SELECT); + + + String[] fieldNames = dangyueres.getRowMeta().getFieldNames(); + String[] fieldNames1 = xiayueyueres.getRowMeta().getFieldNames(); + // 创建一个新的 ArrayList 来合并 + List mergedList = new ArrayList<>(); + mergedList.addAll(Arrays.asList(fieldNames)); + mergedList.addAll(Arrays.asList(fieldNames1)); + // 将合并后的 List 转回数组 + String[] mergedFieldNames = mergedList.toArray(new String[0]); + + JoinDataSet join = dangyueres.join(xiayueyueres, JoinType.LEFT); + DataSet finish = join.on("shkd_jrjg", "fbankcateid").select(mergedFieldNames).finish(); + //小计 + finish=finish.addField("(case when shkd_dyxd!=null then shkd_dyxd else 0 end)+(case when shkd_dyxzrz!=null then shkd_dyxzrz else 0 end)-(case when shkd_dytqhk!=null then shkd_dytqhk else 0 end)-(case when shkd_dydqhk!=null then shkd_dydqhk else 0 end)","shkd_dyxj"); + finish=finish.addField("(case when shkd_xyxd!=null then shkd_xyxd else 0 end)+(case when shkd_xyxzrz!=null then shkd_xyxzrz else 0 end)-(case when shkd_xytqhk!=null then shkd_xytqhk else 0 end)-(case when shkd_xydqhk!=null then shkd_xydqhk else 0 end)","shkd_xyxj"); + //到期债务 + finish=finish.addField("(case when shkd_dytqhk!=null then shkd_dytqhk else 0 end)+(case when shkd_dydqhk!=null then shkd_dydqhk else 0 end)","shkd_dydqzw"); + finish=finish.addField("(case when shkd_xytqhk!=null then shkd_xytqhk else 0 end)+(case when shkd_xydqhk!=null then shkd_xydqhk else 0 end)","shkd_dydqzw"); + //预计存量金融债务余额 + finish=finish.addField("(case when shkd_cljrzwye!=null then shkd_cljrzwye else 0 end)+(case when shkd_dyxj!=null then shkd_dyxj else 0 end)","shkd_dyyjcljrzwye"); + finish=finish.addField("(case when shkd_dyyjcljrzwye!=null then shkd_dyyjcljrzwye else 0 end)+(case when shkd_xyxj!=null then shkd_xyxj else 0 end)","shkd_xyyjcljrzwye"); + DynamicObjectCollection srcCollection = ORM.create().toPlainDynamicObjectCollection(finish.copy()); + return finish; + } + + private StringBuilder getsql(long id, Map zdm, Map dateMap) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + String start = sdf.format(dateMap.get("start")); + String end = sdf.format(dateMap.get("end")); + StringBuilder sqlBuilder = new StringBuilder("/*dialect*/ "); + sqlBuilder.append("" + + "//合计\n" + + "SELECT\n" + + "t1.fbillno as fbillno,\n" + + " DATE_FORMAT(t4.fstartdate, '%Y%m') AS fstartdate_yyyyMM, -- 按照年月分组\n" + + " t2.fbankcateid as fbankcateid, -- 金融机构\n" + + " SUM(t2."+zdm.get("存量金融债务余额")+") AS total_fdetailext12, -- 存量金融债务余额总和\n" + + " SUM(t2."+zdm.get("有效授信(流贷)")+") AS total_fdetailext13, -- 有效授信总和(流贷)\n" + + " SUM(t2."+zdm.get("提前还款")+") AS total_fdetailext15, -- 提前还款总和\n" + + " SUM(t2."+zdm.get("到期还款")+") AS total_fdetailext16, -- 到期还款总和\n" + + " SUM(t2."+zdm.get("续贷")+") AS total_fdetailext17, -- 续贷总和\n" + + " SUM(t2."+zdm.get("新增融资")+") AS total_fdetailext18, -- 新增融资总和\n" + + " SUM(t2."+zdm.get("预计存量金融债务余额")+") AS total_fdetailext20 -- 预计存量金融债务余额总和\n" + + "FROM\n" + + " t_fpm_report t1 -- 主表\n" + + "INNER JOIN t_fpm_reportdatadetail t2 ON t1.fid = t2.fid -- 明细数据\n" + + "INNER JOIN t_fpm_reportdatamain t3 ON t2.fmaindimdataid = t3.FEntryID -- 维度表\n" + + "INNER JOIN t_fpm_member_e t4 ON t3.fperiodmemid = t4.fid -- 期间维度\n" + + "WHERE\n" + + " t1.fid = "+id+" AND\n" + + " t4.fstartdate>='"+start+"' AND\n" + + " t4.fstartdate<='"+end+"' AND\n" + + " t2.fbankcateid <> 0\n" + + "GROUP BY\n" + + " DATE_FORMAT(t4.fstartdate, '%Y%m'), -- 直接在 GROUP BY 中使用原始表达式\n" + + " t2.fbankcateid, -- 按照金融机构分组\n" + + " t1.fbillno"); + return sqlBuilder; + } + + /* + * 根据日期获取月初和月末 + * */ + public static Map getMonthStartAndEnd(Date date) { + Map result = new HashMap<>(); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + + // 获取当月开始时间 + calendar.set(Calendar.DAY_OF_MONTH, 1); // 设置为当月的第一天 + calendar.set(Calendar.HOUR_OF_DAY, 0); // 设置为0点 + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + Date monthStart = calendar.getTime(); + + // 获取当月结束时间 + calendar.add(Calendar.MONTH, 1); // 增加一个月 + calendar.set(Calendar.DAY_OF_MONTH, 1); // 设置为下月的第一天 + calendar.add(Calendar.DAY_OF_MONTH, -1); // 回到当月的最后一天 + calendar.set(Calendar.HOUR_OF_DAY, 23); // 设置为23:59:59.999 + calendar.set(Calendar.MINUTE, 59); + calendar.set(Calendar.SECOND, 59); + calendar.set(Calendar.MILLISECOND, 999); + Date monthEnd = calendar.getTime(); + + result.put("start", monthStart); + result.put("end", monthEnd); + + return result; + } + + public static Date getnextMonth(Date date){ + // 使用 Calendar 来操作日期 + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + + // 当前日期减去一个月 + calendar.add(Calendar.MONTH, 1); + + // 获取上个月的日期 + Date lastMonthDate = calendar.getTime(); + return lastMonthDate; + } +}