From ddc6ac52fc45e850d5dcd481a27d878b1a94ef38 Mon Sep 17 00:00:00 2001 From: zoujiangtao Date: Thu, 16 Oct 2025 15:15:02 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=86=85=E5=AE=B9=EF=BC=9A?= =?UTF-8?q?=E5=86=85=E9=83=A8=E8=B4=A6=E6=88=B7=E5=AF=B9=E8=B4=A6=E5=8D=95?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=20=E6=97=B6=E9=97=B4=EF=BC=9A2025-10-16=2015?= =?UTF-8?q?=EF=BC=9A14=20=E6=8F=90=E4=BA=A4=E4=BA=BA=EF=BC=9A=E9=82=B9?= =?UTF-8?q?=E6=B1=9F=E6=B6=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sys/plugin/list/JszxdzdListPlugin.java | 366 ++++++++++++++++++ .../sys/plugin/task/JszxdzdTaskPlugin.java | 188 +++++++++ 2 files changed, 554 insertions(+) create mode 100644 sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/list/JszxdzdListPlugin.java create mode 100644 sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/task/JszxdzdTaskPlugin.java diff --git a/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/list/JszxdzdListPlugin.java b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/list/JszxdzdListPlugin.java new file mode 100644 index 0000000..23eed5d --- /dev/null +++ b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/list/JszxdzdListPlugin.java @@ -0,0 +1,366 @@ +package shkd.sys.sys.plugin.list; + +import kd.bos.algo.*; +import kd.bos.coderule.api.CodeRuleInfo; +import kd.bos.context.RequestContext; +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.dataentity.entity.DynamicObjectCollection; +import kd.bos.entity.datamodel.ListSelectedRow; +import kd.bos.entity.datamodel.ListSelectedRowCollection; +import kd.bos.entity.report.FilterItemInfo; +import kd.bos.entity.report.ReportQueryParam; +import kd.bos.form.ConfirmCallBackListener; +import kd.bos.form.ConfirmTypes; +import kd.bos.form.MessageBoxOptions; +import kd.bos.form.MessageBoxResult; +import kd.bos.form.control.events.ItemClickEvent; +import kd.bos.form.events.MessageBoxClosedEvent; +import kd.bos.list.BillList; +import kd.bos.list.IListView; +import kd.bos.list.plugin.AbstractListPlugin; +import kd.bos.logging.Log; +import kd.bos.logging.LogFactory; +import kd.bos.orm.ORM; +import kd.bos.orm.query.QCP; +import kd.bos.orm.query.QFilter; +import kd.bos.servicehelper.BusinessDataServiceHelper; +import kd.bos.servicehelper.QueryServiceHelper; +import kd.bos.util.CollectionUtils; +import kd.bos.util.StringUtils; +import kd.sdk.plugin.Plugin; +import kd.tmc.fbp.common.enums.BankAcctStatusEnum; +import kd.tmc.fbp.common.enums.TmcAppEnum; +import kd.tmc.fbp.common.util.DateUtils; +import kd.tmc.ifm.enums.AcctClassifyEnum; +import kd.tmc.ifm.helper.IfmSettleCenterHelper; +import kd.bos.servicehelper.operation.SaveServiceHelper; +import kd.bos.servicehelper.coderule.CodeRuleServiceHelper; + +import java.math.BigDecimal; +import java.util.*; + +/** + * 标准单据列表插件 + */ +public class JszxdzdListPlugin extends AbstractListPlugin implements Plugin { + private static final Log logger = LogFactory.getLog(JszxdzdListPlugin.class); + + @Override + public void registerListener(EventObject e) { + super.registerListener(e); + } + + @Override + public void itemClick(ItemClickEvent evt) { + super.itemClick(evt); + String itemKey = evt.getItemKey(); + if ("shkd_bcbbsj".equals(itemKey)) { + // 获取当前月的前一个月的月初和月末的值 + Calendar cal = Calendar.getInstance(); + cal.add(Calendar.MONTH, -1); + cal.set(Calendar.DAY_OF_MONTH, 1); + Date bizdate_startdate = cal.getTime(); // 上个月第一天 + + cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH)); + Date bizdate_enddate = cal.getTime(); // 上个月最后一天 + + DataSet emptyDataSet = getData(bizdate_startdate, bizdate_enddate); + + DynamicObjectCollection dataRows = ORM.create().toPlainDynamicObjectCollection(emptyDataSet); + logger.info("数据行数:" + dataRows.size() + "\n第一条数据:" + dataRows.get(0)); + + for (DynamicObject dynamicObject : dataRows) { + Long settcenterId = dynamicObject.getLong("settcenter");//结算中心 + logger.info("结算中心:" + settcenterId); + + Long orgId = dynamicObject.getLong("org");//资金组织 + + Long inneraccountId = dynamicObject.getLong("inneraccount");//内部账户_账号 + logger.info("内部账户_账号:" + inneraccountId); + + DynamicObject[] am_accountbank = BusinessDataServiceHelper.load("am_accountbank", "id,bankaccountnumber", new QFilter("id", QCP.equals, inneraccountId).toArray()); + logger.info("内部账户 → 账户查询:" + am_accountbank[0]); + + DynamicObject[] ifm_inneracct = BusinessDataServiceHelper.load("ifm_inneracct", "id,name,number,relationacc", new QFilter("number", QCP.equals, am_accountbank[0].get("bankaccountnumber")).toArray()); + logger.info("内部账户 → 内部账户管理 → 关联账户:" + ifm_inneracct[0]); + + DynamicObjectCollection dynamicObjectCollection = ifm_inneracct[0].getDynamicObjectCollection("relationacc"); + if (dynamicObjectCollection.isEmpty()) { + continue; + } + logger.info("关联账户:" + dynamicObjectCollection); + long relationacc_id = dynamicObjectCollection.get(0).getLong("fbasedataid_Id");//银行账户 + + DynamicObject[] bd_accountbanks = BusinessDataServiceHelper.load("bd_accountbanks", "id,bankaccountnumber,bank", new QFilter("id", QCP.equals, relationacc_id).toArray()); + + DynamicObject bank_cate = bd_accountbanks[0].getDynamicObject("bank").getDynamicObject("bank_cate"); + String bank_cate_name = bank_cate.getString("name");//银行类别 + + Long currencyId = dynamicObject.getLong("currency");//币种 + + BigDecimal amountstart = dynamicObject.getBigDecimal("amountstart");//期初余额 + BigDecimal currincome = dynamicObject.getBigDecimal("currincome");//本期收入 + BigDecimal currpay = dynamicObject.getBigDecimal("currpay");//本期支出 + BigDecimal amountend = dynamicObject.getBigDecimal("amountend");//期末余额 + + DynamicObject newDynamicObject = BusinessDataServiceHelper.newDynamicObject("shkd_jszxdzd"); + + // CodeRuleServiceHelper(编码规则帮助服务类) + CodeRuleInfo codeRule = CodeRuleServiceHelper.getCodeRule(newDynamicObject.getDataEntityType().getName(), newDynamicObject, null); + + newDynamicObject.set("billno", CodeRuleServiceHelper.getNumber(codeRule, newDynamicObject));//编码 + newDynamicObject.set("billstatus", "C");//状态 + + newDynamicObject.set("shkd_jszxdata", settcenterId);//结算中心 + newDynamicObject.set("shkd_zjzzorg", orgId);//资金组织 + newDynamicObject.set("shkd_nbzh", inneraccountId);//内部账户_账号 + newDynamicObject.set("shkd_yhzhdata", relationacc_id);//银行账户 + newDynamicObject.set("shkd_yhlb", bank_cate_name);//银行类别 + newDynamicObject.set("shkd_bzdata", currencyId);//币种 + newDynamicObject.set("shkd_qcyeamount", amountstart);//期初余额 + newDynamicObject.set("shkd_bqsramount", currincome);//本期收入 + newDynamicObject.set("shkd_bqzcamount", currpay);//本期支出 + newDynamicObject.set("shkd_qmyeamount", amountend);//期末余额 + newDynamicObject.set("shkd_qsrq", bizdate_startdate);//起始日期 + newDynamicObject.set("shkd_jsrq", bizdate_enddate);//结束日期 + + SaveServiceHelper.save(new DynamicObject[]{newDynamicObject}); + } + this.getView().invokeOperation("refresh"); + } else if ("shkd_updatedata".equals(itemKey)) { + String billFormId = ((IListView) this.getView()).getBillFormId(); + // 获取勾选的单据ID + BillList billList = this.getControl("billlistap"); + ListSelectedRowCollection selectedRows = billList.getSelectedRows(); + Set setIds = new HashSet<>(); + if (CollectionUtils.isNotEmpty(selectedRows)) { + for (ListSelectedRow selectedRow : selectedRows) { + setIds.add(toLong(selectedRow.getPrimaryKeyValue())); + } + } else { + this.getView().showTipNotification("请选择至少一条数据"); + return; + } + List longs = new ArrayList<>(setIds); + for (Long aLong : longs) { + DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(aLong, billFormId); + Long shkd_jszxdata = (Long) dynamicObject.getDynamicObject("shkd_jszxdata").getPkValue();//结算中心 + Long shkd_zjzzorg = (Long) dynamicObject.getDynamicObject("shkd_zjzzorg").getPkValue();//资金组织 + Long shkd_nbzh = (Long) dynamicObject.getDynamicObject("shkd_nbzh").getPkValue();//内部账户_账号 + BigDecimal shkd_qcyeamount = dynamicObject.getBigDecimal("shkd_qcyeamount");//期初余额 + BigDecimal shkd_bqsramount = dynamicObject.getBigDecimal("shkd_bqsramount");//本期收入 + BigDecimal shkd_bqzcamount = dynamicObject.getBigDecimal("shkd_bqzcamount");//本期支出 + BigDecimal shkd_qmyeamount = dynamicObject.getBigDecimal("shkd_qmyeamount");//期末余额 + + Date shkd_qsrq = dynamicObject.getDate("shkd_qsrq");//起始日期 + Date shkd_jsrq = dynamicObject.getDate("shkd_jsrq");//结束日期 + DataSet emptyDataSet = getData(shkd_qsrq, shkd_jsrq); + DynamicObjectCollection dataRows = ORM.create().toPlainDynamicObjectCollection(emptyDataSet); + for (DynamicObject dataRow : dataRows) { + Long settcenter = dataRow.getLong("settcenter");//结算中心 + Long org = dataRow.getLong("org");//资金组织 + Long inneraccount = dataRow.getLong("inneraccount");//内部账户_账号 + BigDecimal amountstart = dataRow.getBigDecimal("amountstart");//期初余额 + BigDecimal currincome = dataRow.getBigDecimal("currincome");//本期收入 + BigDecimal currpay = dataRow.getBigDecimal("currpay");//本期支出 + BigDecimal amountend = dataRow.getBigDecimal("amountend");//期末余额 + if (settcenter.equals(shkd_jszxdata) && org.equals(shkd_zjzzorg) && inneraccount.equals(shkd_nbzh) + && amountstart.compareTo(shkd_qcyeamount) == 0 && currincome.compareTo(shkd_bqsramount) == 0 + && currpay.compareTo(shkd_bqzcamount) == 0 && amountend.compareTo(shkd_qmyeamount) == 0) { + break; + } else if (settcenter.equals(shkd_jszxdata) && org.equals(shkd_zjzzorg) && inneraccount.equals(shkd_nbzh)) { + dataRow.set("shkd_qcyeamount", amountstart);//期初余额 + dataRow.set("shkd_bqsramount", currincome);//本期收入 + dataRow.set("shkd_bqzcamount", currpay);//本期支出 + dataRow.set("shkd_qmyeamount", amountend);//期末余额 + dataRow.set("shkd_sfyz", false);//期末余额 + SaveServiceHelper.save(new DynamicObject[]{dataRow}); + break; + } + } + } + this.getView().invokeOperation("refresh"); + } else if ("shkd_confirmre".equals(itemKey)) { + String msg = "是否确认对账"; + // 详细消息 + // String detail = "消息体\r\nmessage body..."; + // 消息框按钮类型 + // None:不启用 Toast:简短提示,几秒后消失 + MessageBoxOptions options = MessageBoxOptions.OKCancel; + // 确认提示类型 + // Default:默认提示 Save:保存提交类提示 Delete:删除类提示 Wait:等待类提示 Fail:失败类提示 + ConfirmTypes confirmTypes = ConfirmTypes.Default; + // 确认框回调 新建 确认 回复 监听器对象 + ConfirmCallBackListener confirmCallBackListener = new ConfirmCallBackListener("confirmre", this); + // 显示弹窗 + this.getView().showConfirm(msg, options, confirmTypes, confirmCallBackListener); + } else if ("shkd_cancelre".equals(itemKey)) { + String msg = "是否取消对账"; + // 详细消息 + // String detail = "消息体\r\nmessage body..."; + // 消息框按钮类型 + // None:不启用 Toast:简短提示,几秒后消失 + MessageBoxOptions options = MessageBoxOptions.OKCancel; + // 确认提示类型 + // Default:默认提示 Save:保存提交类提示 Delete:删除类提示 Wait:等待类提示 Fail:失败类提示 + ConfirmTypes confirmTypes = ConfirmTypes.Default; + + // 确认框回调 新建 确认 回复 监听器对象 + ConfirmCallBackListener confirmCallBackListener = new ConfirmCallBackListener("cancelre", this); + // 显示弹窗 + this.getView().showConfirm(msg, options, confirmTypes, confirmCallBackListener); + + } + } + + @Override + public void confirmCallBack(MessageBoxClosedEvent evt) { + super.confirmCallBack(evt); + // 回调ID + String callBackId = evt.getCallBackId(); + + if (evt.getResult() == MessageBoxResult.Yes && "confirmre".equals(callBackId)) { + String billFormId = ((IListView) this.getView()).getBillFormId(); + // 获取勾选的单据ID + BillList billList = this.getControl("billlistap"); + ListSelectedRowCollection selectedRows = billList.getSelectedRows(); + Set setIds = new HashSet<>(); + if (CollectionUtils.isNotEmpty(selectedRows)) { + for (ListSelectedRow selectedRow : selectedRows) { + setIds.add(toLong(selectedRow.getPrimaryKeyValue())); + } + } else { + this.getView().showTipNotification("请选择至少一条数据"); + return; + } + + List longs = new ArrayList<>(setIds); + for (Long aLong : longs) { + DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(aLong, billFormId); + dynamicObject.set("shkd_sfyz", true); + SaveServiceHelper.save(new DynamicObject[]{dynamicObject}); + } + this.getView().invokeOperation("refresh"); + } else if (evt.getResult() == MessageBoxResult.Yes && "cancelre".equals(callBackId)) { + String billFormId = ((IListView) this.getView()).getBillFormId(); + // 获取勾选的单据ID + BillList billList = this.getControl("billlistap"); + ListSelectedRowCollection selectedRows = billList.getSelectedRows(); + Set setIds = new HashSet<>(); + if (CollectionUtils.isNotEmpty(selectedRows)) { + for (ListSelectedRow selectedRow : selectedRows) { + setIds.add(toLong(selectedRow.getPrimaryKeyValue())); + } + } else { + this.getView().showTipNotification("请选择至少一条数据"); + return; + } + List longs = new ArrayList<>(setIds); + for (Long aLong : longs) { + DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(aLong, billFormId); + dynamicObject.set("shkd_sfyz", false); + SaveServiceHelper.save(new DynamicObject[]{dynamicObject}); + } + this.getView().invokeOperation("refresh"); + } + } + + private DataSet getData(Date bizdate_startdate, Date bizdate_enddate) { + DataSet innerAccDataSet = this.queryAccts(); + List innerAcctIds = new ArrayList<>(10); + + for (Row idRow : innerAccDataSet.copy()) { + innerAcctIds.add(idRow.getLong("id")); + } + + if (innerAcctIds.isEmpty()) { + RowMeta emptyRowMeta = new RowMeta(new String[]{"empty"}, new DataType[]{DataType.StringType}); + return Algo.create("EmptyDataSet").createDataSetBuilder(emptyRowMeta).build(); + } else { + DataSet beginBalDS = this.queryBeginBalance(bizdate_startdate, bizdate_enddate, innerAcctIds); + beginBalDS = innerAccDataSet.join(beginBalDS, JoinType.LEFT).on("id", "accountbank.id").on("currencyid", "currency.id").select(new String[]{"company.id", "bank.id", "id as accountbank.id", "bankaccountnumber", "currencyid as currency.id", "currency.name", "amount as lstbalance"}).finish(); + DataSet transDetailDS = this.queryTranDetails(bizdate_startdate, bizdate_enddate, innerAcctIds); + DataSet resultDataSet = beginBalDS.join(transDetailDS, JoinType.LEFT).on("company.id", "company.id").on("accountbank.id", "accountbank.id").on("currency.id", "currency.id").select(new String[]{"bank.id settcenter", "company.id org", "accountbank.id inneraccount", "currency.id currency", "lstbalance amountstart", "creditamount currincome", "debitamount currpay"}).finish(); + resultDataSet = resultDataSet.updateField("currincome", "case when currincome is not null then currincome else 0 end as currincome").updateField("currpay", "case when currpay is not null then currpay else 0 end as currpay").addField("amountstart+currincome-currpay", "amountend"); + if (bizdate_startdate != null && bizdate_enddate != null) { + resultDataSet = resultDataSet.addField("to_date('" + DateUtils.formatString(bizdate_startdate, "yyyy-MM-dd") + "', 'yyyy-MM-dd')", "datestart"); + resultDataSet = resultDataSet.addField("to_date('" + DateUtils.formatString(bizdate_enddate, "yyyy-MM-dd") + "', 'yyyy-MM-dd')", "dateend"); + } + return resultDataSet; + } + } + + private DataSet queryAccts() { + QFilter innerAccQFilter = new QFilter("acctclassify", "=", AcctClassifyEnum.INNER_ACCOUNT.getValue()); + innerAccQFilter.and(new QFilter("acctstatus", "!=", BankAcctStatusEnum.CLOSED.getValue())); + String appId = TmcAppEnum.IFM.getValue(); + List orgIdList = IfmSettleCenterHelper.getAuthorizedRegisteredSettleCenterIds(RequestContext.get().getCurrUserId(), TmcAppEnum.IFM.getValue(), "ifm_statementrpt", "47150e89000000ac"); + innerAccQFilter.and(new QFilter("bank.id", "in", orgIdList)); + String selectInnerAccFields = "id,company.id,bank.id,bankaccountnumber,opendate, currency.fbasedataid.id as currencyid"; + return QueryServiceHelper.queryDataSet(this.getClass().getName(), "bd_accountbanks", selectInnerAccFields, innerAccQFilter.toArray(), (String) null); + } + + private DataSet queryBeginBalance(Date bizdate_startdate, Date bizdate_enddate, List innerAcctIds) { + List balStartQFilterList = new ArrayList<>(); + if (bizdate_startdate != null) { + balStartQFilterList.add(new QFilter("bizdate", "<", DateUtils.truncateDate(bizdate_startdate))); + balStartQFilterList.add(new QFilter("accountbank.id", "in", innerAcctIds)); + DataSet beginBalanceDS = QueryServiceHelper.queryDataSet(this.getClass().getName(), "ifm_accountbalance", "id,accountbank.id,currency.id,currency.name,lstbalance,amount,bizdate", (QFilter[]) balStartQFilterList.toArray(new QFilter[0]), (String) null); + DataSet bizDateDS = beginBalanceDS.groupBy(new String[]{"accountbank.id", "currency.id"}).max("bizdate").finish(); + DataSet beginBalDS = beginBalanceDS.join(bizDateDS, JoinType.INNER).on("accountbank.id", "accountbank.id").on("currency.id", "currency.id").on("bizdate", "bizdate").select(new String[]{"accountbank.id", "currency.id", "currency.name", "amount", "bizdate"}).finish(); + return beginBalDS; + } else { + RowMeta emptyRowMeta = new RowMeta(new String[]{"accountbank.id", "currency.id", "currency.name", "amount"}, new DataType[]{DataType.LongType, DataType.LongType, DataType.StringType, DataType.BigDecimalType}); + return Algo.create("EmptyDataSet").createDataSetBuilder(emptyRowMeta).build(); + } + } + + private DataSet queryTranDetails(Date bizdate_startdate, Date bizdate_enddate, List innerAcctIds) { + QFilter qFilter = new QFilter("1", "=", 1); + + if (bizdate_startdate != null) { + qFilter.and(new QFilter("bizdate", ">", DateUtils.truncateDate(DateUtils.getNextDay(bizdate_startdate, -1)))); + } + + if (bizdate_enddate != null) { + qFilter.and(new QFilter("bizdate", "<", DateUtils.truncateDate(DateUtils.getNextDay(bizdate_enddate, 1)))); + } + + qFilter.and(new QFilter("accountbank.id", "in", innerAcctIds)); + String selectTransDetailFields = "company.id,accountbank.id,currency.id,creditamount,debitamount"; + DataSet transDetailDS = QueryServiceHelper.queryDataSet(this.getClass().getName(), "ifm_transdetail", selectTransDetailFields, qFilter.toArray(), (String) null).groupBy(new String[]{"company.id", "accountbank.id", "currency.id"}).sum("creditamount").sum("debitamount").finish(); + return transDetailDS; + } + + protected Map transQueryParam(ReportQueryParam param) { + Map paramMap = new HashMap(param.getFilter().getFilterItems().size()); + Iterator var3 = param.getFilter().getFilterItems().iterator(); + + while (var3.hasNext()) { + FilterItemInfo filterItem = (FilterItemInfo) var3.next(); + paramMap.put(filterItem.getPropName(), filterItem.getValue()); + } + + return paramMap; + } + + private Long toLong(Object o) { + if (o == null) { + return 0L; + } + String s = String.valueOf(o); + if (StringUtils.isEmpty(s)) { + return 0L; + } + try { + int index = s.indexOf("."); + index = index > -1 ? index : s.length(); + return Long.parseLong(s.substring(0, index)); + } catch (NumberFormatException e) { + logger.error("数字转化错误", e); + } + return 0L; + } + + +} \ No newline at end of file diff --git a/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/task/JszxdzdTaskPlugin.java b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/task/JszxdzdTaskPlugin.java new file mode 100644 index 0000000..8541b3d --- /dev/null +++ b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/task/JszxdzdTaskPlugin.java @@ -0,0 +1,188 @@ +package shkd.sys.sys.plugin.task; + +import kd.bos.algo.*; +import kd.bos.coderule.api.CodeRuleInfo; +import kd.bos.context.RequestContext; +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.dataentity.entity.DynamicObjectCollection; +import kd.bos.entity.report.FilterItemInfo; +import kd.bos.entity.report.ReportQueryParam; +import kd.bos.exception.KDException; +import kd.bos.logging.Log; +import kd.bos.logging.LogFactory; +import kd.bos.orm.ORM; +import kd.bos.orm.query.QCP; +import kd.bos.orm.query.QFilter; +import kd.bos.schedule.executor.AbstractTask; +import kd.bos.servicehelper.BusinessDataServiceHelper; +import kd.bos.servicehelper.QueryServiceHelper; +import kd.bos.servicehelper.coderule.CodeRuleServiceHelper; +import kd.bos.servicehelper.operation.SaveServiceHelper; +import kd.sdk.plugin.Plugin; +import kd.tmc.fbp.common.enums.BankAcctStatusEnum; +import kd.tmc.fbp.common.enums.TmcAppEnum; +import kd.tmc.fbp.common.util.DateUtils; +import kd.tmc.ifm.enums.AcctClassifyEnum; +import kd.tmc.ifm.helper.IfmSettleCenterHelper; + +import java.math.BigDecimal; +import java.util.*; + +/** + * 后台任务插件 + */ +public class JszxdzdTaskPlugin extends AbstractTask implements Plugin { + private static final Log logger = LogFactory.getLog(JszxdzdTaskPlugin.class); + @Override + public void execute(RequestContext requestContext, Map map) throws KDException { + // 获取当前月的前一个月的月初和月末的值 + Calendar cal = Calendar.getInstance(); + cal.add(Calendar.MONTH, -1); + cal.set(Calendar.DAY_OF_MONTH, 1); + Date bizdate_startdate = cal.getTime(); // 上个月第一天 + + cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH)); + Date bizdate_enddate = cal.getTime(); // 上个月最后一天 + + DataSet emptyDataSet = getData(bizdate_startdate, bizdate_enddate); + + DynamicObjectCollection dataRows = ORM.create().toPlainDynamicObjectCollection(emptyDataSet); + logger.info("数据行数:" + dataRows.size() + "\n第一条数据:" + dataRows.get(0)); + + for (DynamicObject dynamicObject : dataRows) { + Long settcenterId = dynamicObject.getLong("settcenter");//结算中心 + logger.info("结算中心:" + settcenterId); + + Long orgId = dynamicObject.getLong("org");//资金组织 + + Long inneraccountId = dynamicObject.getLong("inneraccount");//内部账户_账号 + logger.info("内部账户_账号:" + inneraccountId); + + DynamicObject[] am_accountbank = BusinessDataServiceHelper.load("am_accountbank", "id,bankaccountnumber", new QFilter("id", QCP.equals, inneraccountId).toArray()); + logger.info("内部账户 → 账户查询:" + am_accountbank[0]); + + DynamicObject[] ifm_inneracct = BusinessDataServiceHelper.load("ifm_inneracct", "id,name,number,relationacc", new QFilter("number", QCP.equals, am_accountbank[0].get("bankaccountnumber")).toArray()); + logger.info("内部账户 → 内部账户管理 → 关联账户:" + ifm_inneracct[0]); + + DynamicObjectCollection dynamicObjectCollection = ifm_inneracct[0].getDynamicObjectCollection("relationacc"); + if (dynamicObjectCollection.isEmpty()) { + continue; + } + logger.info("关联账户:" + dynamicObjectCollection); + long relationacc_id = dynamicObjectCollection.get(0).getLong("fbasedataid_Id");//银行账户 + + DynamicObject[] bd_accountbanks = BusinessDataServiceHelper.load("bd_accountbanks", "id,bankaccountnumber,bank", new QFilter("id", QCP.equals, relationacc_id).toArray()); + + DynamicObject bank_cate = bd_accountbanks[0].getDynamicObject("bank").getDynamicObject("bank_cate"); + String bank_cate_name = bank_cate.getString("name");//银行类别 + + Long currencyId = dynamicObject.getLong("currency");//币种 + + BigDecimal amountstart = dynamicObject.getBigDecimal("amountstart");//期初余额 + BigDecimal currincome = dynamicObject.getBigDecimal("currincome");//本期收入 + BigDecimal currpay = dynamicObject.getBigDecimal("currpay");//本期支出 + BigDecimal amountend = dynamicObject.getBigDecimal("amountend");//期末余额 + + DynamicObject newDynamicObject = BusinessDataServiceHelper.newDynamicObject("shkd_jszxdzd"); + + // CodeRuleServiceHelper(编码规则帮助服务类) + CodeRuleInfo codeRule = CodeRuleServiceHelper.getCodeRule(newDynamicObject.getDataEntityType().getName(), newDynamicObject, null); + + newDynamicObject.set("billno", CodeRuleServiceHelper.getNumber(codeRule, newDynamicObject));//编码 + newDynamicObject.set("billstatus", "C");//状态 + + newDynamicObject.set("shkd_jszxdata", settcenterId);//结算中心 + newDynamicObject.set("shkd_zjzzorg", orgId);//资金组织 + newDynamicObject.set("shkd_nbzh", inneraccountId);//内部账户_账号 + newDynamicObject.set("shkd_yhzhdata", relationacc_id);//银行账户 + newDynamicObject.set("shkd_yhlb", bank_cate_name);//银行类别 + newDynamicObject.set("shkd_bzdata", currencyId);//币种 + newDynamicObject.set("shkd_qcyeamount", amountstart);//期初余额 + newDynamicObject.set("shkd_bqsramount", currincome);//本期收入 + newDynamicObject.set("shkd_bqzcamount", currpay);//本期支出 + newDynamicObject.set("shkd_qmyeamount", amountend);//期末余额 + newDynamicObject.set("shkd_qsrq", bizdate_startdate);//起始日期 + newDynamicObject.set("shkd_jsrq", bizdate_enddate);//结束日期 + + SaveServiceHelper.save(new DynamicObject[]{newDynamicObject}); + } + } + + private DataSet getData(Date bizdate_startdate, Date bizdate_enddate) { + DataSet innerAccDataSet = this.queryAccts(); + List innerAcctIds = new ArrayList<>(10); + + for (Row idRow : innerAccDataSet.copy()) { + innerAcctIds.add(idRow.getLong("id")); + } + + if (innerAcctIds.isEmpty()) { + RowMeta emptyRowMeta = new RowMeta(new String[]{"empty"}, new DataType[]{DataType.StringType}); + return Algo.create("EmptyDataSet").createDataSetBuilder(emptyRowMeta).build(); + } else { + DataSet beginBalDS = this.queryBeginBalance(bizdate_startdate, bizdate_enddate, innerAcctIds); + beginBalDS = innerAccDataSet.join(beginBalDS, JoinType.LEFT).on("id", "accountbank.id").on("currencyid", "currency.id").select(new String[]{"company.id", "bank.id", "id as accountbank.id", "bankaccountnumber", "currencyid as currency.id", "currency.name", "amount as lstbalance"}).finish(); + DataSet transDetailDS = this.queryTranDetails(bizdate_startdate, bizdate_enddate, innerAcctIds); + DataSet resultDataSet = beginBalDS.join(transDetailDS, JoinType.LEFT).on("company.id", "company.id").on("accountbank.id", "accountbank.id").on("currency.id", "currency.id").select(new String[]{"bank.id settcenter", "company.id org", "accountbank.id inneraccount", "currency.id currency", "lstbalance amountstart", "creditamount currincome", "debitamount currpay"}).finish(); + resultDataSet = resultDataSet.updateField("currincome", "case when currincome is not null then currincome else 0 end as currincome").updateField("currpay", "case when currpay is not null then currpay else 0 end as currpay").addField("amountstart+currincome-currpay", "amountend"); + if (bizdate_startdate != null && bizdate_enddate != null) { + resultDataSet = resultDataSet.addField("to_date('" + DateUtils.formatString(bizdate_startdate, "yyyy-MM-dd") + "', 'yyyy-MM-dd')", "datestart"); + resultDataSet = resultDataSet.addField("to_date('" + DateUtils.formatString(bizdate_enddate, "yyyy-MM-dd") + "', 'yyyy-MM-dd')", "dateend"); + } + return resultDataSet; + } + } + + private DataSet queryAccts() { + QFilter innerAccQFilter = new QFilter("acctclassify", "=", AcctClassifyEnum.INNER_ACCOUNT.getValue()); + innerAccQFilter.and(new QFilter("acctstatus", "!=", BankAcctStatusEnum.CLOSED.getValue())); + String appId = TmcAppEnum.IFM.getValue(); + List orgIdList = IfmSettleCenterHelper.getAuthorizedRegisteredSettleCenterIds(RequestContext.get().getCurrUserId(), TmcAppEnum.IFM.getValue(), "ifm_statementrpt", "47150e89000000ac"); + innerAccQFilter.and(new QFilter("bank.id", "in", orgIdList)); + String selectInnerAccFields = "id,company.id,bank.id,bankaccountnumber,opendate, currency.fbasedataid.id as currencyid"; + return QueryServiceHelper.queryDataSet(this.getClass().getName(), "bd_accountbanks", selectInnerAccFields, innerAccQFilter.toArray(), (String) null); + } + + private DataSet queryBeginBalance(Date bizdate_startdate, Date bizdate_enddate, List innerAcctIds) { + List balStartQFilterList = new ArrayList<>(); + if (bizdate_startdate != null) { + balStartQFilterList.add(new QFilter("bizdate", "<", DateUtils.truncateDate(bizdate_startdate))); + balStartQFilterList.add(new QFilter("accountbank.id", "in", innerAcctIds)); + DataSet beginBalanceDS = QueryServiceHelper.queryDataSet(this.getClass().getName(), "ifm_accountbalance", "id,accountbank.id,currency.id,currency.name,lstbalance,amount,bizdate", (QFilter[]) balStartQFilterList.toArray(new QFilter[0]), (String) null); + DataSet bizDateDS = beginBalanceDS.groupBy(new String[]{"accountbank.id", "currency.id"}).max("bizdate").finish(); + DataSet beginBalDS = beginBalanceDS.join(bizDateDS, JoinType.INNER).on("accountbank.id", "accountbank.id").on("currency.id", "currency.id").on("bizdate", "bizdate").select(new String[]{"accountbank.id", "currency.id", "currency.name", "amount", "bizdate"}).finish(); + return beginBalDS; + } else { + RowMeta emptyRowMeta = new RowMeta(new String[]{"accountbank.id", "currency.id", "currency.name", "amount"}, new DataType[]{DataType.LongType, DataType.LongType, DataType.StringType, DataType.BigDecimalType}); + return Algo.create("EmptyDataSet").createDataSetBuilder(emptyRowMeta).build(); + } + } + + private DataSet queryTranDetails(Date bizdate_startdate, Date bizdate_enddate, List innerAcctIds) { + QFilter qFilter = new QFilter("1", "=", 1); + + if (bizdate_startdate != null) { + qFilter.and(new QFilter("bizdate", ">", DateUtils.truncateDate(DateUtils.getNextDay(bizdate_startdate, -1)))); + } + + if (bizdate_enddate != null) { + qFilter.and(new QFilter("bizdate", "<", DateUtils.truncateDate(DateUtils.getNextDay(bizdate_enddate, 1)))); + } + + qFilter.and(new QFilter("accountbank.id", "in", innerAcctIds)); + String selectTransDetailFields = "company.id,accountbank.id,currency.id,creditamount,debitamount"; + DataSet transDetailDS = QueryServiceHelper.queryDataSet(this.getClass().getName(), "ifm_transdetail", selectTransDetailFields, qFilter.toArray(), (String) null).groupBy(new String[]{"company.id", "accountbank.id", "currency.id"}).sum("creditamount").sum("debitamount").finish(); + return transDetailDS; + } + + private Map transQueryParam(ReportQueryParam param) { + Map paramMap = new HashMap(param.getFilter().getFilterItems().size()); + Iterator var3 = param.getFilter().getFilterItems().iterator(); + + while (var3.hasNext()) { + FilterItemInfo filterItem = (FilterItemInfo) var3.next(); + paramMap.put(filterItem.getPropName(), filterItem.getValue()); + } + return paramMap; + } +} \ No newline at end of file