提交人:刘森澳

日期:2025/11/04 15:51
内容:担保明细表优化项
This commit is contained in:
16358 2025-11-04 15:52:24 +08:00
parent 20773066ee
commit 80b007b2fc
3 changed files with 320 additions and 16 deletions

View File

@ -0,0 +1,73 @@
package shkd.sys.sys.plugin.report;
import kd.bos.entity.datamodel.events.PackageDataEvent;
import kd.bos.report.events.SortAndFilterEvent;
import kd.tmc.gm.form.GuaranteeContractDetailFormPlugin;
import java.util.List;
/**
* 报表界面插件
*/
public class GuaranteeContractOverPlugin extends GuaranteeContractDetailFormPlugin {
//储存重复单据编号如果newBillName != tempBillName 则将newBillName赋值给tempBillName
public String tempBillName = "";
//是否第一次进入packageData方法标识符
Boolean isFirst = true;
@Override
public void setMergeColums(List<String> columns) {
columns.add("guaranteeorgtext");
columns.add("billno");
columns.add("id");
columns.add("guaranteedorgtext");
columns.add("creditortext");
columns.add("guaranteetext");
columns.add("currency");
columns.add("amount");
columns.add("begindate");
columns.add("enddate");
columns.add("dutycurrency");
columns.add("dutyamount");
}
@Override
public void packageData(PackageDataEvent packageDataEvent) {
if (isFirst) {
tempBillName = packageDataEvent.getRowData().getString("billno");
isFirst = false;
}
//判断是否为同一单据 如果不是 则不应该合并
String newBillName = packageDataEvent.getRowData().getString("billno");
if (!newBillName.equals(tempBillName)) {
tempBillName = newBillName;
packageDataEvent.getNoMergeKey().add("guaranteeorgtext");
packageDataEvent.getNoMergeKey().add("billno");
packageDataEvent.getNoMergeKey().add("id");
packageDataEvent.getNoMergeKey().add("guaranteedorgtext");
packageDataEvent.getNoMergeKey().add("creditortext");
packageDataEvent.getNoMergeKey().add("guaranteetext");
packageDataEvent.getNoMergeKey().add("currency");
packageDataEvent.getNoMergeKey().add("amount");
packageDataEvent.getNoMergeKey().add("begindate");
packageDataEvent.getNoMergeKey().add("enddate");
packageDataEvent.getNoMergeKey().add("dutycurrency");
packageDataEvent.getNoMergeKey().add("dutyamount");
}
}
@Override
public void setSortAndFilter(List<SortAndFilterEvent> allColumns) {
super.setSortAndFilter(allColumns);
for (SortAndFilterEvent event : allColumns) {
if ("billno".equals(event.getColumnName()))event.setFilter(true);//搜索
}
}
}

View File

@ -2,36 +2,25 @@ package shkd.sys.sys.plugin.report;
import kd.bos.algo.*;
import kd.bos.algo.input.CollectionInput;
import kd.bos.base.BaseShowParameter;
import kd.bos.bill.BillOperationStatus;
import kd.bos.bill.BillShowParameter;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.dataentity.metadata.clr.DataEntityPropertyCollection;
import kd.bos.dataentity.resource.ResManager;
import kd.bos.db.DB;
import kd.bos.db.DBRoute;
import kd.bos.entity.datamodel.AbstractFormDataModel;
import kd.bos.entity.report.AbstractReportListDataPluginExt;
import kd.bos.entity.report.ReportQueryParam;
import kd.bos.event.AfterQueryEvent;
import kd.bos.form.ShowType;
import kd.bos.form.events.HyperLinkClickEvent;
import kd.bos.form.plugin.AbstractFormPlugin;
import kd.bos.logging.Log;
import kd.bos.logging.LogFactory;
import kd.bos.orm.ORM;
import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.bos.servicehelper.QueryServiceHelper;
import kd.scmc.ism.common.utils.DataSetUtils;
import kd.sdk.plugin.Plugin;
import kd.tmc.fbp.common.constant.Constants;
import kd.tmc.fbp.common.enums.BillStatusEnum;
import kd.tmc.fbp.common.enums.ProductTypeEnum;
import kd.tmc.fbp.common.helper.GuaranteeUseHelper;
import kd.tmc.fbp.common.helper.TmcBusinessBaseHelper;
import kd.tmc.fbp.common.helper.TmcDataServiceHelper;
import kd.tmc.fbp.common.helper.TmcViewInputHelper;
import kd.tmc.fbp.common.util.EmptyUtil;
import kd.tmc.gm.common.helper.GuaranteeContractHelper;
@ -39,6 +28,9 @@ import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import static kd.bos.mservice.extreport.runtime.domain.PageManager.refreshDataSet;
import static shkd.sys.sys.plugin.report.ReportFilterAndSortUtil.refreshDataSet;
/**
* 动态表单插件
*/
@ -47,6 +39,7 @@ public class GuaranteeContractPatchPlugin extends AbstractReportListDataPluginEx
private static final Log logger = LogFactory.getLog(GuaranteeContractPatchPlugin.class);
private static final String[] gcProps = new String[]{"gcomment", "gcparty", "gsrcbillid", "gsrcbillno", "gsrcbilltype", "gdebtorg", "gdebtorgtext", "gdebtcurrency", "gdebtamount", "gdebtbalance", "gratio", "gexchrate", "gdebtstartdate", "gdebtenddate", "gcontract", "gsrcbillbizamount", "gcreditortype", "gcreditor", "gcreditortext"};
private ReportQueryParam reportQueryParam;
public void afterQuery(AfterQueryEvent event) {
DataSet dataSet = event.getDataSet();
@ -84,7 +77,6 @@ public class GuaranteeContractPatchPlugin extends AbstractReportListDataPluginEx
ArrayList<DynamicObjectCollection> temps = new ArrayList<>();
for (DynamicObject guaranteecontract : guaranteecontracts) {
DynamicObjectCollection guaranteedebt_entry = guaranteecontract.getDynamicObjectCollection("guaranteedebt_entry");
DynamicObject entry = guaranteedebt_entry.addNew();
QFilter gQF = new QFilter("gcontract.id", "=", guaranteecontract.getLong("id"));
gQF.and("billstatus", "=", BillStatusEnum.AUDIT.getValue());
DynamicObjectCollection gcUseBills = QueryServiceHelper.query("gm_guaranteeuse", String.join(",", gcProps), gQF.toArray());
@ -99,6 +91,7 @@ public class GuaranteeContractPatchPlugin extends AbstractReportListDataPluginEx
int var13 = gcUseBillArr.length;
for(int var14 = 0; var14 < var13; ++var14) {
DynamicObject entry = guaranteedebt_entry.addNew();
DynamicObject gcBIll = var12[var14];
if ("cfm_creditlimit".equals(TmcBusinessBaseHelper.getBillFormId(gcBIll.getString("gsrcbilltype")))) {
creditLimitIds.add(gcBIll.getLong("gsrcbillid"));
@ -164,8 +157,13 @@ public class GuaranteeContractPatchPlugin extends AbstractReportListDataPluginEx
finish = join2.on("billno", "shkd_parentbillno").select(fieldNames3, fieldNames4).finish();
}
//3注入整合后的table数据
event.setDataSet(finish);
//3根据参数进行过滤和排序
reportQueryParam = event.getReportQueryParam();
DataSet newFinish = refreshDataSet(reportQueryParam, finish, "gm_guarantee contract");
//4注入整合后的table数据
event.setDataSet(newFinish);
}
public DataSet buildDataByObjCollection(DynamicObjectCollection finalTemp) {
@ -229,7 +227,6 @@ public class GuaranteeContractPatchPlugin extends AbstractReportListDataPluginEx
return finish;
}
private String containsEntity(String gSrcBillType) {
if ("cfm_loancontractbill".equals(gSrcBillType)) {
return gSrcBillType;

View File

@ -0,0 +1,234 @@
package shkd.sys.sys.plugin.report;
import com.alibaba.excel.util.StringUtils;
import kd.bos.algo.DataSet;
import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.dataentity.resource.ResManager;
import kd.bos.entity.MainEntityType;
import kd.bos.entity.filter.FilterField;
import kd.bos.entity.report.ReportQueryParam;
import kd.bos.exception.BosErrorCode;
import kd.bos.exception.KDBizException;
import kd.bos.form.plugin.AbstractFormPlugin;
import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.MetadataServiceHelper;
import kd.bos.servicehelper.QueryServiceHelper;
import kd.sdk.plugin.Plugin;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
* 动态表单插件
*/
public class ReportFilterAndSortUtil {
private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
private static final String KEY_AND = " and ";
public static DataSet refreshDataSet(ReportQueryParam reportQueryParam, DataSet dataSet, String billnumber) {
//表头字段排序和搜索代码---------------------
String sortInfo = reportQueryParam.getSortInfo();//获取升降序字段
StringBuilder sb = new StringBuilder();//拼接所有过滤条件
//表头字段的所有过滤条件(不包含报表常用过滤条件字段)
List<QFilter> headFilters = reportQueryParam.getFilter().getHeadFilters();
//获取报表原始界面模型
MainEntityType dataEntityType = MetadataServiceHelper.getDataEntityType(billnumber);
if (dataEntityType != null) {
//遍历单头过滤条件
for (QFilter headFilter : headFilters) {
String property = headFilter.getProperty();//字段表头头标识
Object value = headFilter.getValue();//过滤值
String cp = headFilter.getCP();//比较类型 =like
FilterField filterField = FilterField.create(dataEntityType, property);
String refEntityId = filterField.getRefEntityId();//字段所引用的实体对象
if (StringUtils.isNotBlank(refEntityId)) {
QFilter qFilter = new QFilter("name", cp, value);
DynamicObjectCollection datas = QueryServiceHelper.query(refEntityId, "id", new QFilter[]{qFilter});
//根据条件查询符合条件的id
List<Object> ids = datas.stream().map(v -> v.get("id")).collect(Collectors.toList());
if (ids.size() > 0) {
//拼接条件如果是集合集合转String后要将 [] 替换成 (),多个后面还需要拼接KEY_AND
sb.append(property).append(" in ").append(ids.toString().replace("[", "(").replace("]", ")")).append(KEY_AND);
} else {
//如果符合条件的id没有说明符合条件的数据也没有个人想法暂时默认给id一个值如果是直接跟字符串比较可能会报错
sb.append(property).append(" = 1 and ");
}
} else {
int fieldType = filterField.getFieldType();//字段类型
if (fieldType == 91) {//日期字段搜索过滤
dateFilterStr(sb, headFilter, property, value, cp);
} else if (fieldType == -9) {
//文本为空 不为空处理
if (StringUtils.equals(cp, "is null")) {
if (headFilters.size() > 1) {
sb.append(headFilter.toString()).append(KEY_AND);
} else {
sb.append(headFilter.toString().replace("(", "").replace(")", "")).append(KEY_AND);
}
} else {
sb.append(headFilter.toString()).append(KEY_AND);
}
} else {
//如果不是基础资料类型的字段需要重新根据字段类型转换过滤值
QFilter qFilterBySqlTypes = getQFilterBySqlTypes(property, cp, fieldType, value.toString());
sb.append(qFilterBySqlTypes.toString()).append(KEY_AND);
}
}
}
String sbStr = sb.toString();
String filterStr = StringUtils.isNotBlank(sbStr) ? sbStr.substring(0, sbStr.length() - 5).replace("null ''", "null ") : null;
if (StringUtils.isNotBlank(filterStr)) {//搜索过滤
dataSet = dataSet.copy().filter(filterStr);
}
if (StringUtils.isNotBlank(sortInfo)) {//字段排序
dataSet = dataSet.copy().orderBy(new String[]{sortInfo});
}
}
return dataSet;
}
/**
* @param sb
* @param headFilter
* @param property
* @param value
* @param cp
* @return void
* @Description 日期字段搜索过滤
*/
private static void dateFilterStr(StringBuilder sb, QFilter headFilter, String property, Object value, String cp) {
if (value.getClass().getSimpleName().equals("Date")) { //日期类型
Date startDate = (Date) value;
int startInt = Integer.valueOf(sdf.format(startDate));
//日期过滤需要转出Int类型再比较
sb.append(" Cast(to_char(").append(property).append(",'yyyyMMdd') as Integer) ").append(cp).append(" ").append(startInt).append(KEY_AND);
List<QFilter.QFilterNest> nests = headFilter.getNests(true);//合并条件
for (QFilter.QFilterNest nest : nests) {//拼接合并过滤条件
String nestProperty = nest.getFilter().getProperty();
String nestCP = nest.getFilter().getCP();
Date endDate = (Date) nest.getFilter().getValue();
int endInt = Integer.valueOf(sdf.format(endDate));
sb.append(" Cast(to_char(").append(nestProperty).append(",'yyyyMMdd') as Integer) ").append(nestCP).append(" ").append(endInt).append(KEY_AND);
}
} else if (value.getClass().getSimpleName().equals("String")) { //等于具体某一天 是字符串
int start = Integer.valueOf(((String) value).replace("-", ""));
sb.append(" Cast(to_char(").append(property).append(",'yyyyMMdd') as Integer) ").append(cp).append(" ").append(start).append(KEY_AND);
}
}
private static QFilter getQFilterBySqlTypes(String sFilter, String operater, int fieldType, String value) {
QFilter qFilter = null;
if (fieldType == 1) {//复选框
String[] split = ((String) value).replace("[", "").replace("]", "").split(",");
List<Boolean> bList = new ArrayList<>(2);
for (String s : split) {
if (s.trim().equals("0")) {
bList.add(false);
} else if (s.trim().equals("1")) {
bList.add(true);
}
}
qFilter = new QFilter(sFilter, operater, bList);
} else if (fieldType == 5) {
qFilter = new QFilter(sFilter, operater, parseShort(value));
} else if (fieldType == -6) {
qFilter = new QFilter(sFilter, operater, parseByte(value));
} else if (fieldType == 4) {
qFilter = new QFilter(sFilter, operater, parseInt(value));
} else if (fieldType == -5) {
qFilter = new QFilter(sFilter, operater, parseLong(value));
} else if (fieldType == 7) {
qFilter = new QFilter(sFilter, operater, parseBigDecimal(value));
} else if (fieldType == 12) {//下拉选项
String[] split = ((String) value).replace("[", "").replace("]", "").split(",");
qFilter = new QFilter(sFilter, operater, split);
} else if (fieldType != 6 && fieldType != 8) {
if (fieldType != 3 && fieldType != 2) {
if (fieldType == -7) {
qFilter = new QFilter(sFilter, operater, parseBoolean(value));
} else {
qFilter = new QFilter(sFilter, operater, value);
}
} else {
qFilter = new QFilter(sFilter, operater, parseBigDecimal(value));
}
} else {
qFilter = new QFilter(sFilter, operater, parseBigDecimal(value));
}
return qFilter;
}
public static short parseShort(String value) {
try {
return Short.parseShort(value);
} catch (NumberFormatException var2) {
throw new KDBizException(BosErrorCode.filterSqlBuilder, new Object[]{ResManager.loadKDString("输入内容不在-32768到32767之间", "this_0", "bos-entity-core", new Object[0])});
}
}
public static byte parseByte(String value) {
try {
return Byte.parseByte(value);
} catch (NumberFormatException var2) {
throw new KDBizException(BosErrorCode.filterSqlBuilder, new Object[]{ResManager.loadKDString("输入内容不在-128到127之间", "this_1", "bos-entity-core", new Object[0])});
}
}
public static int parseInt(String value) {
try {
return Integer.parseInt(value);
} catch (NumberFormatException var2) {
throw new KDBizException(BosErrorCode.filterSqlBuilder, new Object[]{ResManager.loadKDString("输入内容不在-2147483648到2147483647之间", "this_2", "bos-entity-core", new Object[0])});
}
}
public static long parseLong(String value) {
try {
return Long.parseLong(value);
} catch (NumberFormatException var2) {
throw new KDBizException(BosErrorCode.filterSqlBuilder, new Object[]{ResManager.loadKDString("输入内容不在-9223372036854775808到9223372036854775807之间", "this_3", "bos-entity-core", new Object[0])});
}
}
public static float parseFloat(String value) {
try {
return Float.parseFloat(value);
} catch (NumberFormatException var2) {
throw new KDBizException(BosErrorCode.filterSqlBuilder, new Object[]{ResManager.loadKDString("不是有效的浮点数", "this_4", "bos-entity-core", new Object[0])});
}
}
@Deprecated
public static double parseDouble(String value) {
try {
return Double.parseDouble(value);
} catch (NumberFormatException var2) {
throw new KDBizException(BosErrorCode.filterSqlBuilder, new Object[]{ResManager.loadKDString("不是有效的双精度数字", "this_5", "bos-entity-core", new Object[0])});
}
}
public static BigDecimal parseBigDecimal(String value) {
try {
return new BigDecimal(value);
} catch (NumberFormatException var2) {
throw new KDBizException(BosErrorCode.filterSqlBuilder, new Object[]{ResManager.loadKDString("不是有效的双精度数字", "this_5", "bos-entity-core", new Object[0])});
}
}
public static boolean parseBoolean(String value) {
try {
return Boolean.parseBoolean(value);
} catch (NumberFormatException var2) {
throw new KDBizException(BosErrorCode.filterSqlBuilder, new Object[]{ResManager.loadKDString("不是有效的布尔类型", "this_6", "bos-entity-core", new Object[0])});
}
}
}