Merge remote-tracking branch 'origin/main' into main
This commit is contained in:
commit
4e825dbe48
|
|
@ -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