package kd.cosmic.jkjt.tmc.bei.task; import kd.bos.algo.DataSet; import kd.bos.context.RequestContext; import kd.bos.dataentity.entity.DynamicObject; import kd.bos.dataentity.entity.DynamicObjectCollection; import kd.bos.exception.KDException; import kd.bos.logging.BizLog; import kd.bos.orm.ORM; import kd.bos.orm.query.QCP; import kd.bos.orm.query.QFilter; import kd.bos.schedule.api.StopTask; import kd.bos.schedule.executor.AbstractTask; import kd.bos.servicehelper.BusinessDataServiceHelper; import kd.bos.servicehelper.QueryServiceHelper; import kd.bos.workflow.engine.msg.info.MessageInfo; import kd.cosmic.jkjt.tmc.bei.common.CommonUtils; import kd.cosmic.jkjt.tmc.bei.common.DateUtils; import kd.cosmic.jkjt.tmc.bei.common.FeishuSendMessageUtils; import kd.cosmic.jkjt.tmc.bei.common.constant.BeiBeTransDetailConstant; import kd.cosmic.jkjt.tmc.bei.common.constant.MsgWarnConfigConstant; import kd.cosmic.jkjt.tmc.bei.common.constant.MsgWarnTemplateConstant; import kd.cosmic.jkjt.tmc.bei.common.entity.MsgWarnMessageInfo; import kd.cosmic.jkjt.tmc.bei.common.enums.MsgWarnTypeEnum; import java.math.BigDecimal; import java.time.LocalDate; import java.util.*; import java.util.stream.Collectors; /** * 非直连账户每日提醒提醒 */ public class NonDirectConMsgWarnTask extends AbstractTask implements StopTask { private MsgWarnTypeEnum WARTYPE = MsgWarnTypeEnum.NONDIRECTCON; @Override public void execute(RequestContext requestContext, Map map) throws KDException { // 查询生效的账户大额交易通知配置 Set largeTransIdConfig = getMsgWarnConfig(); largeTransIdConfig.forEach(configId -> transConfigSendMessage(configId)); } protected Set getMsgWarnConfig() { DynamicObjectCollection configCol = QueryServiceHelper.query(MsgWarnConfigConstant.ENTITYID, "id,nckd_company.id", new QFilter[]{ new QFilter(MsgWarnConfigConstant.KEY_NCKD_TYPE, QFilter.equals, WARTYPE.getValue()), new QFilter(MsgWarnConfigConstant.KEY_STATUS, QFilter.equals, "C"), new QFilter(MsgWarnConfigConstant.KEY_ENABLE, QFilter.equals, "1") }); Map companyIdMap = configCol.stream() .collect(Collectors.toMap(r -> r.getLong("nckd_company.id"), r -> r.getLong("id"), (a, b) -> a)); return companyIdMap.values().stream().collect(Collectors.toSet()); } protected void transConfigSendMessage(Long configId) { DynamicObject msgWarnConfig = BusinessDataServiceHelper.loadSingle(configId, MsgWarnConfigConstant.ENTITYID); DynamicObject company = msgWarnConfig.getDynamicObject(MsgWarnConfigConstant.KEY_NCKD_COMPANY); DynamicObject financeDirectors = msgWarnConfig.getDynamicObject(MsgWarnConfigConstant.KEY_NCKD_FINANCE_DIRECTOR); DynamicObject financeLeader = msgWarnConfig.getDynamicObject(MsgWarnConfigConstant.KEY_NCKD_FINANCE_LEADER); DynamicObject unitLeader = msgWarnConfig.getDynamicObject(MsgWarnConfigConstant.KEY_NCKD_UNIT_LEADER); // 没有设置接收人时跳过 if(financeDirectors == null || financeLeader == null || unitLeader == null){ BizLog.log("消息接收人为空,不进行消息发送。"); return; } List receiverIdList = new ArrayList<>(); receiverIdList.add(financeDirectors.getLong("id")); receiverIdList.add(financeLeader.getLong("id")); LocalDate today = LocalDate.now(); // 上个月第一天 LocalDate firstDayOfLastMonth = today.minusMonths(1).withDayOfMonth(1); // 本月第一天 LocalDate firstDayOfThisMonth = today.withDayOfMonth(1); Date beginDate = Date.from(firstDayOfLastMonth.atStartOfDay().atZone(java.time.ZoneId.systemDefault()).toInstant()); Date endDate = Date.from(firstDayOfThisMonth.atStartOfDay().atZone(java.time.ZoneId.systemDefault()).toInstant()); // 自测------暂时设置成当前时间 DynamicObjectCollection transDetailData = getTransDetailData(company, beginDate,endDate); if(transDetailData == null || transDetailData.isEmpty()){ BizLog.log("没有符合条件的数据,不进行消息发送。"); return; } String messageTime = String.format("%s年%s月",today.getYear(),today.getMonthValue()-1); String timeFlag = DateUtils.formatDateMonth(beginDate); for(DynamicObject transDetail : transDetailData){ String dc = transDetail.getString("dc"); String uniqueKey = String.join("-", WARTYPE.getValue(),timeFlag,dc,transDetail.getString("nckd_payaccbanknumber")); if(ORM.create().exists("nckd_msgwarnlog",new QFilter("nckd_unique_key", QCP.equals,uniqueKey).toArray())){ // 消息如果已发送,就不在执行 continue; } String messageContent = getMcCenterMessage(messageTime,transDetail); MessageInfo messageInfo = new MessageInfo(); messageInfo.setTitle(String.join("-",WARTYPE.getName())); messageInfo.setUserIds(receiverIdList); messageInfo.setContent(messageContent); messageInfo.setTag(WARTYPE.getName()); messageInfo.setSenderId(RequestContext.get().getCurrUserId()); messageInfo.setEntityNumber("nckd_msgwarnconfig"); messageInfo.setBizDataId(configId); String feishuMessage = MsgWarnTemplateConstant.getFeishuTemplate(WARTYPE.getName(),messageContent); MsgWarnMessageInfo warnMessageInfo = new MsgWarnMessageInfo(WARTYPE.getValue(), company.getString("name"), uniqueKey, feishuMessage, messageInfo); FeishuSendMessageUtils.sendFeishuMessage(warnMessageInfo); } } protected String getMcCenterMessage(String time,DynamicObject transDetail) { String dc = transDetail.getString("dc"); if("1".equals(dc)){ return MsgWarnTemplateConstant.formatNonDirectMessageDebit( time, transDetail.getString("nckd_payaccount"), transDetail.getString("nckd_payaccbanknumber"), transDetail.getString("nckd_payaccbank"), transDetail.getString("nckd_count"), transDetail.getBigDecimal("nckd_amount").setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString()); }else{ return MsgWarnTemplateConstant.formatNonDirectMessageCredit( time, transDetail.getString("nckd_payaccount"), transDetail.getString("nckd_payaccbanknumber"), transDetail.getString("nckd_payaccbank"), transDetail.getString("nckd_count"), transDetail.getBigDecimal("nckd_amount").setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString()); } } protected DynamicObjectCollection getTransDetailData(DynamicObject company , Date beginDate , Date endDate){ DataSet debitDetailDataSet = getTransDetailDataSet(company, beginDate,endDate,true); // DataSet crediDetailDataSet = getTransDetailDataSet(company, beginDate,endDate,false); // DataSet transDetailDataSet = debitDetailDataSet.union(crediDetailDataSet); // // 看报表与消息的兼容程度,再看怎么处理,暂时转成动态对象集合 return ORM.create().toPlainDynamicObjectCollection(debitDetailDataSet.copy()); } protected DataSet getPaymentDataSet(DynamicObject company , Date beginDate , Date endDate) { List filterList = new ArrayList<>(); filterList.add(new QFilter("org", QFilter.equals, company.getPkValue())); if(beginDate != null){ filterList.add(new QFilter(BeiBeTransDetailConstant.KEY_BIZTIME, QFilter.large_equals, beginDate)); } if(endDate != null){ filterList.add(new QFilter(BeiBeTransDetailConstant.KEY_BIZTIME, QFilter.less_than, endDate)); } filterList.add(new QFilter("settletype.number", QCP.equals,"JSFS13")); filterList.add(new QFilter("billstatus", QCP.equals,"D")); // DataSet dataSet = QueryServiceHelper.queryDataSet(this.getClass().getName(), "cas_paybill", // "id,company.id,accountbank.id,"+amountField+",biztime", // filterList.toArray(new QFilter[0]), ""); return null; } /** * 获取账户交易明细 * 1.非日常报销账户 * 2. * @param company * @param beginDate * @return */ protected DataSet getTransDetailDataSet(DynamicObject company , Date beginDate , Date endDate,boolean isDebitamount){ String amountField = isDebitamount?BeiBeTransDetailConstant.KEY_DEBITAMOUNT:BeiBeTransDetailConstant.KEY_CREDITAMOUNT; List filterList = new ArrayList<>(); filterList.add(new QFilter(BeiBeTransDetailConstant.KEY_COMPANY, QFilter.equals, company.getPkValue())); if(beginDate != null){ filterList.add(new QFilter(BeiBeTransDetailConstant.KEY_BIZTIME, QFilter.large_equals, beginDate)); } if(endDate != null){ filterList.add(new QFilter(BeiBeTransDetailConstant.KEY_BIZTIME, QFilter.less_than, endDate)); } filterList.add(new QFilter("nckd_generatemethod", QCP.equals,"Manual import")); filterList.add(new QFilter(amountField, QCP.large_than,BigDecimal.ZERO)); DataSet dataSet = QueryServiceHelper.queryDataSet(this.getClass().getName(), BeiBeTransDetailConstant.ENTITYID, "id,company.id,accountbank.id,"+amountField+",biztime", filterList.toArray(new QFilter[0]), ""); // 通过公司、我方账号,对方账号分组,求和 DataSet amountDataSet = dataSet .groupBy(new String[]{"company.id", "accountbank.id"}).sum(amountField).count("totaltimes").finish() .select("company.id,accountbank.id,"+amountField+" totalamount,totaltimes"); Set companyIdSet = CommonUtils.getFieldValue(amountDataSet, "company.id"); DataSet companyDataSet = QueryServiceHelper .queryDataSet(this.getClass().getName(), "bos_org", "id,name", new QFilter("id", QCP.in, companyIdSet).toArray(), ""); // 查询银行账户 Set accountBankIdSet = CommonUtils.getFieldValue(amountDataSet, "accountbank.id"); DataSet accountBankDataSet = QueryServiceHelper .queryDataSet(this.getClass().getName(), "bd_accountbanks", "id,bankaccountnumber,bank.name", new QFilter("id", QCP.in, accountBankIdSet).toArray(), ""); return amountDataSet .leftJoin(companyDataSet).on("company.id", "id") .select( new String[] {"company.id nckd_company", "accountbank.id accountbankid","totaltimes nckd_count","totalamount nckd_amount"}, new String[] {"name nckd_payaccount"}).finish() .leftJoin(accountBankDataSet).on("accountbankid", "id") .select(new String[] {"nckd_company", "nckd_payaccount","nckd_count","nckd_amount", String.format("'%s' dc",isDebitamount?"1":"-1")}, new String[]{"bankaccountnumber nckd_payaccbanknumber", "bank.name nckd_payaccbank"}) .finish(); } }