|
@@ -0,0 +1,192 @@
|
|
|
+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(transDetailDataSet.copy());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取账户交易明细
|
|
|
+ * 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();
|
|
|
+ }
|
|
|
+}
|