parent
7f33236e8c
commit
ddc6ac52fc
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue