package kd.cosmic.jkjt.tmc.bei.task; 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.util.StringUtils; import kd.bos.workflow.engine.msg.info.MessageInfo; 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.LargeTransConfigConstant; 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.util.*; import java.util.stream.Collectors; /** * 动账提醒任务 */ public class AccChangeMsgWarnTask extends AbstractTask implements StopTask { // 预警执行时间间隔,默认查询1个小时内的数据 private int changeMinute = 1*60 ; private static final MsgWarnTypeEnum WARTYPE = MsgWarnTypeEnum.ACCCHANGE; @Override public void execute(RequestContext requestContext, Map map) throws KDException { Set largeTransIdConfig = getAccChangeRange(); if(map.containsKey("minute") && StringUtils.isNotEmpty((String) map.get("minute"))){ changeMinute = Integer.parseInt((String) map.get("minute")); } largeTransIdConfig.forEach(rangeId -> accChangeSendMessage(rangeId)); } private void accChangeSendMessage(Long rangeId) { DynamicObject accChangeRangeInfo = BusinessDataServiceHelper.loadSingle(rangeId, "nckd_accchangerange"); DynamicObject company = accChangeRangeInfo.getDynamicObject("nckd_company"); DynamicObjectCollection receiverCol = accChangeRangeInfo.getDynamicObjectCollection("nckd_receiver"); if(receiverCol == null || receiverCol.isEmpty()){ BizLog.log("消息接收人为空,不进行消息发送。"); return; } List receiverIdList = receiverCol.stream().map(receiver -> (Long) receiver.getDynamicObject("fbasedataid").getPkValue()).collect(Collectors.toList()); DynamicObjectCollection transDetailData = getTransDetailData(company); if(transDetailData == null || transDetailData.isEmpty()){ BizLog.log("没有符合条件的数据,不进行消息发送。"); return; } BizLog.log("transDetailData size " + transDetailData.size()); for(DynamicObject transDetail : transDetailData){ String uniqueKey = String.join("-", MsgWarnTypeEnum.ACCCHANGE.getValue(),transDetail.getString("billno")); if(ORM.create().exists("nckd_msgwarnlog",new QFilter("nckd_unique_key", QCP.equals,uniqueKey).toArray())){ // 消息如果已发送,就不在执行 continue; } String messageContent = getMcCenterMessage(transDetail); MessageInfo messageInfo = new MessageInfo(); messageInfo.setTitle(String.join("-",MsgWarnTypeEnum.ACCCHANGE.getName())); messageInfo.setUserIds(receiverIdList); messageInfo.setContent(messageContent); messageInfo.setTag(WARTYPE.getName()); messageInfo.setSenderId(RequestContext.get().getCurrUserId()); messageInfo.setEntityNumber(BeiBeTransDetailConstant.ENTITYID); messageInfo.setBizDataId(transDetail.getLong("id")); 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(DynamicObject transDetail) { BigDecimal debitAmount = transDetail.getBigDecimal(BeiBeTransDetailConstant.KEY_DEBITAMOUNT); BigDecimal creditAmount = transDetail.getBigDecimal(BeiBeTransDetailConstant.KEY_CREDITAMOUNT); // 付款 if(debitAmount != null && debitAmount.compareTo(BigDecimal.ZERO) > 0){ return MsgWarnTemplateConstant.formatAccChangeDebitMessage( debitAmount.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString(), transDetail.getString("company.name"), transDetail.getString("accountbank.bankaccountnumber"), transDetail.getString("bank.name"), transDetail.getString(BeiBeTransDetailConstant.KEY_OPPUNIT), transDetail.getString(BeiBeTransDetailConstant.KEY_DESCRIPTION), DateUtils.formatDate(transDetail.getDate(BeiBeTransDetailConstant.KEY_BIZTIME))); }else{ return MsgWarnTemplateConstant.formatAccChangeCreditMessage( creditAmount.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString(), transDetail.getString("oppunit"), transDetail.getString("accountbank.bankaccountnumber"), transDetail.getString("bank.name"), transDetail.getString(BeiBeTransDetailConstant.KEY_DESCRIPTION), DateUtils.formatDate(transDetail.getDate(BeiBeTransDetailConstant.KEY_BIZTIME))); } } protected DynamicObjectCollection getTransDetailData(DynamicObject company) { List filterList = new ArrayList<>(); filterList.add(new QFilter(BeiBeTransDetailConstant.KEY_COMPANY, QFilter.equals, company.getPkValue())); Date beginDate = DateUtils.getMinutesBefore(changeMinute); filterList.add(new QFilter(BeiBeTransDetailConstant.KEY_BIZTIME, QFilter.large_equals, beginDate)); filterList.add(new QFilter(BeiBeTransDetailConstant.KEY_BIZTIME, QFilter.less_than, new Date())); // 从银企同步的流水 filterList.add(new QFilter("accountbank.issetbankinterface", QFilter.equals, true)); return QueryServiceHelper.query(this.getClass().getName() ,BeiBeTransDetailConstant.ENTITYID, "id,billno,company.name,accountbank.name,accountbank.bankaccountnumber,bank.name,debitamount,creditamount,oppunit,oppbanknumber,oppbank,description,bizdate,biztime", filterList.toArray(new QFilter[0]),"bizdate desc"); } //TODO protected Set getAccChangeRange() { DynamicObjectCollection configCol = QueryServiceHelper.query("nckd_accchangerange", "id,nckd_company.id", new QFilter[]{ new QFilter(LargeTransConfigConstant.KEY_STATUS, QFilter.equals, "C"), new QFilter(LargeTransConfigConstant.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()); } }