parent
dd61ee05ea
commit
83248a0138
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue