From 80b007b2fcb2b55f83c0dda750914e188e7e82e0 Mon Sep 17 00:00:00 2001 From: 16358 <1635849544@qq.com> Date: Tue, 4 Nov 2025 15:52:24 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BA=BA=EF=BC=9A=E5=88=98?= =?UTF-8?q?=E6=A3=AE=E6=BE=B3=20=E6=97=A5=E6=9C=9F=EF=BC=9A2025/11/04=2015?= =?UTF-8?q?:51=20=E5=86=85=E5=AE=B9=EF=BC=9A=E6=8B=85=E4=BF=9D=E6=98=8E?= =?UTF-8?q?=E7=BB=86=E8=A1=A8=E4=BC=98=E5=8C=96=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../report/GuaranteeContractOverPlugin.java | 73 ++++++ .../report/GuaranteeContractPatchPlugin.java | 29 +-- .../report/ReportFilterAndSortUtil.java | 234 ++++++++++++++++++ 3 files changed, 320 insertions(+), 16 deletions(-) create mode 100644 sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/report/GuaranteeContractOverPlugin.java create mode 100644 sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/report/ReportFilterAndSortUtil.java diff --git a/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/report/GuaranteeContractOverPlugin.java b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/report/GuaranteeContractOverPlugin.java new file mode 100644 index 0000000..f5bf672 --- /dev/null +++ b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/report/GuaranteeContractOverPlugin.java @@ -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 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 allColumns) { + super.setSortAndFilter(allColumns); + for (SortAndFilterEvent event : allColumns) { + if ("billno".equals(event.getColumnName()))event.setFilter(true);//搜索 + } + } + + +} \ No newline at end of file diff --git a/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/report/GuaranteeContractPatchPlugin.java b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/report/GuaranteeContractPatchPlugin.java index bceae65..af814b0 100644 --- a/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/report/GuaranteeContractPatchPlugin.java +++ b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/report/GuaranteeContractPatchPlugin.java @@ -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 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; diff --git a/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/report/ReportFilterAndSortUtil.java b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/report/ReportFilterAndSortUtil.java new file mode 100644 index 0000000..19f6689 --- /dev/null +++ b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/report/ReportFilterAndSortUtil.java @@ -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 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 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 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 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])}); + } + } + +} \ No newline at end of file