Merge remote-tracking branch 'origin/main' into main

This commit is contained in:
陈绍鑫 2025-10-17 11:38:15 +08:00
commit 4e825dbe48
2 changed files with 554 additions and 0 deletions

View File

@ -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<Long> setIds = new HashSet<>();
if (CollectionUtils.isNotEmpty(selectedRows)) {
for (ListSelectedRow selectedRow : selectedRows) {
setIds.add(toLong(selectedRow.getPrimaryKeyValue()));
}
} else {
this.getView().showTipNotification("请选择至少一条数据");
return;
}
List<Long> 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<Long> setIds = new HashSet<>();
if (CollectionUtils.isNotEmpty(selectedRows)) {
for (ListSelectedRow selectedRow : selectedRows) {
setIds.add(toLong(selectedRow.getPrimaryKeyValue()));
}
} else {
this.getView().showTipNotification("请选择至少一条数据");
return;
}
List<Long> 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<Long> setIds = new HashSet<>();
if (CollectionUtils.isNotEmpty(selectedRows)) {
for (ListSelectedRow selectedRow : selectedRows) {
setIds.add(toLong(selectedRow.getPrimaryKeyValue()));
}
} else {
this.getView().showTipNotification("请选择至少一条数据");
return;
}
List<Long> 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<Long> 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<Long> 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<Long> innerAcctIds) {
List<QFilter> 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<Long> 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<String, Object> transQueryParam(ReportQueryParam param) {
Map<String, Object> 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;
}
}

View File

@ -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<String, Object> 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<Long> 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<Long> 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<Long> innerAcctIds) {
List<QFilter> 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<Long> 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<String, Object> transQueryParam(ReportQueryParam param) {
Map<String, Object> 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;
}
}