提交人:陈绍鑫

日期:2025/11/14 17:30
内容:计划编制报表
This commit is contained in:
陈绍鑫 2025-11-14 17:35:07 +08:00
parent dd61ee05ea
commit 83248a0138
1 changed files with 194 additions and 0 deletions

View File

@ -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<String, String> 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<QFilter> listQFilter = ReportUtils.getListQFilter(reportQueryParam);
Date date = new Date();
for (QFilter filter : listQFilter) {
if (filter.getProperty().contains("shkd_date")) {
date= (Date) filter.getValue();
}
}
//获取当月日期范围
Map<String, Date> dangyue = getMonthStartAndEnd(date);
Date date1 = getnextMonth(date);
//获取上月日期范围
Map<String, Date> 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<String> 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<String, String> zdm, Map<String, Date> 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<String, Date> getMonthStartAndEnd(Date date) {
Map<String, Date> 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;
}
}