123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- 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<String, Object> map) throws KDException {
- // 查询生效的账户大额交易通知配置
- Set<Long> largeTransIdConfig = getMsgWarnConfig();
- largeTransIdConfig.forEach(configId -> transConfigSendMessage(configId));
- }
- protected Set<Long> 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<Long, Long> 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<Long> 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<QFilter> 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<QFilter> 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();
- }
- }
|