Commit 1e6b317f by 王德峰

bb 项目初始化

    清理部分
    清理wk任务
parent da9236e7
/**
* abssqr.comInc.
* Copyright(c)2019-2019AllRightsReserved.
*/
package com.abssqr.plat.biz.api.report;
import com.abssqr.plat.biz.shared.report.wk.WkManagerReportBuilder;
import com.abssqr.plat.biz.support.ServiceSupport;
import com.abssqr.plat.common.facade.enums.CommonErrorCodeEnum;
import com.abssqr.plat.common.facade.enums.ReportTypeEnum;
import com.abssqr.plat.common.facade.model.plan.PlanBase;
import com.abssqr.plat.common.facade.model.report.DailyReportDateField;
import com.abssqr.plat.common.facade.model.report.MonthReportDateField;
import com.abssqr.plat.common.facade.model.report.PlanReport;
import com.abssqr.plat.common.facade.model.report.wk.WkManagerReport;
import com.abssqr.plat.common.facade.param.base.CommonPlanQryParam;
import com.abssqr.plat.common.facade.param.reportForm.ReportFormAstParam;
import com.abssqr.plat.common.facade.param.reportForm.ReportFormMgrParam;
import com.abssqr.plat.common.facade.service.report.ReportService;
import com.abssqr.plat.common.facade.validation.Valid;
import com.abssqr.plat.common.model.exception.AbssqrBizException;
import com.abssqr.plat.common.model.repo.plan.PlanRepo;
import com.abssqr.plat.common.model.repo.report.PlanReportRepo;
import com.general.system.common.util.DateTimeUtil;
import com.general.system.common.util.LogUtil;
import com.general.system.common.util.MessageUtil;
import com.general.system.common.util.SystemDateUtil;
import com.google.common.collect.Lists;
import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
/**
*
* @author yangcheng
* @version ReportServiceImpl.java, v0.12019-07-0114:19 yangchengExp$
*/
@Component
public class ReportServiceImpl extends ServiceSupport implements ReportService {
//打印日志问题:需要打印错误日志,开启服务日志,日志服务需要展示什么参数,然后在去查询,拼接业务数据然后返回;,并且起事务;
//设置时间段问题当前日期情况
private static final Logger LOGGER = LoggerFactory.getLogger(ReportServiceImpl.class);
@Autowired
private PlanReportRepo planReportRepo;
@Autowired
private WkManagerReportBuilder wkManagerReportBuilder;
@Autowired
private PlanRepo planRepo;
/**
* 计划报表
* @param param
* @return
*/
@Override
public WkManagerReport getReportFormPlan(@Valid ReportFormMgrParam param) {
return this.doQry(param, () -> {
String begin = param.getBeginTime();
String end = param.getEndTime();
//检查能否解析日期字段
MonthReportDateField beginField = new MonthReportDateField();
beginField.parse(begin);
MonthReportDateField endField = new MonthReportDateField();
endField.parse(end);
Date beginDate = DateTimeUtil.parseInTolerance(begin);
Date endDate = DateTimeUtil.parseInTolerance(end);
dateJudge(beginDate, endDate);
//当判断通过的时候打印日志
LogUtil.info(LOGGER, "计划报表统计:计划编号={0}, 开始时间={1}, 结束时间={2},",
param.getPlanNo(), begin, end);
PlanBase planBase = planRepo.getPlanByNo(param.getPlanNo());
return wkManagerReportBuilder.getReport(planBase,begin,end);
});
}
/**
* 资产报表
* @param param
* @return
*/
@Override
public List<PlanReport> getReportFormAst(@Valid ReportFormAstParam param) {
return this.doQry(param, () -> {
Date beginDate = DateTimeUtil.parseInTolerance(param.getBeginDate());
Date endDate = DateTimeUtil.parseInTolerance(param.getEndDate());
dateJudge(beginDate, endDate);
LogUtil.info(LOGGER, "资产报表统计:计划编号={0}, 开始时间={1}, 结束时间={2},",
param.getPlanNo(), param.getBeginDate(), param.getEndDate());
DailyReportDateField beginField = new DailyReportDateField();
beginField.setRptDate(beginDate);
DailyReportDateField endField = new DailyReportDateField();
endField.setRptDate(endDate);
return planReportRepo.getPlansByDate(param.getPlanNo(), beginField.desc(), endField.desc(),
ReportTypeEnum.RPT001);
});
}
@Override
public List<PlanReport> getReportFormMonthEnd(@Valid CommonPlanQryParam param) {
return this.doQry(param, () -> {
LogUtil.info(LOGGER, "资产报表统计:计划编号={0}", param.getPlanNo());
PlanBase planBase = planRepo.getPlanByNo(param.getPlanNo());
Date effectDate = planBase.getEffectDate();
Date curDate = SystemDateUtil.getSystemDate();
List<String> monthEndDate = Lists.newArrayList();
Date startDate = DateTimeUtil.parseFromYMD(
DateTimeUtil.format(effectDate, DateTimeUtil.FORMAT_DATE_YYYYMM) + "01");
// 当前日期所在月,肯定没有月报产生
while (DateTimeUtil.calMonthDiff(startDate, curDate) > 0) {
startDate = DateTimeUtil.addMonths(startDate, 1);
monthEndDate.add(DateTimeUtil.formatYMD(DateTimeUtil.addDays(startDate, -1)));
}
if (CollectionUtils.isEmpty(monthEndDate)) {
throw new AbssqrBizException(
MessageUtil.formatMsg("计划生效日期[{0}]和当前日期[{1}]间,无法生成月末报表", effectDate, curDate));
}
return planReportRepo.getPlansByDateList(param.getPlanNo(), ReportTypeEnum.RPT001, monthEndDate);
});
}
private boolean dateJudge(Date begin, Date end) {
Date nowTime = DateTimeUtil.getStandardDate(SystemDateUtil.getSystemDate());
if (DateTimeUtil.calcDayDiff(end, begin) < 0) {
String errorText = MessageUtil.formatMsg("无法生成报表:结束时间{0}小于开始时间{1}", end, begin);
LogUtil.error(LOGGER, errorText);
throw new AbssqrBizException(errorText, CommonErrorCodeEnum.INVALID_PARAM);
}
if (DateTimeUtil.calcDayDiff(end, nowTime) >= 0) {
String errorText = MessageUtil.formatMsg("无法生成报表:结束时间[{0}]必须小于当前时间[{1}],否则报表还未生成", end, nowTime);
LogUtil.error(LOGGER, errorText);
throw new AbssqrBizException(errorText, CommonErrorCodeEnum.INVALID_PARAM);
}
return true;
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2018 All Rights Reserved.
*/
package com.abssqr.plat.biz.shared.dispatcher.buyBackMatch;
import com.abssqr.plat.biz.shared.dispatcher.DispatcherExecutorTemp;
import com.abssqr.plat.biz.shared.handler.LoanAstBuyBackMatchHandler;
import com.abssqr.plat.common.facade.enums.TaskStatusEnum;
import com.abssqr.plat.common.model.domain.task.CommonTask;
import com.abssqr.plat.common.model.repo.task.CommonTaskRepository;
import com.general.system.common.util.DateTimeUtil;
import com.general.system.common.util.LogUtil;
import com.general.system.common.util.SystemDateUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* 资产回购匹配执行器
*/
@Component
public class LoanAstBuyBackMatchExecutor extends DispatcherExecutorTemp<CommonTask> {
private final static Logger LOGGER = LoggerFactory.getLogger(LoanAstBuyBackMatchExecutor.class);
@Autowired
private CommonTaskRepository commonTaskRepository;
@Autowired
private LoanAstBuyBackMatchHandler loanAstBuyBackMatchHandler;
@Override
public CommonTask doExecute(CommonTask node) {
LogUtil.info(LOGGER, "执行回购匹配任务[{0}]-start", node.getContext());
loanAstBuyBackMatchHandler.execute(node.getContext(), status -> {
if (TaskStatusEnum.SUCCESS == status) {
node.setTaskStatus(status);
markSuccess(node);
} else {
markFail(node, "执行回购匹配任务失败");
}
LogUtil.info(LOGGER, "执行回购匹配任务[{0}]-end,status=[{1}]", node.getContext(), status);
});
return node;
}
@Override
protected CommonTask markSuccess(CommonTask node) {
commonTaskRepository.updateTaskStatus(node.getId(), TaskStatusEnum.SUCCESS, TaskStatusEnum.EXECUTING, "");
return node;
}
@Override
protected CommonTask markFail(CommonTask node, String failMessage) {
// 因异常引起的重试
Date nextTime = DateTimeUtil.addSecond(SystemDateUtil.getSystemDate(), 60);
String msg = failMessage.length() > 2000 ? failMessage.substring(0, 2000) : failMessage;
commonTaskRepository.updateTaskExep(nextTime, node.getId(), msg);
return node;
}
@Override
protected CommonTask markException(CommonTask node, String failMessage) {
return markFail(node, failMessage);
}
@Override
protected String getName() {
return LoanAstBuyBackMatchStarter.JOB_NAME;
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2018 All Rights Reserved.
*/
package com.abssqr.plat.biz.shared.dispatcher.buyBackMatch;
import com.abssqr.plat.biz.shared.dispatcher.DispatcherLoader;
import com.abssqr.plat.common.facade.enums.CommonTaskTypeEnum;
import com.abssqr.plat.common.facade.enums.TaskStatusEnum;
import com.abssqr.plat.common.model.domain.task.CommonTask;
import com.abssqr.plat.common.model.repo.job.JobControlRepository;
import com.abssqr.plat.common.model.repo.task.AstSyncTaskCtrRepo;
import com.abssqr.plat.common.model.repo.task.CommonTaskRepository;
import com.abssqr.plat.core.service.ast.LoanAstBuyBackManager;
import com.abssqr.plat.core.service.host.HostManager;
import com.general.system.common.util.SystemDateUtil;
import com.general.system.common.util.ThreadUtil;
import com.general.system.common.util.VarChecker;
import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.support.TransactionTemplate;
import java.util.List;
import java.util.stream.Collectors;
/**
* 资产转让
*
* @author bangis.wangdf
* @version com.abssqr.plat.biz.shared.task.task: AstTrTaskLoader.java, v 0.1 2018-01-08 00:59 hongwei.wang Exp $
*/
@Component
public class LoanAstBuyBackMatchLoader implements DispatcherLoader<CommonTask> {
private final static Logger LOGGER = LoggerFactory.getLogger(LoanAstBuyBackMatchLoader.class);
@Autowired
private TransactionTemplate transactionTemplate;
@Autowired
private JobControlRepository jobControlRepository;
@Autowired
private CommonTaskRepository commonTaskRepository;
@Autowired
private HostManager hostManager;
private static long sleepTime = 1000 * 60;
/**
* 装载待分发节点
*
* @param size
* @return
*/
@Override
public List<CommonTask> loadToDoNodes(int size) {
ThreadUtil.sleep(sleepTime, LOGGER);
return transactionTemplate.execute(transactionStatus -> {
// job加锁
jobControlRepository.lockByJobName(LoanAstBuyBackMatchStarter.JOB_NAME);
// 获取回购筛选任务
List<CommonTask> existsTask = commonTaskRepository.selectUnifinishTaskByType(CommonTaskTypeEnum.BUY_BACK_MATCH);
// 过滤 排除非初始化的和下次执行时间大于当前时间的任务
existsTask = existsTask.stream()
.filter(item -> item.getTaskStatus() == TaskStatusEnum.INIT
&& SystemDateUtil.getSystemDate().compareTo(item.getNextExecTime()) > 0)
.collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(existsTask)) {
int cnt = commonTaskRepository
.updateTaskExec(SystemDateUtil.getSystemDate(), hostManager.getHostInfo().getHostName(),
existsTask);
VarChecker.checkArgument(cnt==existsTask.size(),"[LoanAstBuyBackMatchLoader] - 更新条数与预期不符,可能存在并发问题");
}
return existsTask;
});
}
/**
* 设置休眠时间 测试用
* @param time
*/
public void setSleepTime(Long time){
sleepTime = time;
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2018 All Rights Reserved.
*/
package com.abssqr.plat.biz.shared.dispatcher.buyBackMatch;
import com.abssqr.plat.biz.shared.dispatcher.DispatcherExecutor;
import com.abssqr.plat.biz.shared.dispatcher.DispatcherLoader;
import com.abssqr.plat.biz.shared.dispatcher.DispatcherStarter;
import com.abssqr.plat.common.model.domain.task.CommonTask;
import com.abssqr.plat.common.model.repo.task.CommonTaskRepository;
import com.abssqr.plat.core.service.host.HostManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* @author bangis.wangdf
* @version com.abssqr.plat.biz.shared.task.task: AstTrTaskDispatcherManager.java, v 0.1 2018-01-08 02:42 hongwei
* .wang Exp $
*/
@Component
public class LoanAstBuyBackMatchStarter extends DispatcherStarter<CommonTask> {
@Autowired
private LoanAstBuyBackMatchExecutor loanAstBuyBackMatchExecutor;
@Autowired
private LoanAstBuyBackMatchLoader loanAstBuyBackMatchLoader;
@Autowired
private HostManager hostManager;
@Autowired
private CommonTaskRepository commonTaskRepository;
public static String JOB_NAME = "LoanAstBuyBackMatchStarter";
@Value("${dispatcher.buyBack.coreSize}")
private int coreSize;
@Value("${dispatcher.buyBack.maxSize}")
private int maxSize;
@Value("${dispatcher.buyBack.hungrySize}")
private int hungrySize;
@Value("${dispatcher.buyBack.queueSize}")
private int queueSize = 200;
@Override
protected void recovery() {
commonTaskRepository.updateHangTasksByIp(hostManager.getHostInfo().getHostName());
}
@Override
public String getName() {
return JOB_NAME;
}
@Override
protected int getCoreSize() {
return coreSize;
}
@Override
protected int getMaxSize() {
return maxSize;
}
@Override
protected int getQueueSize() {
return queueSize;
}
@Override
protected int getHungrySize() {
return hungrySize;
}
@Override
protected DispatcherLoader<CommonTask> getLoader() {
return loanAstBuyBackMatchLoader;
}
@Override
protected DispatcherExecutor<CommonTask> getExecutor() {
return loanAstBuyBackMatchExecutor;
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2018 All Rights Reserved.
*/
package com.abssqr.plat.biz.shared.dispatcher.buyback;
import com.abssqr.plat.biz.shared.dispatcher.DispatcherExecutorTemp;
import com.abssqr.plat.biz.shared.handler.LoanAstBuyBackHandler;
import com.abssqr.plat.common.dal.mysql.auto.dao.TrTaskDAO;
import com.abssqr.plat.common.facade.enums.TaskStatusEnum;
import com.abssqr.plat.common.model.domain.task.TrTask;
import com.abssqr.plat.common.model.repo.tr.TrTaskRepo;
import com.general.system.common.util.DateTimeUtil;
import com.general.system.common.util.LogUtil;
import com.general.system.common.util.SystemDateUtil;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* 资产回购交易执行器
*
* @author hanfei
* @version $Id: LoanAstBuyBackExecutor.java, v 0.1 2020-02-11 5:12 PM hanfei Exp $
*/
@Component
public class LoanAstBuyBackExecutor extends DispatcherExecutorTemp<TrTask> {
private final static Logger LOGGER = LoggerFactory.getLogger(
LoanAstBuyBackExecutor.class);
// 单位(秒)
private final static int DEFAULT_STEP = 5;
@Autowired
private LoanAstBuyBackHandler loanAstBuyBackHandler;
@Autowired
private TrTaskRepo trTaskRepo;
@Override
public TrTask doExecute(TrTask node) {
LogUtil.info(LOGGER, "回购处理astNo[{0}]batchNo[{1}]packType[{2}]",
node.getAstNo(), node.getBatchNo(), node.getPackType());
boolean result = false;
Date befDt = SystemDateUtil.getSystemDate();
try {
// 加锁捞取 幂等判断
TrTask lockedNode = trTaskRepo.lockByIdNowait(node.getId());
if (null == lockedNode || lockedNode.getTaskStatus() != TaskStatusEnum.EXECUTING) {
LogUtil.warn(LOGGER, "资产回购任务[{0}]状态[{1}]不为执行中,可能存在并发问题", node.getId(),
(lockedNode != null) ? lockedNode.getTaskStatus() : "-");
return lockedNode;
}
// 执行回购交易操作
result = loanAstBuyBackHandler.astBuyBackExecute(node);
if (result) {
return markSuccess(node);
} else {
LogUtil.error(LOGGER, "资产回购任务[{0}]状态[{1}]执行失败", node.getAstNo(), node);
return markFail(node, "资产回购执行失败");
}
} finally {
Date endDt = SystemDateUtil.getSystemDate();
LogUtil.info(LOGGER, "[LoanAstBuyBackExecutor] astId=[{0}], res={1}, elipse={2}ms",
node.getAstNo(), result, (endDt.getTime() - befDt.getTime()));
}
}
@Autowired
private TrTaskDAO trTaskDAO;
/**
* 标记成功
*
* @param node
*/
@Override
protected TrTask markSuccess(TrTask node) {
node.setTaskStatus(TaskStatusEnum.SUCCESS);
trTaskDAO.updateTaskStatus(node.getId(), "", TaskStatusEnum.SUCCESS.getCode());
return node;
}
/**
* 标记失败
*
* @param node
* @param failMessage
*/
@Override
protected TrTask markFail(TrTask node, String failMessage) {
node.setTaskStatus(TaskStatusEnum.FAILURE);
trTaskDAO.updateTaskStatus(node.getId(), failMessage, TaskStatusEnum.FAILURE.getCode());
return node;
}
/**
* 标记异常
*
* @param node
* @param failMessage
*/
@Override
protected TrTask markException(TrTask node, String failMessage) {
if (StringUtils.isBlank(failMessage)) {
failMessage = "回购交易执行失败";
}
node.setTaskStatus(TaskStatusEnum.INIT);
trTaskDAO.updateTaskExep(DateTimeUtil.addSecond(SystemDateUtil.getSystemDate(), DEFAULT_STEP),
node.getId(),
failMessage.length() > 2000 ? failMessage.substring(0, 1990) : failMessage);
return node;
}
@Override
protected String getName() {
return LoanAstBuyBackStarter.BUY_BACK_NAME;
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2018 All Rights Reserved.
*/
package com.abssqr.plat.biz.shared.dispatcher.buyback;
import com.abssqr.plat.biz.shared.dispatcher.DispatcherLoader;
import com.abssqr.plat.common.dal.mysql.auto.dao.TrTaskDAO;
import com.abssqr.plat.common.dal.mysql.auto.dataobject.TrTaskDO;
import com.abssqr.plat.common.facade.enums.AstPackTradeTypeEnum;
import com.abssqr.plat.common.facade.enums.TaskStatusEnum;
import com.abssqr.plat.common.model.convertor.TrTaskConvert;
import com.abssqr.plat.common.model.domain.ast.LoanAstBuyBackPack;
import com.abssqr.plat.common.model.domain.task.TrCtrTask;
import com.abssqr.plat.common.model.domain.task.TrTask;
import com.abssqr.plat.common.model.repo.tr.TrCtrTaskRepo;
import com.abssqr.plat.core.service.accounting.OrgAcctDayComponent;
import com.abssqr.plat.core.service.ast.LoanAstBuyBackManager;
import com.abssqr.plat.core.service.host.HostManager;
import com.general.system.common.util.LogUtil;
import com.general.system.common.util.SystemDateUtil;
import com.general.system.common.util.VarChecker;
import com.general.system.tool.util.ToolUtil;
import com.google.common.collect.Lists;
import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.support.TransactionTemplate;
import java.util.Date;
import java.util.List;
/**
* 回购转让交易任务捞取
* @author hanfei
* @version $Id: LoanAstBuyBackLoader.java, v 0.1 2020-02-11 5:15 PM hanfei Exp $
*/
@Component
public class LoanAstBuyBackLoader implements DispatcherLoader<TrTask> {
private final static Logger LOGGER = LoggerFactory.getLogger(
LoanAstBuyBackLoader.class);
@Autowired
private TrTaskDAO trTaskDAO;
@Autowired
private TransactionTemplate transactionTemplate;
@Autowired
private HostManager hostManager;
@Autowired
private TrCtrTaskRepo trCtrTaskRepo;
@Autowired
private LoanAstBuyBackManager loanAstBuyBackManager;
@Autowired
private OrgAcctDayComponent orgAcctDayComponent;
/**
* 装载待分发节点
*
* @param size
* @return
*/
@Override
public List<TrTask> loadToDoNodes(int size) {
Date curDate = orgAcctDayComponent.getTrfAcctDay().getStandardDate();
// 1、捞取回购任务总控STATUS为init
List<TrCtrTask> trCtrTasks = trCtrTaskRepo.queryInitCtrTaskList(
curDate, TaskStatusEnum.INIT, AstPackTradeTypeEnum.BUY_BACK_BIZ);
if (ToolUtil.isEmpty(trCtrTasks)) {
return Lists.newArrayList();
}
TrCtrTask trCtrTask = null;
for(TrCtrTask one : trCtrTasks){
// 2、捞取对应回购筛选包校验 PACK_STATUS为SCEEN_FIS 和 APPROVE_STATUS为PASSED
LoanAstBuyBackPack pack = loanAstBuyBackManager.getByPackCode(one.getPackCode());
if (pack.canExec()){
trCtrTask = one;
break;
}
}
// 没有可执行任务
if (trCtrTask == null){
return Lists.newArrayList();
}
Long canExecId = trCtrTask.getId();
return transactionTemplate.execute(transactionStatus -> {
TrCtrTask lockedCtrTask = trCtrTaskRepo.lockById(canExecId);
if (lockedCtrTask.getTaskStatus() != TaskStatusEnum.INIT) {
return Lists.newArrayList();
}
Long undoCnt = trTaskDAO.cntInitTaskByBatchNo(lockedCtrTask.getBatchNo());
if (undoCnt == 0) {
LogUtil.info(LOGGER, "转让控制[{0}]无待转任务,标记结束", lockedCtrTask);
trCtrTaskRepo.updateStatus(lockedCtrTask.getId(), TaskStatusEnum.SUCCESS);
return Lists.newArrayList();
}
trCtrTaskRepo.updateExecTms(lockedCtrTask.getId(), lockedCtrTask.getExecTimes() + 1);
// 3、捞取回购资产任务TASK_STATUS为init
List<TrTaskDO> taskDOS = trTaskDAO.selectInitTask(SystemDateUtil.getSystemDate(), Long.valueOf(size),
lockedCtrTask.getBatchNo(), AstPackTradeTypeEnum.BUY_BACK_BIZ.getCode());
if (CollectionUtils.isEmpty(taskDOS)) {
return Lists.newArrayList();
}
// 4、更新任务TASK_STATUS为exec
int count = trTaskDAO.updateTaskExec(SystemDateUtil.getSystemDate(),
hostManager.getHostInfo().getHostName(),
taskDOS);
VarChecker.checkEquals(count, taskDOS.size(), "[TaskLoader.loadToDoNodes]更新任务数跟期望数不一致,实际更新:{0},期望更新:{1}",
count,
taskDOS.size());
LogUtil.info(LOGGER, "转让控制[{0}]捞取[{1}]待执行任务", lockedCtrTask, count);
return TrTaskConvert.convertDTOs(taskDOS);
});
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2018 All Rights Reserved.
*/
package com.abssqr.plat.biz.shared.dispatcher.buyback;
import com.abssqr.plat.biz.shared.dispatcher.DispatcherExecutor;
import com.abssqr.plat.biz.shared.dispatcher.DispatcherLoader;
import com.abssqr.plat.biz.shared.dispatcher.DispatcherStarter;
import com.abssqr.plat.common.dal.mysql.auto.dao.TrTaskDAO;
import com.abssqr.plat.common.facade.enums.AstPackTradeTypeEnum;
import com.abssqr.plat.common.model.domain.task.TrTask;
import com.abssqr.plat.core.service.host.HostManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* 回购转让交易任务组件绑定
* @author hanfei
* @version $Id: LoanAstBuyBackLoader.java, v 0.1 2020-02-11 5:15 PM hanfei Exp $
*/
@Component
public class LoanAstBuyBackStarter extends DispatcherStarter<TrTask> {
@Autowired
private LoanAstBuyBackExecutor loanAstBuyBackExecutor;
@Autowired
private LoanAstBuyBackLoader loanAstBuyBackLoader;
@Autowired
private HostManager hostManager;
@Autowired
private TrTaskDAO trTaskDAO;
@Value("${dispatcher.tr.coreSize}")
private int coreSize;
@Value("${dispatcher.tr.maxSize}")
private int maxSize;
@Value("${dispatcher.tr.hungrySize}")
private int hungrySize;
@Value("${dispatcher.tr.queueSize}")
private int queueSize = 200;
@Override
protected void recovery() {
trTaskDAO.updateHangTasksByIp(
hostManager.getHostInfo().getHostName(), AstPackTradeTypeEnum.BUY_BACK_BIZ.getCode());
}
public static String BUY_BACK_NAME = "LoanAstBuyBackStarter";
@Override
public String getName() {
return BUY_BACK_NAME;
}
@Override
protected int getCoreSize() {
return coreSize;
}
@Override
protected int getMaxSize() {
return maxSize;
}
@Override
protected int getQueueSize() {
return queueSize;
}
@Override
protected int getHungrySize() {
return hungrySize;
}
@Override
protected DispatcherLoader<TrTask> getLoader() {
return loanAstBuyBackLoader;
}
@Override
protected DispatcherExecutor<TrTask> getExecutor() {
return loanAstBuyBackExecutor;
}
}
package com.abssqr.plat.biz.shared.dispatcher.capitalAssetMatch;
import com.abssqr.plat.biz.shared.dispatcher.DispatcherExecutorTemp;
import com.abssqr.plat.biz.shared.handler.CapitalAstMatchHandler;
import com.abssqr.plat.biz.shared.handler.CapitalAstUnMatchHandler;
import com.abssqr.plat.common.facade.enums.CommonErrorCodeEnum;
import com.abssqr.plat.common.facade.enums.TaskStatusEnum;
import com.abssqr.plat.common.model.domain.task.CommonTask;
import com.abssqr.plat.common.model.exception.AbssqrBizException;
import com.abssqr.plat.common.model.repo.task.CommonTaskRepository;
import com.abssqr.plat.core.service.accounting.OrgAcctDayComponent;
import com.general.system.common.model.exception.BaseCommonException;
import com.general.system.common.util.DateTimeUtil;
import com.general.system.common.util.LogUtil;
import com.general.system.common.util.MessageUtil;
import com.general.system.common.util.SystemDateUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.support.TransactionTemplate;
import java.util.Date;
/**
* 资金资产绑定/解绑
*/
@Component
public class PlanCapitalAssertMatchExecutor extends DispatcherExecutorTemp<CommonTask> {
private final static Logger LOGGER = LoggerFactory.getLogger(
PlanCapitalAssertMatchExecutor.class);
@Autowired
CommonTaskRepository commonTaskRepository;
@Autowired
CapitalAstMatchHandler capitalAstMatchHandler;
@Autowired
CapitalAstUnMatchHandler capitalAstUnMatchHandler;
@Autowired
private OrgAcctDayComponent orgAcctDayComponent;
@Autowired
TransactionTemplate transactionTemplate;
@Override
protected CommonTask doExecute(CommonTask node) {
Date absAccountDate = orgAcctDayComponent.getTrfAcctDay().getStandardDate();
StringBuilder failMessage=new StringBuilder();
boolean isSucc=true;
switch (node.getTaskType()) {
//解绑任务
case CAPTITALASSERT_UNMATCH: {
LogUtil.info(LOGGER, "执行资金资产解绑-start", node.getContext());
String allocNo = node.getBizNo();
String planNo = node.getContext();
try{
isSucc=transactionTemplate.execute(status -> {
return capitalAstUnMatchHandler.execute(planNo,allocNo,absAccountDate);
});
}catch (Exception e){
LogUtil.error(LOGGER, "计划编号[{0}],兑付单编号[{1}]执行资金资产解绑失败错误信息:[3]",planNo,allocNo,e.getMessage());
isSucc=false;
failMessage.append(e.getMessage());
}
markStatus(isSucc,node,failMessage.toString());
LogUtil.info(LOGGER, "执行资金资产解绑-end", node.getContext());
break;
}
//解绑匹配任务
case UNMATCH_CAPTITALASSERT_MATCH: {
try{
isSucc=transactionTemplate.execute(status -> {
return doMatch(node);
});
}catch (Exception e){
LogUtil.error(LOGGER, "计划编号[{0}]执行资金资产匹配败错误信息:[3]",node.getContext(),e.getMessage());
isSucc=false;
failMessage.append(e.getMessage());
}
markStatus(isSucc,node,failMessage.toString());
break;
}
//同步匹配任务
case SYNC_CAPTITALASSERT_MATCH: {
try{
isSucc=transactionTemplate.execute(status -> {
return doMatch(node);
});
}catch (Exception e){
LogUtil.error(LOGGER, "计划编号[{0}]执行资金资产匹配败错误信息:[3]",node.getContext(),e.getMessage());
isSucc=false;
failMessage.append(e.getMessage());
}
markStatus(isSucc,node,failMessage.toString());
break;
}
default:{
throw new BaseCommonException("不支持的任务类型:"+node.getTaskType().getCode());
}
}
return node;
}
private boolean doMatch(CommonTask node){
LogUtil.info(LOGGER, "执行解绑匹配-start", node.getContext());
String bizNo = node.getBizNo();
String[] split = bizNo.split("-");
if(split==null){
throw new AbssqrBizException(
MessageUtil.formatMsg("Id为[{0}]的CommonTaskBizNo有误 ", node.getId()),
CommonErrorCodeEnum.INVALID_PARAM, false);
}
String planNo=node.getContext();
String accDateStr=split[2];
Date acctDate = DateTimeUtil.parseFromYMD(accDateStr);
boolean ret= capitalAstMatchHandler.execute(planNo,acctDate);
LogUtil.info(LOGGER, "执行解绑匹配-end", node.getContext());
return ret;
}
private void markStatus(Boolean status,CommonTask node,String errorMessage){
if(status){
markSuccess(node);
return;
}
markFail(node,errorMessage);
}
@Override
protected CommonTask markSuccess(CommonTask node) {
//为保证数据一直性,讲成功设置
commonTaskRepository.updateTaskStatus(node.getId(), TaskStatusEnum.SUCCESS, TaskStatusEnum.EXECUTING, "");
return node;
}
@Override
protected CommonTask markFail(CommonTask node, String failMessage) {
Date nextTime = DateTimeUtil.addSecond(SystemDateUtil.getSystemDate(), 60);
String msg = failMessage.length() > 2000 ? failMessage.substring(0, 2000) : failMessage;
commonTaskRepository.updateTaskStatus(node.getId(), TaskStatusEnum.IGNORE, TaskStatusEnum.EXECUTING, "");
commonTaskRepository.updateTaskExep(nextTime, node.getId(), msg);
return node;
}
@Override
protected CommonTask markException(CommonTask node, String failMessage) {
return markFail(node, failMessage);
}
@Override
protected String getName() {
return "PlanCapitalAssertMatchExecutor";
}
}
package com.abssqr.plat.biz.shared.dispatcher.capitalAssetMatch;
import com.abssqr.plat.biz.shared.dispatcher.DispatcherLoader;
import com.abssqr.plat.common.facade.enums.PlanTypeEnum;
import com.abssqr.plat.common.facade.enums.YNEnum;
import com.abssqr.plat.common.facade.model.plan.PlanBase;
import com.abssqr.plat.common.model.domain.job.JobControl;
import com.abssqr.plat.common.model.domain.task.CommonTask;
import com.abssqr.plat.common.model.repo.job.JobControlRepository;
import com.abssqr.plat.common.model.repo.plan.PlanRepo;
import com.abssqr.plat.common.model.repo.task.CommonTaskRepository;
import com.abssqr.plat.core.service.host.HostManager;
import com.google.common.collect.Lists;
import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.support.TransactionTemplate;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@Component
public class PlanCapitalAssertMatchLoader implements DispatcherLoader<CommonTask> {
private final static Logger LOGGER = LoggerFactory.getLogger(PlanCapitalAssertMatchLoader.class);
@Autowired
PlanRepo planRepo;
@Autowired
CommonTaskRepository commonTaskRepository;
@Autowired
private HostManager hostManager;
@Autowired
private TransactionTemplate transactionTemplate;
@Autowired
JobControlRepository jobControlRepository;
@Autowired
PlanCapitalAssertMatchExecutor planCapitalAssertMatchExecutor;
@Override
public List<CommonTask> loadToDoNodes(int size) {
List<CommonTask> commonTasksList=new ArrayList<>();
transactionTemplate.execute(transactionStatus->{
JobControl jobControl = jobControlRepository.lockByJobName(planCapitalAssertMatchExecutor.getName());
if(jobControl==null||jobControl.getIsEff()== YNEnum.N){
return false;
}
// LogUtil.info(LOGGER,"[PlanCapitalAssertMatchLoader] 捞取资金资产匹配/解绑任务开始");
List<PlanBase> plans = planRepo.getAllPlanAstByType(PlanTypeEnum.SPV.getCode());
for(PlanBase plan:plans){
String planNo = plan.getPlanNo();
//查询是否有正在执行中的解绑/匹配任务
List<CommonTask> runningCommonTask = commonTaskRepository.queryExecUnMatchOrMatchTaskByContext(planNo);
if(CollectionUtils.isNotEmpty(runningCommonTask)){
continue;
}
//查询初始化的匹配任务
List<CommonTask> initCommonTask = commonTaskRepository.queryInitUnMatchOrMatchTaskByContext(planNo);
if(CollectionUtils.isNotEmpty(initCommonTask)){
CommonTask commonTask = initCommonTask.get(0);
int cnt=commonTaskRepository.updateTaskExec(new Date(),hostManager.getHostInfo().getHostName(), Lists.newArrayList(commonTask));
if(cnt==1){
commonTasksList.add(commonTask);
}
}
}
// LogUtil.info(LOGGER,"[PlanCapitalAssertMatchLoader] 捞取资金资产匹配/解绑任务结束");
return true;
});
return commonTasksList;
}
}
package com.abssqr.plat.biz.shared.dispatcher.capitalAssetMatch;
import com.abssqr.plat.biz.shared.dispatcher.DispatcherExecutor;
import com.abssqr.plat.biz.shared.dispatcher.DispatcherLoader;
import com.abssqr.plat.biz.shared.dispatcher.DispatcherStarter;
import com.abssqr.plat.biz.shared.dispatcher.match.PlanAstMatchDispatcherExecutor;
import com.abssqr.plat.biz.shared.dispatcher.match.PlanAstMatchDispatcherLoader;
import com.abssqr.plat.common.model.domain.task.CommonTask;
import com.abssqr.plat.common.model.repo.task.AstSyncTaskCtrRepo;
import com.abssqr.plat.common.model.repo.task.CommonTaskRepository;
import com.abssqr.plat.core.service.host.HostManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
@Configuration
@Component
public class PlanCapitalAssertMatchStater extends DispatcherStarter<CommonTask> {
@Autowired
HostManager hostManager;
@Autowired
AstSyncTaskCtrRepo astSyncTaskCtrRepo;
@Autowired
CommonTaskRepository commonTaskRepository;
@Autowired
PlanCapitalAssertMatchLoader planCapitalAssertMatchLoader;
@Autowired
PlanCapitalAssertMatchExecutor planCapitalAssertMatchExecutor;
public static String JOB_NAME = "PlanCapitalAssertMatchStater";
private int coreSize = 2;
private int maxSize = 2;
private int hungrySize = 1;
private int queueSize = 2;
@Override
protected void recovery() {
commonTaskRepository.updateHangTasksByIp(hostManager.getHostInfo().getHostName());
}
@Override
public String getName() {
return JOB_NAME;
}
@Override
protected int getCoreSize() {
return coreSize;
}
@Override
protected int getMaxSize() {
return maxSize;
}
@Override
protected int getQueueSize() {
return queueSize;
}
@Override
protected int getHungrySize() {
return hungrySize;
}
@Override
protected DispatcherLoader getLoader() {
return planCapitalAssertMatchLoader;
}
@Override
protected DispatcherExecutor getExecutor() {
return planCapitalAssertMatchExecutor;
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2020 All Rights Reserved.
*/
package com.abssqr.plat.biz.shared.handler;
import javax.annotation.PostConstruct;
import com.abssqr.plat.biz.shared.dispatcher.commonTask.CommonTaskExecutor;
import com.abssqr.plat.common.dal.sync.auto.dao.WkAbsMfsBillCtrIgnoreDAO;
import com.abssqr.plat.common.facade.enums.CommonTaskTypeEnum;
import com.abssqr.plat.common.model.domain.task.CommonTask;
import com.abssqr.plat.common.model.repo.ast.LoanRepository;
import com.general.system.common.util.VarChecker;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @author bangis.wangdf
* @version com.abssqr.plat.biz.shared.handler: AstModCheckCommonTaskHandler.java, v 0.1 2020-03-04 14:06 bangis
* .wangdf Exp $
*/
@Component
public class AstModCheckCommonTaskHandler implements CommonTaskHandler {
@Autowired
CommonTaskExecutor commonTaskExecutor;
@Autowired
WkAbsMfsBillCtrIgnoreDAO wkAbsMfsBillCtrIgnoreDAO;
@Autowired
LoanRepository loanRepository;
@PostConstruct
public void registerHandler() {
commonTaskExecutor.registerHandler(CommonTaskTypeEnum.AST_MOD_CHECK, this);
}
@Override
public CommonTask execute(CommonTask commonTask) {
VarChecker.checkEquals(commonTask.getTaskType(), CommonTaskTypeEnum.AST_MOD_CHECK,
"CommonTask类型不为AST_MOD_CHECK,taskType={0}", commonTask.getTaskType());
//loanRepository.
return null;
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2020 All Rights Reserved.
*/
package com.abssqr.plat.biz.shared.handler;
/**
*
* @author hanfei
* @version $Id: FinSerFeeHandler.java, v 0.1 2020-03-09 2:01 PM hanfei Exp $
*/
public class FinSerFeeHandler {
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2020 All Rights Reserved.
*/
package com.abssqr.plat.biz.shared.handler;
import com.abssqr.plat.common.facade.enums.AstPackTradeTypeEnum;
import com.abssqr.plat.common.model.domain.ast.Loan;
import com.abssqr.plat.common.model.domain.ast.LoanAstBuyBackPack;
import com.abssqr.plat.common.model.domain.task.TrTask;
import com.abssqr.plat.common.model.domain.trade.AstTradeParam;
import com.abssqr.plat.common.util.profiler.PerformTrace;
import com.abssqr.plat.core.service.ast.LoanAstAssembler;
import com.abssqr.plat.core.service.ast.LoanAstBuyBackManager;
import com.general.system.common.util.LogUtil;
import com.general.system.common.util.VarChecker;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* 回购转让交易执行处理器
* @author hanfei
* @version $Id: LoanAstBuyBackHandler.java, v 0.1 2020-02-11 5:15 PM hanfei Exp $
*/
@Component
public class LoanAstBuyBackHandler {
private final static Logger LOGGER = LoggerFactory.getLogger(
LoanAstBuyBackHandler.class);
@Autowired
private LoanAstAssembler loanAstAssembler;
@Autowired
private LoanAstBuyBackManager loanAstBuyBackManager;
/**
*
* @param trTask
* @return
*/
@PerformTrace
public boolean astBuyBackExecute(TrTask trTask) {
// 1 捞取加锁loan资产
Loan loan = loanAstAssembler.lockByAstNo(trTask.getAstNo(), trTask.getTfrDt());
if (loan == null) {
LogUtil.warn(LOGGER, "[astBuyBackExecute][{0}]捞不到待转借据", trTask.getAstNo());
return false;
}
// 查询资产包
LoanAstBuyBackPack pack = loanAstBuyBackManager.getByPackCode(trTask.getTfrPack());
VarChecker.checkNotNull(pack, "[astBuyBackExecute]-资产回购交易失败,没有对应的Pack");
AstTradeParam astTrade = new AstTradeParam();
astTrade.setPack(pack);
astTrade.setLoan(loan);
astTrade.setAstTradeType(AstPackTradeTypeEnum.BUY_BACK_BIZ);
// 11 成功回购后,回购资产任务更新TASK_STATUS为success
return loanAstBuyBackManager.astBuyBackTrade(trTask, astTrade);
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.shared.handler;
import com.abssqr.plat.common.facade.enums.AstPackStatusEnum;
import com.abssqr.plat.common.facade.enums.TrCycleEnum;
import com.abssqr.plat.common.facade.enums.TransCodeEnum;
import com.abssqr.plat.common.facade.model.plan.PlanAst;
import com.abssqr.plat.common.facade.model.plan.PlanBase;
import com.abssqr.plat.common.facade.model.plan.PlanTransferRule;
import com.abssqr.plat.common.facade.model.rule.AstScreenRule;
import com.abssqr.plat.common.model.domain.ast.Pack;
import com.abssqr.plat.common.model.repo.clearing.PlanClearingLogRepo;
import com.abssqr.plat.common.model.repo.plan.PlanAstRepository;
import com.abssqr.plat.common.model.seq.SequenceUtil;
import com.abssqr.plat.core.service.ast.AstPackManager;
import com.abssqr.plat.core.service.plan.PlanInvestStructureManager;
import com.abssqr.plat.core.service.util.RptBuilderUtil;
import com.general.system.common.model.Money;
import com.general.system.common.util.DateTimeUtil;
import com.general.system.common.util.LogUtil;
import com.general.system.common.util.MessageUtil;
import com.general.system.common.util.VarChecker;
import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* 计划资产创建资产包
* @author zhenxuan.luo
* @version com.abssqr.plat.biz.shared.handler: PlanAstReqHandler.java, v 0.1 2019-06-19 01:34 zhenxuan.luo Exp $
*/
@Component
public class PlanAstReqHandler {
private final static Logger LOGGER = LoggerFactory.getLogger(PlanAstReqHandler.class);
@Autowired
private PlanAstRepository planAstRepository;
@Autowired
private AstPackManager astPackManager;
@Autowired
private PlanClearingLogRepo planClearingLogRepo;
@Autowired
private PlanInvestStructureManager planInvestStructureManager;
public Pack execute(PlanBase planBase, PlanTransferRule transferRule, Date accountDate) {
Date tfrClearingDate = planClearingLogRepo.getMinUnStateAccountDate(planBase.getPlanNo(), null);
if (tfrClearingDate != null) {
LogUtil.info(LOGGER, "计划[{0}]创建资产包, 在[{1}]有未完成的转让任务待清算悬挂", planBase.getPlanNo(), tfrClearingDate);
return null;
}
VarChecker.checkNotNull(transferRule, "计划[{0}]创建资产包找不到对应转让规则", planBase.getPlanNo());
PlanAst planAst = planAstRepository.getByPlanNo(planBase.getPlanNo());
Pack pack = new Pack();
pack.setPlanNo(planBase.getPlanNo());
pack.setPackCode(SequenceUtil.genSeqNo(TransCodeEnum.OTHER.getCode()));
pack.setPackName(MessageUtil.formatMsg("{0}-{1}资产包",
planBase.getPlanName(), DateTimeUtil.formatYMD(accountDate)));
pack.setTransferRule(transferRule);
pack.setPackStatus(AstPackStatusEnum.INIT);
pack.setScenDate(accountDate);
pack.setMinEndDate(null);
pack.setMaxEndDate(planBase.getEndDate());
pack.setCalcIntrType(planBase.getCalcIntrType());
if (CollectionUtils.isNotEmpty(transferRule.getAstScreenRuleList())) {
AstScreenRule astScreenRule = transferRule.getAstScreenRuleList().stream().findFirst().get();
pack.setManagerOrgCode(astScreenRule.getManagerOrgCode());
}
boolean isNeedPack;
if (transferRule.getTrCycle() != TrCycleEnum.STATIC) {
isNeedPack = buildPackForCycle(transferRule, planAst, pack);
} else {
isNeedPack = buildPackForStatic(planBase, planAst, pack);
}
if (isNeedPack) {
return pack;
}
return null;
}
private boolean buildPackForStatic(PlanBase planBase, PlanAst planAst, final Pack pack) {
// 填充计划投资结构
planBase.setInvestStructureList(planInvestStructureManager.selectByPlanNo(planBase.getPlanNo()));
// 获取计划投资结构 投入资本金额总额
Money avalAmt = RptBuilderUtil.getInvestedAmt(planBase).subtract(planAst.getAccGrant());
if (avalAmt.isGreaterThanZero()) {
pack.setAvalAmt(avalAmt);
return true;
} else {
return false;
}
}
private boolean buildPackForCycle(PlanTransferRule transferRule, PlanAst planAst, final Pack pack) {
// 1. 转让周期判断 数量会越来越大,OOM风险
//List<Pack> packList = packRepository.getByPlanNo(transferRule.getPlanNo());
Date lastDate = null;
// 当天可以多次转让
//packList = packList.stream().filter(item -> !DateTimeUtil.isSameDay(item.getScenDate(), pack.getScenDate()))
// .collect(Collectors.toList());
//if (CollectionUtils.isNotEmpty(packList)) {
//
// Collections.sort(packList, Comparator.comparing(Pack::getScenDate));
// Pack lastPack = packList.get(packList.size() - 1);
// lastDate = lastPack.getScenDate();
//}
Money leastValAmt = new Money(0);
if (!isNeedTransAccdFreq(transferRule, leastValAmt, pack.getScenDate())) {
return false;
}
// 获取当前实际可用余额
Money ableCash = planAst.containClearAbleBal();
Money avalAmt = ableCash.subtract(transferRule.getResAmt());
if (avalAmt.isGreaterThanZero() && avalAmt.greaterThan(leastValAmt)) {
pack.setAvalAmt(avalAmt);
Date minEndDate = null;
Date maxEndDate = null;
for (AstScreenRule astScreenRule : transferRule.getAstScreenRuleList()) {
if (astScreenRule.getEarliestEndDate() != null) {
if (null == minEndDate
|| DateTimeUtil.calcDayDiff(minEndDate, astScreenRule.getEarliestEndDate()) > 0) {
minEndDate = astScreenRule.getEarliestEndDate();
}
}
if (astScreenRule.getLatestEndDate() != null) {
if (null == maxEndDate
|| DateTimeUtil.calcDayDiff(astScreenRule.getLatestEndDate(), maxEndDate) > 0) {
maxEndDate = astScreenRule.getLatestEndDate();
}
}
}
pack.setMinEndDate(minEndDate);
// 默认不能出头,填入值为计划到期日
if (null != maxEndDate) {
pack.setMaxEndDate(maxEndDate);
}
return true;
} else {
LogUtil.info(LOGGER, "Pack生成忽略PlanNo:{0},avalAmt:{1},leastValAmt:{2}", transferRule.getPlanNo(), avalAmt,
leastValAmt);
return false;
}
}
/**
* 目前一天资产同步一次,当资产每天同步多次时需要调整
* @param planTransferRule
* @param leastValAmt
* @param curDate
* @return
*/
private boolean isNeedTransAccdFreq(PlanTransferRule planTransferRule, Money leastValAmt, Date curDate) {
Pack lastPack = astPackManager.getLastDayPackByPlanNo(planTransferRule.getPlanNo(), curDate);
// 首次转让
if (lastPack == null) {
return true;
}
long dayDiff = DateTimeUtil.calcDayDiff(curDate, lastPack.getScenDate());
int compareDays = 0;
switch (planTransferRule.getTrCycle()) {
case D:
compareDays = 1;
break;
case W:
compareDays = 7;
break;
case M:
compareDays = 30;
break;
case Q:
compareDays = 90;
break;
case Y:
compareDays = 360;
break;
}
if (dayDiff >= compareDays) {
return true;
}
return false;
}
}
\ No newline at end of file
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.shared.handler;
import com.abssqr.plat.common.facade.enums.OrgAstStatStatusEnum;
import com.abssqr.plat.common.facade.enums.SyncTaskTypeEnum;
import com.abssqr.plat.common.facade.model.plan.PlanAst;
import com.abssqr.plat.common.facade.model.plan.PlanBase;
import com.abssqr.plat.common.model.domain.plan.PlanAstStatTask;
import com.abssqr.plat.common.model.repo.ast.PlanAstStatTaskRepo;
import com.abssqr.plat.common.model.repo.clearing.PlanClearingLogRepo;
import com.abssqr.plat.common.model.repo.plan.PlanAstRepository;
import com.abssqr.plat.common.util.base.Day;
import com.abssqr.plat.core.service.plan.PlanManager;
import com.abssqr.plat.core.service.plan.PlanSyncTaskCtrManager;
import com.general.system.common.util.DateTimeUtil;
import com.general.system.common.util.LogUtil;
import com.general.system.common.util.SystemDateUtil;
import com.general.system.common.util.VarChecker;
import com.general.system.tool.util.ToolUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* 初始化每日统计清算流水任务
*
* @author zhenxuan.luo
* @version com.abssqr.plat.biz.shared.handler: PlanAstStatTaskHandler.java, v 0.1 2019-07-14 16:33 zhenxuan.luo Exp $
*/
@Component
public class PlanAstStatTaskHandler {
protected final Logger LOGGER = LoggerFactory.getLogger(PlanAstStatTaskHandler.class);
@Autowired
private PlanAstRepository planAstRepository;
@Autowired
private PlanClearingLogRepo planClearingLogRepo;
@Autowired
private PlanAstStatTaskRepo planAstStatTaskRepo;
@Autowired
private PlanSyncTaskCtrManager planSyncTaskCtrManager;
@Autowired
private PlanManager planManager;
/**
* 针对计划生成当日 统计任务
*
* @param planNo
*/
public void handle(String planNo, Day trfDate) {
// 查询锁水位表
PlanAst planAst = planAstRepository.lockByPlanNo(planNo);
VarChecker.checkNotNull(planAst, "计划[{0}]资产水位信息未初始化", planNo);
// 查询计划下的资产统计任务
PlanAstStatTask planAstStatTask = planAstStatTaskRepo.getPlanNo(planAst.getPlanNo());
boolean isNew = false;
// 1. 如果统计任务不存在,则新建
if (null == planAstStatTask) {
// 从未进行统计
planAstStatTask = this.initplanAstStatTask(planAst);
isNew = true;
} else if (planAstStatTask.getStatus() != OrgAstStatStatusEnum.WAIT) {
return;
}
// 2. 如果统计任务是新建的或者当前日期大于统计任务的会计日期,则重新捞取会计日期
if (isNeedResetAccountDate(planAstStatTask.getAccountDate(), planAstStatTask.getPlanNo(), trfDate)) {
Date minAcctDate = planClearingLogRepo.getMinUnStateAccountDate(planAstStatTask.getPlanNo(), null);
if (null == minAcctDate) {
// 没有待处理的流水,直接更新
planAstStatTask.setAccountDate(trfDate.getStandardDate());
planAst.setLastUpdateDate(planAstStatTask.getAccountDate());
planAstRepository.update(planAst);
} else {
// 注意:有可能仍然是原来的会计日期,因为有部分流水没处理完
if (DateTimeUtil.calcDayDiff(minAcctDate, planAstStatTask.getAccountDate()) <= 0) {
LogUtil.warn(LOGGER, "计划统计任务[{0}]初始化,重置日期后,仍然为当日,可能有部分任务阻塞", planAstStatTask);
}
planAstStatTask.setAccountDate(minAcctDate);
}
}
// 重置任务状态为活跃
resetTaskState(planAstStatTask);
// 4. 若任务不存在,则生成任务。若任务存在,则将任务状态修订为执行中,等待dispatcher捞起。(如果已经在执行中则忽略)
if (isNew) {
planAstStatTaskRepo.createTask(planAstStatTask);
} else {
planAstStatTaskRepo.updateTask(planAstStatTask);
}
}
private void resetTaskState(PlanAstStatTask planAstStatTask) {
planAstStatTask.setStatus(OrgAstStatStatusEnum.ACTIVE);
planAstStatTask.setLastExecTime(planAstStatTask.getNextExecTime());
planAstStatTask.setNextExecTime(SystemDateUtil.getSystemDate());
planAstStatTask.setLastHost(null);
planAstStatTask.setExecTimes(0L);
}
private PlanAstStatTask initplanAstStatTask(PlanAst planAst) {
PlanAstStatTask planAstStatTask = new PlanAstStatTask();
planAstStatTask.setPlanNo(planAst.getPlanNo());
planAstStatTask.setAccountDate(planAst.getLastUpdateDate());
// 时间戳字段不做消费,只做登记便于排查问题
planAstStatTask.setLastExecTms("");
planAstStatTask.setMinId(0L);
planAstStatTask.setMaxId(0L);
planAstStatTask.setCnt(0L);
return planAstStatTask;
}
/**
* 判断是否重置日期
*
* @param taskAccountDate
* @param planNo
* @return
*/
private boolean isNeedResetAccountDate(Date taskAccountDate, String planNo, Day trfDate) {
Date standardTaskDate = DateTimeUtil.getStandardDate(taskAccountDate);
// 当前转让会计日期 小于 任务日 不重置日期
if (ToolUtil.isNotEmpty(standardTaskDate)
&& DateTimeUtil.calcDayDiff(trfDate.getStandardDate(), standardTaskDate) <= 0) {
return false;
}
// 任务日跨天+10分钟 大于 转让会计日 不重置日期
Date refDate = DateTimeUtil.addMinutes(DateTimeUtil.addDays(standardTaskDate, 1), 10);
if (refDate.compareTo(trfDate.getDate()) > 0) {
return false;
}
// 取转让会计日-1 作为机构会计日判断是否完成模型转换
Date orgDate = trfDate.getYesterday().getStandardDate();
PlanBase planBase = planManager.getPlanFullByNo(planNo);
return planSyncTaskCtrManager.checkSyncFinishGtIsTrue(planBase, orgDate, SyncTaskTypeEnum.AST_MOD);
}
}
\ No newline at end of file
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.shared.handler;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
import com.abssqr.plat.common.facade.enums.AbssqrNoticeTypeEnum;
import com.abssqr.plat.common.facade.enums.PlanAllocStatusEnum;
import com.abssqr.plat.common.facade.enums.PlanTypeEnum;
import com.abssqr.plat.common.facade.model.plan.PlanAcctTitle;
import com.abssqr.plat.common.facade.model.plan.PlanAlloc;
import com.abssqr.plat.common.facade.model.plan.PlanBase;
import com.abssqr.plat.common.facade.model.plan.PlanTransferRule;
import com.abssqr.plat.common.model.domain.plan.PlanAstLog;
import com.abssqr.plat.common.model.repo.plan.PlanAcctTitleRepo;
import com.abssqr.plat.common.model.repo.plan.PlanAllocRepo;
import com.abssqr.plat.common.model.repo.plan.PlanTransferRuleRepo;
import com.abssqr.plat.core.service.notice.AbssqrNoticeManager;
import com.abssqr.plat.core.service.plan.PlanAllocAmtCalcManager;
import com.abssqr.plat.core.service.plan.PlanAstManager;
import com.general.system.common.model.Money;
import com.general.system.common.util.DateTimeUtil;
import com.general.system.common.util.LogUtil;
import com.general.system.common.util.MessageUtil;
import com.general.system.tool.util.ToolUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;
/**
* 计算计划每日为分配兑付 预留冻结金额
* @author zhenxuan.luo
* @version com.abssqr.plat.biz.shared.handler: PlanCashFrozenHandler.java, v 0.1 2019-06-13 15:39 zhenxuan.luo Exp $
*/
@Component
public class PlanCashFrozenHandler {
private final static Logger LOGGER = LoggerFactory.getLogger(PlanCashFrozenHandler.class);
private final static int DAY_OFFSET = 15;
@Autowired
private AbssqrNoticeManager abssqrNoticeManager;
@Autowired
private PlanAstManager planAstManager;
@Autowired
private PlanAllocRepo planAllocRepo;
@Autowired
private PlanTransferRuleRepo planTransferRuleRepo;
@Autowired
private PlanAllocAmtCalcManager planAllocAmtCalcManager;
@Autowired
private PlanAcctTitleRepo planAcctTitleRepo;
/**
* 资金冻结:需要在外部起事务,保证冻结和任务状态一致,避免重复冻结
* @param planEntity 计划
* @param curDate 转让会计日
*/
public void execute(PlanBase planEntity, Date curDate) {
LogUtil.info(LOGGER, "执行{0}[{1}]水位冻结任务", planEntity.getPlanType().getDesc(), planEntity.getPlanNo());
// 1. 查找未来最近的分配计划,考虑最近期限(15天)之内多个分配计划日期较近的全部进行判断处理
List<PlanAlloc> planAllocList = planAllocRepo.queryUnassigneAllocByPlanNo(planEntity.getPlanNo());
if (ToolUtil.isEmpty(planAllocList)) {
LogUtil.warn(LOGGER, "没有找到{0}[{1}]的最近未来分配计划, 当前时间[{1}]",
planEntity.getPlanType().getDesc(), planEntity.getPlanNo(), curDate);
return;
}
// 2. 判断分配当期是否处于循环期,若不属于循环期,不做资金预留
if (!this.filteNeedFrozenAllocs(curDate, planAllocList, planEntity)) {
return;
}
// 3. 计算分配日需要分配的资金 填充需要分配的本金 费用 等金额
List<PlanAcctTitle> planAcctTitles = planAcctTitleRepo.getByEntityNo(planEntity.getPlanNo());
planAllocAmtCalcManager.calcTriAmtByScheduler(planEntity, planAllocList, planAcctTitles, true);
// 计算合计总共需要兑付金额
Money totalAllocAmt = new Money();
// 多个分配兑付日
String clearDates = CollectionUtil.join(planAllocList.stream().map(alloc -> {
totalAllocAmt.addTo(alloc.calcTotalTrialAmt());
return DateUtil.formatDate(alloc.getClearDate());
}).collect(Collectors.toList()), ",");
// 计算并执行每日冻结水位资金
PlanAstLog planAstLog = planAstManager.calcFrozen(curDate, planEntity.getPlanNo(), planAllocList, clearDates);
// 4. 计算近30天的日均还款
Date startDate = DateTimeUtil.addDays(curDate, -31);
Date endDate = DateTimeUtil.addDays(curDate, -1);
startDate = (startDate.compareTo(planEntity.getEffectDate()) > 0) ? startDate : planEntity.getEffectDate();
/**
* 获取每日变更水位的还款金额
* 放款池计算还款包含了承接池的还款-- 因为承接池还会转让将资金转回放款池,所以暂时不计
*/
Money avgRepoAmt = planAstManager.getRepayTransAmtStat(
planEntity.getPlanNo(), startDate, endDate, true);
if (planAstLog.getFrozenCashAmt().greaterThan(avgRepoAmt)
&& planAstLog.getFrozenCash().greaterThan(planAstLog.getCash())) {
// 提醒优化,可能计划本来就有很多钱,这个时候还款金额是不是足够其实不重要
String msg = MessageUtil.formatMsg(
"分配计划日期为[{0}],存在兑付风险,待兑付金额{1}元。平均每日还款金额{2}元,今日冻结金额{3}元,计划资金余额{4}元,计划所有已冻结金额{5}元"
, clearDates, totalAllocAmt, avgRepoAmt, planAstLog.getFrozenCashAmt(),
planAstLog.getCash(), planAstLog.getFrozenCash());
// 插入一条通知,每日还款金额小于每日冻结金额
abssqrNoticeManager.sendBusinessNotice(planEntity, planEntity.getPlanNo(),
AbssqrNoticeTypeEnum.PlanAllocRisk, msg, null);
LogUtil.warn(LOGGER, msg);
}
}
/**
* 判断是否分配计划是否需要冻结资金
* @param curDate
* @param planAllocs
* @param planBase
* @return
*/
private boolean filteNeedFrozenAllocs(Date curDate, List<PlanAlloc> planAllocs, PlanBase planBase) {
String planNo = planBase.getPlanNo();
Date stopTrDate = null;
// 承接池进行判断循环结构及期限
if (planBase.getPlanType() == PlanTypeEnum.PLAN){
// 查询计划转让规则
PlanTransferRule transferRules = planTransferRuleRepo.getByPlanNo(planNo);
if (null == transferRules) {
LogUtil.warn(LOGGER, "没有找到计划[{0}]的转让规则", planNo);
return false;
}
// 非循环结构
if (!transferRules.getCycle()) {
LogUtil.info(LOGGER, "计划[{0}]不需要冻结预留资金水位,计划非循环结构[{1}]", planNo, transferRules.getCycle());
return false;
}
// 循环结果,判断循环期
if (DateTimeUtil.calcDayDiff(curDate, transferRules.getStopTrDate()) >= 0) {
// 当前日期已经停止循环
LogUtil.info(LOGGER, "计划[{0}]不需要冻结预留资金水位,当期日期[{1}]大于等于循环期[{2}]", planNo, curDate,
transferRules.getStopTrDate());
return false;
}
// 转让终止日
stopTrDate = transferRules.getStopTrDate();
}
Iterator<PlanAlloc> it = planAllocs.iterator();
while (it.hasNext()) {
PlanAlloc planAlloc = it.next();
if (planAlloc.getStatus() == PlanAllocStatusEnum.ASSIGNED) {
// 剔除已分配
it.remove();
continue;
}
if (DateTimeUtil.calcDayDiff(planAlloc.getClearDate(), curDate) > DAY_OFFSET) {
// 距离结算日提前15天预留资金
LogUtil.info(LOGGER, "计划[{0}]不需要冻结预留资金水位,当期日期[{1}]距离最近分配计划结算日[{2}]大于[{3}]天",
planNo, curDate,
planAlloc.getClearDate(),
DAY_OFFSET);
//移除该对象
it.remove();
continue;
}
if (stopTrDate != null && DateTimeUtil.calcDayDiff(stopTrDate, planAlloc.getClearDate()) < 0) {
// 分配计划结算日在循环期内,需要冻结
LogUtil.info(LOGGER, "计划[{0}]需要冻结预留资金水位,分配计划[{1}]结算日[{2}]小于循环期[{3}]", planNo,
planAlloc.getAllocNo(),
planAlloc.getClearDate(),
stopTrDate);
//移除该对象
it.remove();
continue;
}
}
if (ToolUtil.isNotEmpty(planAllocs)) {
// 剩余场景:停止循环日期大于当前日期 且 停止循环日期小于分配计划结算日。保险期间,做资金预留
return true;
} else {
return false;
}
}
}
\ No newline at end of file
/**
* abssqr.comInc.
* Copyright(c)2019-2019AllRightsReserved.
*/
package com.abssqr.plat.biz.shared.listener;
import com.abssqr.plat.common.facade.model.CommonPlanEntity;
import com.abssqr.plat.common.facade.model.plan.PlanBase;
import com.abssqr.plat.common.facade.model.report.PlanReport;
import org.springframework.context.ApplicationEvent;
/**
*
* @author yangcheng
* @version PlanMonitorRecordEvent.java, v0.12019-07-0414:48 yangchengExp$
*/
public class PlanMonitorRecordEvent extends ApplicationEvent {
private PlanReport planReport;
private PlanBase planEntity;
public PlanMonitorRecordEvent(Object source, PlanReport planReport, PlanBase planEntity) {
super(source);
this.planReport = planReport;
this.planEntity = planEntity;
}
public PlanReport getPlanReport() {
return planReport;
}
public void setPlanReport(PlanReport planReport) {
this.planReport = planReport;
}
public PlanBase getPlanEntity() {
return planEntity;
}
public void setPlanEntity(PlanBase planEntity) {
this.planEntity = planEntity;
}
}
/**
* abssqr.comInc.
* Copyright(c)2019-2019AllRightsReserved.
*/
package com.abssqr.plat.biz.shared.listener;
import com.abssqr.plat.common.facade.enums.PlanIndicatorEnum;
import com.abssqr.plat.common.facade.model.plan.PlanBase;
import com.abssqr.plat.common.facade.model.plan.PlanMonitor;
import com.abssqr.plat.common.facade.model.report.PlanReport;
import com.abssqr.plat.common.facade.utils.CalcUtil;
import com.abssqr.plat.common.model.repo.plan.impl.PlanMonitorRecordRepoImpl;
import com.abssqr.plat.common.model.repo.plan.impl.PlanMonitorRepoImpl;
import com.abssqr.plat.core.service.notice.AbssqrNoticeManager;
import com.abssqr.plat.core.service.util.RptBuilderUtil;
import com.general.system.common.util.LogUtil;
import com.general.system.common.util.MessageUtil;
import com.general.system.common.util.VarChecker;
import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
import org.springframework.transaction.support.TransactionTemplate;
import java.math.BigDecimal;
import java.util.List;
/**
* @author yangcheng
* @version PlanMonitorRecordListener.java, v0.12019-07-0414:22 yangchengExp$
*/
@Component
public class PlanMonitorRecordListener {
private static final Logger LOGGER = LoggerFactory.getLogger(PlanMonitorRecordListener.class);
@Autowired
private PlanMonitorRepoImpl planMonitorRepo;
@Autowired
private PlanMonitorRecordRepoImpl planMonitorRecordRepo;
@Autowired
private AbssqrNoticeManager abssqrNoticeManager;
@Autowired
private TransactionTemplate transactionTemplate;
/**
* 更新每日监控事件触发情况
*
* @param orderEvent 监听事件
*/
@EventListener
public void planMonitorRecordListener(PlanMonitorRecordEvent orderEvent) {
PlanReport planReport = orderEvent.getPlanReport();
VarChecker.checkNotNull(planReport);
String planNo = planReport.getPlanNo();
List<PlanMonitor> planMonitorList = planMonitorRepo.getByPlan(planNo);
if(CollectionUtils.isNotEmpty(planMonitorList)) {
transactionTemplate.execute(status -> {
for (PlanMonitor planMonitor : planMonitorList) {
//获取文件名,报表信息
String reportFieldCode = planMonitor.getIndicator().getReportFieldCode();
BigDecimal nowVal = RptBuilderUtil.getReportVal(planReport, reportFieldCode);
// nowVal * 100
CalcUtil.calcPercRate(nowVal);
LogUtil.info(LOGGER, "该计划{0}监控指标{1}检测", planMonitor.getPlanNo(),
planMonitor.getIndicator().getDesc());
if (this.allowInsert(planMonitor.getIndicator(), planMonitor.getValue(), nowVal)) {
LogUtil.info(LOGGER, "该计划{0}监控指标{1}为{2}已违标{3}", planMonitor.getPlanNo(),
planMonitor.getIndicator(),
planMonitor.getValue(), nowVal);
//监控信息表新插入
planMonitorRecordRepo.insert(planMonitor, nowVal);
//消息通知表新插入
this.insertMess(orderEvent.getPlanEntity() , planMonitor, nowVal);
}
}
return null;
});
}
}
/**
* 插入消息通知
*
* @param param
*/
private void insertMess(PlanBase planBase, PlanMonitor param, BigDecimal nowVal) {
//插入消息通知数据
String bizCode = param.getPlanNo();
PlanIndicatorEnum bizType = param.getIndicator();
String content = MessageUtil.formatMsg("指标[{1}] 事项名称[{0}] 标准为[{2}]%,当前为[{3}]%,{}",
bizType.getDesc(), param.getName(), param.getValue(), nowVal, bizType.isTopLimit() ? "已超标" : "已不足");
abssqrNoticeManager.sendBusinessNotice(planBase, bizCode, bizType, content, null);
}
/**
* 上下限统一判断
*
* @param indicator
* @param repoVal
* @param nowVal
* @return
*/
private boolean allowInsert(PlanIndicatorEnum indicator, BigDecimal repoVal, BigDecimal nowVal) {
return indicator.isTopLimit() ? repoVal.compareTo(nowVal) < 1 : repoVal.compareTo(nowVal) > -1;
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.shared.report;
import com.abssqr.plat.common.dal.mysql.auto.resultmap.PlanAstReportStat;
import com.general.system.tool.util.ToolUtil;
import java.math.BigDecimal;
/**
* 统计金额字段计算工具
* @author zhenxuan.luo
* @version com.abssqr.plat.biz.shared.report: PlanAstStatAmtUtil.java, v 0.1 2019-06-28 16:22 zhenxuan.luo Exp $
*/
public class PlanAstStatAmtUtil {
/**
* 总发生额 = 本金总额 + 利息总额 + 罚息总额
* @param stat
* @return
*/
public static BigDecimal getAll(PlanAstReportStat stat) {
return getPrin(stat).add(getAllIntrWithPny(stat));
}
/**
* 本金金额
* @param stat
* @return
*/
public static BigDecimal getPrin(PlanAstReportStat stat) {
return stat.getPrinAmt().add(stat.getOvdPrinAmt()).getAmount();
}
/**
* 成本发生额
* @param stat
* @return
*/
public static BigDecimal getCost(PlanAstReportStat stat) {
return ToolUtil.isEmpty(stat.getCost()) ? BigDecimal.ZERO : stat.getCost().getAmount();
}
/**
* 金融服务费发生额
* @param stat
* @return
*/
public static BigDecimal getOrgDistPftAmt(PlanAstReportStat stat) {
return ToolUtil.isEmpty(stat.getOrgDistpftAmt()) ? BigDecimal.ZERO : stat.getOrgDistpftAmt().getAmount();
}
/**
* 金融服务费发生额
* @param stat
* @return
*/
public static BigDecimal getOtherFeeAmt(PlanAstReportStat stat) {
return ToolUtil.isEmpty(stat.getOtherFeeAmt()) ? BigDecimal.ZERO : stat.getOtherFeeAmt().getAmount();
}
/**
* 本罚+息罚+费罚
* @param stat
* @return
*/
public static BigDecimal getAllPny(PlanAstReportStat stat) {
return stat.getPrinPenalAmt().add(stat.getIntrPenalAmt()).add(stat.getFeePenalAmt()).getAmount();
}
/**
* 利息发生额+费用发生额
* @param stat
* @return
*/
public static BigDecimal getAllIntr(PlanAstReportStat stat) {
// 正常利息 + 逾期利息 + 费用
return stat.getIntrAmt().add(stat.getOvdIntrAmt()).add(stat.getFeeAmt()).getAmount();
}
/**
* 利息总额 + 罚息总额
* @param stat
* @return
*/
public static BigDecimal getAllIntrWithPny(PlanAstReportStat stat) {
return getAllIntr(stat).add(getAllPny(stat));
}
}
\ No newline at end of file
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.shared.report;
import cn.hutool.core.util.NumberUtil;
import com.abssqr.plat.common.dal.mysql.auto.resultmap.PlanAstReportStat;
import com.abssqr.plat.common.facade.enums.EventCodeEnum;
import com.abssqr.plat.common.facade.enums.ReportAstStatTypeEnum;
import com.abssqr.plat.common.facade.model.report.ReportKey;
import com.abssqr.plat.common.model.convertor.ReportItemStatConvert;
import org.springframework.stereotype.Component;
/**
*
* @author zhenxuan.luo
* @version com.abssqr.plat.biz.shared.report: ReportItemFIlter.java, v 0.1 2019-06-28 02:27 zhenxuan.luo Exp $
*/
@Component
public class ReportItemFilter {
/**
* 合并统计项
* @param vals
* @return
*/
public PlanAstReportStat combine(PlanAstReportStat... vals) {
return ReportItemStatConvert.combine(vals);
}
/**
* 统计累计项
* @param reportStatMap
* @param eventCode
* @param type
* @param vals
* @return
*/
public PlanAstReportStat filter(ReportStatMap reportStatMap, EventCodeEnum eventCode, ReportAstStatTypeEnum type,
String... vals) {
PlanAstReportStat res = ReportItemStatConvert.createReportStat(type, eventCode, "");
for (String val : vals) {
PlanAstReportStat reportStat = filteForVal(reportStatMap, type, eventCode, val);
res.setAstChg(NumberUtil.add(res.getAstChg() , reportStat.getAstChg()).longValue());
res.setPrinAmt(ReportItemStatConvert.addWithNull(res.getPrinAmt(), reportStat.getPrinAmt()));
res.setOvdPrinAmt(ReportItemStatConvert.addWithNull(res.getOvdPrinAmt(), reportStat.getOvdPrinAmt()));
res.setIntrAmt(ReportItemStatConvert.addWithNull(res.getIntrAmt(), reportStat.getIntrAmt()));
res.setOvdIntrAmt(ReportItemStatConvert.addWithNull(res.getOvdIntrAmt(), reportStat.getOvdIntrAmt()));
res.setFeeAmt(ReportItemStatConvert.addWithNull(res.getFeeAmt(), reportStat.getFeeAmt()));
res.setOvdFeeAmt(ReportItemStatConvert.addWithNull(res.getOvdFeeAmt(), reportStat.getOvdFeeAmt()));
res.setPrinPenalAmt(ReportItemStatConvert.addWithNull(res.getPrinPenalAmt(), reportStat.getPrinPenalAmt()));
res.setIntrPenalAmt(ReportItemStatConvert.addWithNull(res.getIntrPenalAmt(), reportStat.getIntrPenalAmt()));
res.setFeePenalAmt(ReportItemStatConvert.addWithNull(res.getFeePenalAmt(), reportStat.getFeePenalAmt()));
// 费用
res.setOtherFeeAmt(ReportItemStatConvert.addWithNull(res.getOtherFeeAmt(), reportStat.getOtherFeeAmt()));
res.setOtherFeePenalAmt(ReportItemStatConvert.addWithNull(res.getOtherFeePenalAmt(), reportStat.getOtherFeePenalAmt()));
res.setCost(ReportItemStatConvert.addWithNull(res.getCost(), reportStat.getCost()));
}
return res;
}
private PlanAstReportStat filteForVal(ReportStatMap reportStatMap, ReportAstStatTypeEnum type,
EventCodeEnum eventCode, String val) {
ReportKey reportKey = new ReportKey(type.getCode(), val, eventCode);
PlanAstReportStat res = reportStatMap.get(reportKey);
if (res == null) {
res = ReportItemStatConvert.createReportStat(type, eventCode, val);
} else {
if (res.getAstChg() == null) {
res.setAstChg(0L);
}
}
return res;
}
}
\ No newline at end of file
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.shared.report;
import com.abssqr.plat.common.dal.mysql.auto.resultmap.PlanAstReportStat;
import com.abssqr.plat.common.facade.model.report.ReportKey;
import java.util.HashMap;
import java.util.List;
/**
*
* @author zhenxuan.luo
* @version com.abssqr.plat.biz.shared.report: ReportStatMap.java, v 0.1 2019-06-28 02:54 zhenxuan.luo Exp $
*/
public class ReportStatMap extends HashMap<ReportKey, PlanAstReportStat> {
private static final long serialVersionUID = -2765549625728233654L;
public static ReportStatMap buildReportMap(List<PlanAstReportStat> planAstReportStatList) {
ReportStatMap reportStatMap = new ReportStatMap();
for (PlanAstReportStat planAstReportStat : planAstReportStatList) {
ReportKey key = new ReportKey(planAstReportStat.getStatType(), planAstReportStat.getStatVal(),
planAstReportStat.getEventCode());
reportStatMap.put(key, planAstReportStat);
}
return reportStatMap;
}
}
\ No newline at end of file
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.shared.scheduler.job;
import com.abssqr.plat.biz.shared.scheduler.BaseQuartzJob;
import org.quartz.Job;
import org.quartz.PersistJobDataAfterExecution;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.endpoint.event.RefreshEvent;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.stereotype.Component;
/**
* 每五分钟刷新配置
* @author bangis.wangdf
* @version com.abssqr.plat.biz.shared.scheduler.job: ConfigRefreshJob.java, v 0.1 2019-08-29 18:06 bangis.wangdf Exp $
*/
@Component
@PersistJobDataAfterExecution
public class ConfigRefreshJob extends BaseQuartzJob implements Job {
@Autowired
private ConfigurableApplicationContext context;
@Override
public void doExecute() {
//context.publishEvent(new RefreshEvent("refresh","refresh","刷新配置"));
}
@Override
protected String getCronExpr() {
return "0 0/5 * * * ?";
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2020 All Rights Reserved.
*/
package com.abssqr.plat.biz.shared.scheduler.job.ast;
import com.abssqr.plat.biz.shared.scheduler.BaseQuartzJob;
import com.abssqr.plat.common.dal.mysql.auto.dataobject.AstPackDO;
import com.abssqr.plat.common.facade.enums.AccountAttributeEnum;
import com.abssqr.plat.common.facade.enums.AccountTypeEnum;
import com.abssqr.plat.common.facade.enums.AstPackStatusEnum;
import com.abssqr.plat.common.facade.enums.AstPackTradeTypeEnum;
import com.abssqr.plat.common.facade.enums.CommonTaskTypeEnum;
import com.abssqr.plat.common.facade.enums.PlanCapitalTransTypeEnum;
import com.abssqr.plat.common.facade.enums.TaskStatusEnum;
import com.abssqr.plat.common.facade.enums.TransCodeEnum;
import com.abssqr.plat.common.facade.model.account.Account;
import com.abssqr.plat.common.model.convertor.PacKConvert;
import com.abssqr.plat.common.model.domain.task.CommonTask;
import com.abssqr.plat.common.model.domain.task.TrCtrTask;
import com.abssqr.plat.common.model.repo.ast.PackRepository;
import com.abssqr.plat.common.model.repo.clearing.PlanClearingLogRepo;
import com.abssqr.plat.common.model.repo.clearing.PlanClearingOrderRepo;
import com.abssqr.plat.common.model.repo.plan.PlanCapitalOrderRepo;
import com.abssqr.plat.common.model.repo.task.CommonTaskRepository;
import com.abssqr.plat.common.model.repo.tr.TrCtrTaskRepo;
import com.abssqr.plat.common.util.base.autoconfig.AbsConfig;
import com.abssqr.plat.core.service.accounting.OrgAcctDayComponent;
import com.abssqr.plat.core.service.acct.AcctManager;
import com.abssqr.plat.core.service.ast.AstPackManager;
import com.abssqr.plat.core.service.util.CommonTaskUtil;
import com.general.system.common.model.Money;
import com.general.system.common.util.LogUtil;
import com.google.common.collect.Lists;
import org.apache.commons.collections.CollectionUtils;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.PersistJobDataAfterExecution;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
/**
* 自动回购
*
* @author bangis.wangdf
* @version com.abssqr.plat.biz.shared.scheduler.job.ast: AutoBackJob.java, v 0.1 2020-03-03 01:49 bangis.wangdf Exp $
*/
@PersistJobDataAfterExecution
@DisallowConcurrentExecution
@Component
public class AutoBackJob extends BaseQuartzJob {
private final static Logger LOGGER = LoggerFactory.getLogger(AutoBackJob.class);
@Autowired
PackRepository packRepository;
@Autowired
CommonTaskRepository commonTaskRepository;
@Autowired
TrCtrTaskRepo trCtrTaskRepo;
@Autowired
AstPackManager astPackManager;
@Autowired
PlanClearingLogRepo planClearingLogRepo;
@Autowired
PlanClearingOrderRepo planClearingOrderRepo;
@Autowired
PlanCapitalOrderRepo planCapitalOrderRepo;
@Autowired
AcctManager acctManager;
@Autowired
AbsConfig absConfig;
@Autowired
private OrgAcctDayComponent orgAcctDayComponent;
@Override
protected String getCronExpr() {
return "0 1/5 * * * ?";
}
public static final String ORG_CODE = "WKXT";
public static final Money reserveAmt = new Money("2000000");
@Override
protected void doExecute() {
// 获取转让会计日
Date curDate = orgAcctDayComponent.getTrfAcctDay().getStandardDate();
List<CommonTask> commonTasks = commonTaskRepository.selectUnifinishTaskByType(
CommonTaskTypeEnum.BUY_BACK_MATCH);
//没有未完成的回购任务
if (CollectionUtils.isNotEmpty(commonTasks)) {
LogUtil.info(LOGGER, "AutoBackJob 不执行,存在待回购的 commonTask");
return;
}
// 获取所有回购pack
List<AstPackDO> astPackDOS = packRepository.selectPackByStatus(curDate,
AstPackStatusEnum.WAIT,
AstPackTradeTypeEnum.BUY_BACK_BIZ);
if (CollectionUtils.isEmpty(astPackDOS)) {
LogUtil.info(LOGGER, "AutoBackJob 不执行,没有待回购包");
return;
}
List<TrCtrTask> activeBkCtrTasks = trCtrTaskRepo
.getByManagerOrgCode(ORG_CODE, curDate, TaskStatusEnum.INIT, AstPackTradeTypeEnum.BUY_BACK_BIZ);
if (CollectionUtils.isNotEmpty(activeBkCtrTasks)) {
LogUtil.info(LOGGER, "AutoBackJob 不执行,存在待回购的TrTask");
return;
}
//清算,结算,支付
Long clearingLogCnt = planClearingLogRepo.cntInitClearingLog(TransCodeEnum.BUY_BACK_OUT);
Long clearingOrderCnt = planClearingOrderRepo.cntInitClearingOrder(TransCodeEnum.BUY_BACK_OUT);
Long activeCnt = planCapitalOrderRepo.getActiveCntByType(PlanCapitalTransTypeEnum.NT_BUY_BACK);
if (clearingLogCnt + clearingOrderCnt + activeCnt > 0) {
LogUtil.info(LOGGER, "AutoBackJob 不执行,支付未完成");
return;
}
//判断账户余额是否满足
AstPackDO astPackDO = astPackDOS.get(0);
Money backAvalAmt = Money.createWithCent(astPackDO.getAvalAmt());
// 1、获取计划对应资金账户 平台虚拟户
List<Account> accounts = acctManager.getAcctByPlanNoAndType(astPackDO.getPlanNo(), AccountTypeEnum.PLAT_VIRTUAL,
true);
Money bankBal = new Money();
if (CollectionUtils.isNotEmpty(accounts)) {
for (Account account : accounts) {
if (account.getActAttr() == AccountAttributeEnum.PAY) {
bankBal = account.getBankBal();
}
}
}
//银行余额 - 回购金额 - 预留金额 > 0
if (bankBal.subtract(backAvalAmt).subtract(reserveAmt).isGreaterThanZero()) {
//开启本次回购
CommonTask commonTask = CommonTaskUtil.buildCommonTaskWithContext(astPackDO.getPackCode(),
CommonTaskTypeEnum.BUY_BACK_MATCH, astPackDO.getPackCode());
commonTaskRepository.create(commonTask);
packRepository.updatePackStatus(Lists.newArrayList(PacKConvert.do2Domain(astPackDO)), AstPackStatusEnum.INIT, AstPackStatusEnum.WAIT);
}else {
LogUtil.info(LOGGER,"AutoBackJob 不执行,账户余额-[{0}]小于 筛选包金额[{1}] + 预留金额[{2}]",bankBal,backAvalAmt,reserveAmt);
}
}
}
package com.abssqr.plat.biz.shared.scheduler.job.capitalAssertMatch;
import com.abssqr.plat.biz.shared.scheduler.BaseQuartzJob;
import com.abssqr.plat.common.facade.enums.CommonTaskTypeEnum;
import com.abssqr.plat.common.facade.enums.PlanTypeEnum;
import com.abssqr.plat.common.facade.enums.SyncTaskTypeEnum;
import com.abssqr.plat.common.facade.enums.TaskStatusEnum;
import com.abssqr.plat.common.facade.enums.YNEnum;
import com.abssqr.plat.common.facade.model.org.OrganizationEntity;
import com.abssqr.plat.common.facade.model.plan.Plan;
import com.abssqr.plat.common.facade.model.plan.PlanAcctTitle;
import com.abssqr.plat.common.facade.model.plan.PlanAlloc;
import com.abssqr.plat.common.facade.model.plan.PlanBase;
import com.abssqr.plat.common.model.domain.job.JobControl;
import com.abssqr.plat.common.model.domain.task.CommonTask;
import com.abssqr.plat.common.model.domain.task.ctr.AstSyncTaskCtrLog;
import com.abssqr.plat.common.model.enums.OrgCodeEnum;
import com.abssqr.plat.common.model.enums.OrgTypeEnum;
import com.abssqr.plat.common.model.repo.job.JobControlRepository;
import com.abssqr.plat.common.model.repo.plan.PlanAcctTitleRepo;
import com.abssqr.plat.common.model.repo.plan.PlanAllocRepo;
import com.abssqr.plat.common.model.repo.plan.PlanRepo;
import com.abssqr.plat.common.model.repo.task.AstSyncTaskCtrRepo;
import com.abssqr.plat.common.model.repo.task.CommonTaskRepository;
import com.abssqr.plat.common.util.base.autoconfig.AbsConfig;
import com.abssqr.plat.core.service.accounting.OrgAcctDayComponent;
import com.abssqr.plat.core.service.plan.PlanManager;
import com.general.system.common.model.Money;
import com.general.system.common.util.DateTimeUtil;
import com.general.system.common.util.LogUtil;
import org.apache.commons.collections.CollectionUtils;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.PersistJobDataAfterExecution;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
* 资金资产解绑任务生成。顺序,解绑->解绑匹配->同步匹配
*/
@PersistJobDataAfterExecution
@DisallowConcurrentExecution
@Component
public class CapitalAssertMatchJob extends BaseQuartzJob {
@Autowired
PlanRepo planRepo;
@Autowired
PlanAllocRepo planAllocRepo;
@Autowired
CommonTaskRepository commonTaskRepository;
@Autowired
JobControlRepository jobControlRepository;
@Autowired
AstSyncTaskCtrRepo astSyncTaskCtrRepo;
@Autowired
private OrgAcctDayComponent orgAcctDayComponent;
/**
* 间隔1分钟执行生成匹配和解绑任务
*/
@Value("${sync.quartz.plan.capitalAssertMatch}")
private String cron;
@Autowired
private AbsConfig absConfig;
@Autowired
private PlanAcctTitleRepo planAcctTitleRepo;
@Override
protected String getCronExpr() {
return cron;
}
@Override
public void doExecute() {
JobControl jobControl = jobControlRepository.lockByJobName(getJobName());
if (jobControl == null || jobControl.getIsEff() == YNEnum.N) {
return;
}
LogUtil.info(LOGGER, "[capitalAssetMatchJob] 生成资金资产解绑/匹配任务开始");
Date execDate = orgAcctDayComponent.getTrfAcctDay().getStandardDate();
List<PlanBase> plans = planRepo.getAllPlanAstByType(PlanTypeEnum.SPV.getCode());
for (PlanBase planBase : plans) {
if (planBase.getPlanType() == PlanTypeEnum.SPV) {
OrganizationEntity plan = (OrganizationEntity)planRepo.getPlanByNo(planBase.getPlanNo());
String planNo = plan.getPlanNo();
List<CommonTask> initAndExecCommonTasks = commonTaskRepository.queryInitAndExecUnMatchOrMatchTaskByContext(planNo);
if (CollectionUtils.isNotEmpty(initAndExecCommonTasks)) {
LogUtil.info(LOGGER, "[capitalAssetMatchJob]计划[{1}] 存在[初始化/正在执行中]的[资产匹配/解绑任务任务]", planNo);
continue;
}
//查询是否有解绑匹配的Task
List<CommonTask> initAndIgnoreCommonTask = commonTaskRepository.queryIgnoreUnMatchOrMatchTaskByContext(planNo);
List<CommonTask> toMatchedCapticalTask = initAndIgnoreCommonTask.stream()
.filter(v -> v.getTaskType() == CommonTaskTypeEnum.UNMATCH_CAPTITALASSERT_MATCH)
.collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(toMatchedCapticalTask)) {
CommonTask commonTask = toMatchedCapticalTask.get(0);
commonTaskRepository.updateIgnoreTaskStatus2Init(commonTask.getId());
LogUtil.info(LOGGER, "[capitalAssetMatchJob]计划[{1}] 存在状态为Ignore的解绑匹配任务[{2}]", planNo, commonTask.getBizNo());
continue;
}
//查询存在已审批通过未解绑的兑付计划
List<PlanAlloc> planAllocs = planAllocRepo.queryUnMatchedApprovedAlloc(planNo);
if (CollectionUtils.isNotEmpty(planAllocs)) {
PlanAlloc planAlloc = planAllocs.get(0);
LogUtil.info(LOGGER, "[capitalAssetMatchJob]计划[{1}] 存在已审批通过的兑付计划[{2}]", planNo, planAlloc.getAllocNo());
//生成解绑任务
CommonTask commonTask = buildUnMatchTask(planAlloc.getAllocNo(), planNo);
commonTaskRepository.create(commonTask);
continue;
}
//判断今日的模型转换是否已经完成
AstSyncTaskCtrLog lastTaskLog = astSyncTaskCtrRepo.getTaskLogByExecDate(execDate, SyncTaskTypeEnum.AST_MOD, plan.getManagerOrgCode());
if (lastTaskLog != null) {
String syncMatchBizNo = generateSyncMatchBizNo(CommonTaskTypeEnum.SYNC_CAPTITALASSERT_MATCH, execDate, planNo);
//查询今日是否已经生成了同步匹配任务
List<CommonTask> commonTasks = commonTaskRepository.queryByBizNo(syncMatchBizNo);
if (CollectionUtils.isNotEmpty(commonTasks)) {
continue;
}
//如果投资结构本机余额是0则不创建匹配任务
if (checkCanBuildMatchJob(planNo)) {
LogUtil.info(LOGGER, "[capitalAssetMatchJob]计划[{1}]生成同步匹配任务", planNo);
CommonTask commonTask = buildSyncMatchTask(syncMatchBizNo, planNo);
commonTaskRepository.create(commonTask);
}
}
}
}
LogUtil.info(LOGGER, "[capitalAssetMatchJob] 生成资金资产解绑/匹配任务结束");
}
private boolean checkCanBuildMatchJob(String planNo) {
// 获取本金科目
List<PlanAcctTitle> planAcctTitleList = planAcctTitleRepo.getByEntityNo(planNo);
Money totalMoney = new Money();
for (PlanAcctTitle planAcctTitle : planAcctTitleList) {
if (planAcctTitle.getTitleType().isInvest()) {
Money money = planAcctTitle.getBal().clone();
totalMoney.addTo(money);
}
}
if (!totalMoney.isGreaterThanZero()) {
LOGGER.info("计划[{0}]投资结构本金总额小于等于0不进行资金资产匹配任务", planNo);
return false;
}
return true;
}
private String generateSyncMatchBizNo(CommonTaskTypeEnum commonTaskTypeEnum, Date acctDate, String planNo) {
StringBuilder sb = new StringBuilder();
sb.append(commonTaskTypeEnum.getCode());
sb.append("-");
sb.append(planNo);
sb.append("-");
sb.append(DateTimeUtil.formatYMD(acctDate));
return sb.toString();
}
private CommonTask buildUnMatchTask(String bizNo, String planNo) {
CommonTask commonTask = buildBasicCommonTask(CommonTaskTypeEnum.CAPTITALASSERT_UNMATCH, planNo);
commonTask.setBizNo(bizNo);
return commonTask;
}
private CommonTask buildSyncMatchTask(String bizNo, String planNo) {
CommonTask commonTask = buildBasicCommonTask(CommonTaskTypeEnum.SYNC_CAPTITALASSERT_MATCH, planNo);
commonTask.setBizNo(bizNo);
return commonTask;
}
private CommonTask buildBasicCommonTask(CommonTaskTypeEnum planTaskTypeEnum, String planNo) {
CommonTask commonTask = new CommonTask();
commonTask.setContext(planNo);
commonTask.setTaskType(planTaskTypeEnum);
commonTask.setTaskStatus(TaskStatusEnum.INIT);
commonTask.setEnv(absConfig.getEnv());
commonTask.setExecTimes(0L);
return commonTask;
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2020 All Rights Reserved.
*/
package com.abssqr.plat.biz.shared.scheduler.job.keeper.node;
import com.abssqr.plat.biz.shared.scheduler.job.capitalAssertMatch.CapitalAssertMatchJob;
import com.abssqr.plat.common.facade.enums.AbssqrNoticeTypeEnum;
import com.abssqr.plat.common.facade.enums.CommonTaskTypeEnum;
import com.abssqr.plat.common.facade.enums.PlanTaskTypeEnum;
import com.abssqr.plat.common.facade.enums.TaskStatusEnum;
import com.abssqr.plat.common.model.domain.plan.PlanTaskLog;
import com.abssqr.plat.common.model.domain.task.CommonTask;
import com.abssqr.plat.common.model.repo.plan.PlanTaskLogRepo;
import com.abssqr.plat.common.model.repo.task.CommonTaskRepository;
import com.general.system.common.model.IEnum;
import com.general.system.common.util.LogUtil;
import com.general.system.common.util.MessageUtil;
import com.general.system.common.util.SystemDateUtil;
import com.google.common.collect.Lists;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Set;
/**
* 资金资产匹配监控
*
* @author xiachenxiang
* @version com.abssqr.plat.biz.shared.scheduler.job.keeper.node: AstMatchKeeper.java, v 0.1 2020-02-07 1:47 PM xiachenxiang Exp $
*/
@Component
public class CapitalAstMatchKeeper extends AbstractKeeperNode {
@Autowired
private CommonTaskRepository commonTaskRepository;
@Autowired
private PlanTaskLogRepo planTaskLogRepo;
@Value("${wkabs.org.zhaolian:1009}")
private String zhaolianOrgCode;
@Value("${wkabs.zhaolian.capitalAstMatchKeeper.deadline:10 0 0}")
private String deadline;
private Long second = 60L * 60L;
@Override
protected Void doHandle(Date date) {
Date sysday = orgAcctDayComponent.getTrfAcctDay().getStandardDate();
// 判断当前时间是否大于10点
Date currentTime = getCurrentStanderDate();
Date deadlineTime = getDeadLineTime(currentTime, deadline);
if (currentTime.compareTo(deadlineTime) > 0) {
List<PlanTaskLog> tasks = planTaskLogRepo.getTasks(sysday, PlanTaskTypeEnum.CAP_AST_MATCH_KEEPER);
if (CollectionUtils.isEmpty(tasks)) {
LogUtil.info(LOGGER, "资金资产匹配监控 - start");
StringBuffer sb = new StringBuffer();
exec(sb, CommonTaskTypeEnum.SYNC_CAPTITALASSERT_MATCH);
exec(sb, CommonTaskTypeEnum.UNMATCH_CAPTITALASSERT_MATCH);
exec(sb, CommonTaskTypeEnum.CAPTITALASSERT_UNMATCH);
if (StringUtils.isNotEmpty(sb)) {
// 获取用户
LogUtil.info(LOGGER, sb.toString());
// 获取用户
Set<String> receivers = super.getAdminReceivers();
sendSystemNotice("资金资产匹配监控告警", zhaolianOrgCode, sb.toString(), receivers);
}
PlanTaskLog planTaskLog = new PlanTaskLog();
planTaskLog.setExecDate(sysday);
planTaskLog.setPlanNo(zhaolianOrgCode);
planTaskLog.setTaskType(PlanTaskTypeEnum.CAP_AST_MATCH_KEEPER);
planTaskLogRepo.createTask(planTaskLog);
LogUtil.info(LOGGER, "资金资产匹配监控 - end");
}
}
return null;
}
/**
* @param sb 提示消息
* @param typeEnum 任务类型
*/
private void exec(StringBuffer sb, CommonTaskTypeEnum typeEnum) {
// 判断是否存在失败的任务
List<CommonTask> commonTasks = commonTaskRepository.queryByTypesAndStatus(Lists.newArrayList(typeEnum.getCode()), Lists.newArrayList(TaskStatusEnum.FAILURE.getCode()));
if (CollectionUtils.isNotEmpty(commonTasks)) {
sb.append(MessageUtil.formatMsg("[{0}]存在{1}条失败任务\n", typeEnum.getDesc(), commonTasks.size()));
}
// 判断执行时间大于1小时
Long count = commonTaskRepository.countByTypesAndStatusAndRange(second, Lists.newArrayList(typeEnum.getCode()), Lists.newArrayList(TaskStatusEnum.EXECUTING.getCode()));
if (count.intValue() != 0) {
sb.append(MessageUtil.formatMsg("[{0}]存在{1}条执行超时任务\n", typeEnum.getDesc(), count));
}
// 判断执行次数大于1
count = commonTaskRepository.countUnFinishAndMultipleExecByTypes(Lists.newArrayList(typeEnum.getCode()));
if (count.intValue() != 0) {
sb.append(MessageUtil.formatMsg("[{0}]存在{1}条执行次数大于1的任务\n", typeEnum.getDesc(), count));
}
}
@Override
protected IEnum getBizType() {
return AbssqrNoticeTypeEnum.CapitalAstMatch;
}
@Override
protected String getWatchJob() {
return CapitalAssertMatchJob.class.getName();
}
}
...@@ -4,13 +4,16 @@ ...@@ -4,13 +4,16 @@
*/ */
package com.abssqr.plat.biz.shared.scheduler.job.plan; package com.abssqr.plat.biz.shared.scheduler.job.plan;
import com.abssqr.plat.biz.shared.handler.PlanCashFrozenHandler; import java.util.Date;
import java.util.List;
import com.abssqr.plat.biz.shared.handler.PlanSettleHandler; import com.abssqr.plat.biz.shared.handler.PlanSettleHandler;
import com.abssqr.plat.biz.shared.scheduler.BaseQuartzJob; import com.abssqr.plat.biz.shared.scheduler.BaseQuartzJob;
import com.abssqr.plat.common.facade.enums.PlanStatusEnum; import com.abssqr.plat.common.facade.enums.PlanStatusEnum;
import com.abssqr.plat.common.facade.model.plan.PlanBase; import com.abssqr.plat.common.facade.model.plan.PlanBase;
import com.abssqr.plat.common.model.repo.plan.PlanRepo; import com.abssqr.plat.common.model.repo.plan.PlanRepo;
import com.abssqr.plat.core.service.accounting.OrgAcctDayComponent; import com.abssqr.plat.core.service.accounting.OrgAcctDayComponent;
import com.general.system.bpm.enums.ApproveStatusEnum; import com.general.system.bpm.enums.ApproveStatusEnum;
import com.general.system.common.util.DateTimeUtil; import com.general.system.common.util.DateTimeUtil;
import com.general.system.common.util.LogUtil; import com.general.system.common.util.LogUtil;
...@@ -28,9 +31,6 @@ import org.springframework.transaction.TransactionStatus; ...@@ -28,9 +31,6 @@ import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallbackWithoutResult; import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate; import org.springframework.transaction.support.TransactionTemplate;
import java.util.Date;
import java.util.List;
/** /**
* 计划资产需求统计任务 * 计划资产需求统计任务
* *
...@@ -46,8 +46,6 @@ public class PlanDailyJob extends BaseQuartzJob { ...@@ -46,8 +46,6 @@ public class PlanDailyJob extends BaseQuartzJob {
private final static Logger LOGGER = LoggerFactory.getLogger(PlanDailyJob.class); private final static Logger LOGGER = LoggerFactory.getLogger(PlanDailyJob.class);
@Autowired @Autowired
private PlanCashFrozenHandler planCashFrozenHandler;
@Autowired
private PlanSettleHandler planSettleHandler; private PlanSettleHandler planSettleHandler;
@Autowired @Autowired
private TransactionTemplate transactionTemplate; private TransactionTemplate transactionTemplate;
...@@ -149,8 +147,6 @@ public class PlanDailyJob extends BaseQuartzJob { ...@@ -149,8 +147,6 @@ public class PlanDailyJob extends BaseQuartzJob {
// 结息 // 结息
planSettleHandler.execute(planEntity, curDate); planSettleHandler.execute(planEntity, curDate);
// 水位冻结
planCashFrozenHandler.execute(planEntity, curDate);
} }
} }
} }
\ No newline at end of file
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.shared.scheduler.job.plan;
import com.abssqr.plat.biz.shared.handler.PlanAstReqHandler;
import com.abssqr.plat.biz.shared.scheduler.BaseQuartzJob;
import com.abssqr.plat.common.dal.mysql.auto.dao.PlanTranScreenRelDAO;
import com.abssqr.plat.common.facade.enums.AstPackStatusEnum;
import com.abssqr.plat.common.facade.enums.AstPackTradeTypeEnum;
import com.abssqr.plat.common.facade.enums.PlanTypeEnum;
import com.abssqr.plat.common.facade.enums.SyncTaskTypeEnum;
import com.abssqr.plat.common.facade.enums.TaskStatusEnum;
import com.abssqr.plat.common.facade.model.plan.PlanBase;
import com.abssqr.plat.common.facade.model.plan.PlanTransferRule;
import com.abssqr.plat.common.model.domain.ast.Pack;
import com.abssqr.plat.common.model.domain.task.TrCtrTask;
import com.abssqr.plat.common.model.repo.ast.PackRepository;
import com.abssqr.plat.common.model.repo.plan.PlanRepo;
import com.abssqr.plat.common.model.repo.task.AstSyncTaskCtrRepo;
import com.abssqr.plat.common.model.repo.tr.TrCtrTaskRepo;
import com.abssqr.plat.core.service.accounting.OrgAcctDayComponent;
import com.abssqr.plat.core.service.ast.AstPackManager;
import com.abssqr.plat.core.service.plan.PlanManager;
import com.abssqr.plat.core.service.plan.PlanTransferRuleManager;
import com.general.system.common.util.DateTimeUtil;
import com.general.system.common.util.DateTimeUtil.BetweenType;
import com.general.system.common.util.LogUtil;
import com.general.system.common.util.VarChecker;
import com.google.common.collect.Lists;
import org.apache.commons.collections.CollectionUtils;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.PersistJobDataAfterExecution;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate;
import java.util.Date;
import java.util.List;
/**
* 计划资产需求统计任务
*
* @author zhenxuan.luo
* @version com.abssqr.plat.biz.shared.scheduler.job.plan: PlanPackGenJob.java, v 0.1 2019-06-18 21:19 zhenxuan.luo
* Exp $
*/
@PersistJobDataAfterExecution
@DisallowConcurrentExecution
@Component
public class PlanPackJob extends BaseQuartzJob {
private final static Logger LOGGER = LoggerFactory.getLogger(PlanPackJob.class);
@Autowired
AstSyncTaskCtrRepo astSyncTaskCtrRepo;
@Autowired
TransactionTemplate transactionTemplate;
@Autowired
PlanAstReqHandler planAstReqHandler;
@Autowired
PlanTranScreenRelDAO planTranScreenRelDAO;
@Autowired
PlanManager planManager;
@Autowired
PlanRepo planRepo;
@Autowired
PackRepository packRepository;
@Autowired
TrCtrTaskRepo trCtrTaskRepo;
@Autowired
AstPackManager astPackManager;
@Autowired
private PlanTransferRuleManager planTransferRuleManager;
@Autowired
private OrgAcctDayComponent orgAcctDayComponent;
/**
* 每天 0 0/5 * * * ?
*/
@Value("${sync.quartz.plan.pack}")
private String cron;
@Override
protected String getCronExpr() {
return cron;
}
@Override
protected boolean isRequestRecovery() {
return true;
}
@Override
public void doExecute() {
// 转让会计日
Date curDate = orgAcctDayComponent.getTrfAcctDay().getStandardDate();
LogUtil.info(LOGGER, "[PlanPackJob]-[{0}]计划资产包任务start", curDate);
List<String> orgCodes = astSyncTaskCtrRepo.getLastStatusFinishedOrgCodes(curDate, SyncTaskTypeEnum.AST_MOD);
for (String orgCode : orgCodes) {
LogUtil.info(LOGGER, "[PlanPackJob]-[{0}]执行管理机构[{1}]相关的计划资产包生成", curDate, orgCode);
try {
List<TrCtrTask> activeTrCtrTasks = trCtrTaskRepo
.getByManagerOrgCode(orgCode, curDate, TaskStatusEnum.INIT, AstPackTradeTypeEnum.AST_TRF_BIZ);
List<Pack> activePacks = astPackManager.getByManagerOrgCode(orgCode, curDate, AstPackStatusEnum.INIT);
if (CollectionUtils.isNotEmpty(activeTrCtrTasks) || CollectionUtils.isNotEmpty(activePacks)) {
LogUtil.warn(LOGGER, "[PlanPackJob]-[{0}]执行管理机构[{1}]资产包生成,有执行中的资产包[{2}]或者转让任务[{3}]", curDate,
orgCode, activePacks.size(), activeTrCtrTasks.size());
continue;
}
List<String> planNos = planTranScreenRelDAO.getPlanNosByManagerOrg(orgCode);
List<Pack> packs = Lists.newArrayList();
for (String planNo : planNos) {
// 获取计划全量信息
PlanBase planBase = planRepo.getPlanByNo(planNo);
// 放款池跳出不生成资产包
if (planBase.getPlanType() == PlanTypeEnum.SPV) {
LogUtil.debug(LOGGER, "[PlanPackJob]-跳过放款计划[{0}]", planBase.getPlanNo());
continue;
}
// 对应转让规则 及 筛选规则
PlanTransferRule transferRule = planTransferRuleManager.getByPlanNo(planNo);
VarChecker.checkNotNull(transferRule, "计划[{0}]创建资产包找不到对应转让规则", planBase.getPlanNo());
boolean trCheck = DateTimeUtil.between(curDate, transferRule.getStartTrDate(),
transferRule.getStopTrDate(), BetweenType.se);
if (trCheck) {
// 构建资产包
Pack pack = planAstReqHandler.execute(planBase, transferRule, curDate);
if (null != pack) {
packs.add(pack);
}
}
}
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
for (Pack pack : packs) {
LogUtil.info(LOGGER, "[PlanPackJob]-[{0}]生成资产包[{1}]", curDate, pack);
packRepository.create(pack);
}
}
});
} catch (Throwable e) {
LogUtil.error(LOGGER, e, "[PlanPackJob]-[{0}]执行管理机构[{1}]相关的计划资产包异常", curDate, orgCode);
}
}
LogUtil.info(LOGGER, "[PlanPackJob]-[{0}]计划资产包任务End", curDate);
}
}
\ No newline at end of file
/**
* abssqr.comInc.
* Copyright(c)2019-2019AllRightsReserved.
*/
package com.abssqr.plat.common.facade.service.report;
import com.abssqr.plat.common.facade.model.report.PlanReport;
import com.abssqr.plat.common.facade.model.report.wk.WkManagerReport;
import com.abssqr.plat.common.facade.param.base.CommonPlanQryParam;
import com.abssqr.plat.common.facade.param.reportForm.ReportFormAstParam;
import com.abssqr.plat.common.facade.param.reportForm.ReportFormMgrParam;
import java.util.List;
/**
*
* @author yangcheng
* @version ReportService.java, v0.12019-07-0114:18 yangchengExp$
*/
public interface ReportService {
/**
* 计划报表查询
* @param param
* @return
*/
WkManagerReport getReportFormPlan(ReportFormMgrParam param);
/**
* 资产报表查询
* @param param
* @return
*/
List<PlanReport> getReportFormAst(ReportFormAstParam param);
/**
* 资产报表查询
* @param param
* @return
*/
List<PlanReport> getReportFormMonthEnd(CommonPlanQryParam param);
}
...@@ -6,27 +6,20 @@ package com.abssqr.plat.test; ...@@ -6,27 +6,20 @@ package com.abssqr.plat.test;
import java.util.Date; import java.util.Date;
import com.abssqr.plat.biz.shared.handler.LoanAstBuyBackMatchHandler;
import com.abssqr.plat.biz.shared.scheduler.job.keeper.node.CapitalAstMatchKeeper;
import com.abssqr.plat.common.dal.mysql.auto.dao.AcctDateDAO; import com.abssqr.plat.common.dal.mysql.auto.dao.AcctDateDAO;
import com.abssqr.plat.common.dal.sync.auto.dao.WkAbsMfsBillCtrDAO; import com.abssqr.plat.common.dal.sync.auto.dao.WkAbsMfsBillCtrDAO;
import com.abssqr.plat.common.facade.enums.YNEnum; import com.abssqr.plat.common.facade.enums.YNEnum;
import com.abssqr.plat.common.model.domain.accounting.AcctDate; import com.abssqr.plat.common.model.domain.accounting.AcctDate;
import com.abssqr.plat.common.model.domain.job.JobControl; import com.abssqr.plat.common.model.domain.job.JobControl;
import com.abssqr.plat.common.model.domain.task.ctr.AstSyncTaskCtr;
import com.abssqr.plat.common.model.enums.OrgCodeEnum; import com.abssqr.plat.common.model.enums.OrgCodeEnum;
import com.abssqr.plat.common.model.repo.acct.AcctDateRepo; import com.abssqr.plat.common.model.repo.acct.AcctDateRepo;
import com.abssqr.plat.common.model.repo.job.JobControlRepository; import com.abssqr.plat.common.model.repo.job.JobControlRepository;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import com.general.system.common.util.DateTimeUtil; import com.general.system.common.util.DateTimeUtil;
import com.general.system.common.util.SystemDateUtil;
import com.general.system.common.util.VarChecker; import com.general.system.common.util.VarChecker;
import org.apache.commons.lang3.StringUtils;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener; import org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.test.context.TestExecutionListeners; import org.springframework.test.context.TestExecutionListeners;
/** /**
...@@ -39,34 +32,11 @@ import org.springframework.test.context.TestExecutionListeners; ...@@ -39,34 +32,11 @@ import org.springframework.test.context.TestExecutionListeners;
@TestExecutionListeners(listeners = MockitoTestExecutionListener.class) @TestExecutionListeners(listeners = MockitoTestExecutionListener.class)
public class BaseAutoTests extends BaseAutoWithOutMockTests { public class BaseAutoTests extends BaseAutoWithOutMockTests {
// @MockBean
// protected JobControlRepository mockJobControlRepository;
//
//
// @BeforeMethod
// protected void stopJob(){
// JobControl jobControl = new JobControl();
// jobControl.setIsEff(YNEnum.N);
// when(mockJobControlRepository.selectByJobName(Mockito.anyString())).thenReturn(jobControl);
// when(mockJobControlRepository.lockByJobName(Mockito.anyString())).thenReturn(jobControl);
// }
//
// protected void mockJobEff(String jobName,YNEnum ynEnum){
// JobControl jobControl = new JobControl();
// jobControl.setIsEff(ynEnum);
// jobControl.setJobName(jobName);
// when(mockJobControlRepository.selectByJobName(jobName)).thenReturn(jobControl);
// when(mockJobControlRepository.lockByJobName(jobName)).thenReturn(jobControl);
// }
@Autowired @Autowired
private WkAbsMfsBillCtrDAO wkAbsMfsBillCtrDAO; private WkAbsMfsBillCtrDAO wkAbsMfsBillCtrDAO;
@Autowired @Autowired
private AcctDateDAO acctDateDAO; private AcctDateDAO acctDateDAO;
@Autowired @Autowired
private AcctDateRepo acctDateRepo; private AcctDateRepo acctDateRepo;
...@@ -79,17 +49,18 @@ public class BaseAutoTests extends BaseAutoWithOutMockTests { ...@@ -79,17 +49,18 @@ public class BaseAutoTests extends BaseAutoWithOutMockTests {
Date acctDate = DateUtil.parse(strDate); Date acctDate = DateUtil.parse(strDate);
this.updateDate(acctDate, orgCode); this.updateDate(acctDate, orgCode);
} }
protected void updateDate(Date acctDate, String orgCode) { protected void updateDate(Date acctDate, String orgCode) {
OrgCodeEnum org = OrgCodeEnum.getByCode(orgCode); OrgCodeEnum org = OrgCodeEnum.getByCode(orgCode);
VarChecker.checkNotNull(org, "不匹配的机构编码={0}", orgCode); VarChecker.checkNotNull(org, "不匹配的机构编码={0}", orgCode);
AcctDate now = acctDateRepo.getAcctDate(org); AcctDate now = acctDateRepo.getAcctDate(org);
if (now == null){ if (now == null) {
now = new AcctDate(); now = new AcctDate();
now.setOrgCode(org); now.setOrgCode(org);
now.setAcctDate(acctDate); now.setAcctDate(acctDate);
now.setEff(true); now.setEff(true);
acctDateRepo.addAcctDate(now); acctDateRepo.addAcctDate(now);
}else if (!DateTimeUtil.isSameDay(now.getAcctDate(), acctDate)) { } else if (!DateTimeUtil.isSameDay(now.getAcctDate(), acctDate)) {
now.setAcctDate(acctDate); now.setAcctDate(acctDate);
acctDateRepo.modifyAcctDate(now); acctDateRepo.modifyAcctDate(now);
} }
...@@ -100,6 +71,7 @@ public class BaseAutoTests extends BaseAutoWithOutMockTests { ...@@ -100,6 +71,7 @@ public class BaseAutoTests extends BaseAutoWithOutMockTests {
/** /**
* 停止任务 * 停止任务
*
* @param jobName * @param jobName
* @return * @return
*/ */
...@@ -120,6 +92,7 @@ public class BaseAutoTests extends BaseAutoWithOutMockTests { ...@@ -120,6 +92,7 @@ public class BaseAutoTests extends BaseAutoWithOutMockTests {
/** /**
* 开启任务 * 开启任务
*
* @param jobName * @param jobName
*/ */
protected void validJobCtr(String jobName) { protected void validJobCtr(String jobName) {
...@@ -138,40 +111,4 @@ public class BaseAutoTests extends BaseAutoWithOutMockTests { ...@@ -138,40 +111,4 @@ public class BaseAutoTests extends BaseAutoWithOutMockTests {
jobControlRepository.update(jobControl); jobControlRepository.update(jobControl);
} }
@SpyBean
private CapitalAstMatchKeeper capitalAstMatchKeeper;
protected void mockCapitalAstMatchKeeper(Date date) {
Mockito.doReturn(date).when(capitalAstMatchKeeper).getCurrentStanderDate();
}
@SpyBean
private LoanAstBuyBackMatchHandler loanAstBuyBackMatchHandler;
protected void mockLoanAstBuyBackMatchHandler(){
Mockito.doReturn(Boolean.TRUE).when(loanAstBuyBackMatchHandler).canRun();
}
protected void mockCurrentDate(Date date){
SystemDateUtil systemDateUtil = Mockito.mock(SystemDateUtil.class);
final Date date1 = Mockito.mock(Date.class);
Mockito.when(date1.getTime()).thenReturn(date.getTime());
// Mockito.
//Mockito.when(systemDateUtil).thenReturn(date);
//Mockito.doReturn(date).when(systemDateUtil);
}
protected void autoPartition(String orgCode) {
AstSyncTaskCtr astSyncTaskCtr=new AstSyncTaskCtr();
astSyncTaskCtr.setOrgCode(orgCode);
String partitionName = "BILL_CTR_"+astSyncTaskCtr.getOrgCode();
String pName = wkAbsMfsBillCtrDAO.queryPartitionForCheck(partitionName);
if(StringUtils.isBlank(pName)){
wkAbsMfsBillCtrDAO.updateCreatePartition(astSyncTaskCtr.getOrgCode(),partitionName);
}
}
} }
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.test.testlink.ast;
import com.abssqr.plat.biz.shared.scheduler.job.ast.ZLFinSerFeeJob;
import com.abssqr.plat.common.model.enums.OrgCodeEnum;
import com.abssqr.plat.test.BaseAutoTests;
import com.abssqr.test.annotation.XTest;
import com.abssqr.test.icase.ICase;
import org.springframework.beans.factory.annotation.Autowired;
import org.testng.annotations.Test;
/**
* @author bangis.wangdf
* @version com.abssqr.plat.test.testlink.ast: ZLFinSerFeeJobTest.java, v 0.1 2019-09-17 18:43 bangis.wangdf Exp $
*/
public class ZLFinSerFeeJobTest extends BaseAutoTests {
@Autowired
ZLFinSerFeeJob zlFinSerFeeJob;
@XTest(relatePath = "testlink/ast/finFee")
@Test(dataProvider = "YamlDataProvider", description = "金融服务费处理")
public void testFinSerFee(ICase iCase, String acctDate) {
try {
super.updateDate(acctDate, OrgCodeEnum.WK1009.getCode());
zlFinSerFeeJob.setZlOrgCode("1009");
zlFinSerFeeJob.doExecute();
}catch (Exception e){
e.printStackTrace();
} finally {
// 校验数据
super.checkDB(iCase);
super.clearDB(iCase);
}
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2020 All Rights Reserved.
*/
package com.abssqr.plat.test.unittest.capitalAstMatch;
import com.abssqr.plat.biz.shared.handler.CapitalAstMatchHandler;
import com.abssqr.plat.biz.shared.scheduler.job.capitalAssertMatch.CapitalAssertMatchJob;
import com.abssqr.plat.common.model.enums.OrgCodeEnum;
import com.abssqr.plat.test.BaseAutoTests;
import com.abssqr.test.annotation.XTest;
import com.abssqr.test.icase.ICase;
import com.general.system.common.util.DateTimeUtil;
import com.general.system.common.util.VarChecker;
import org.springframework.beans.factory.annotation.Autowired;
import org.testng.annotations.Test;
import java.util.Date;
/**
* 资金资产匹配测试
* @author xiachenxiang
* @version com.abssqr.plat.test.unittest.capitalAstMatch: CapitalAstMatchUnitTest.java, v 0.1 2020-02-04 6:21 PM xiachenxiang Exp $
*/
public class CapitalAstMatchUnitTest extends BaseAutoTests {
@Autowired
private CapitalAssertMatchJob capitalAssertMatchJob;
@Autowired
private CapitalAstMatchHandler capitalAstMatchHandler;
@XTest(relatePath = "unittest/capitalAstMatch/astMatch")
@Test(dataProvider = "YamlDataProvider", description = "资金资产匹配")
public void exec(ICase iCase,String planNo,String execDateString,String acctDay,boolean expectResult,boolean expectExp) {
super.validJobCtr(capitalAssertMatchJob.getJobName());
try {
Date execDate =DateTimeUtil.parseFromYMD(execDateString);
super.updateDate(acctDay, OrgCodeEnum.ABS.getCode());
boolean result = capitalAstMatchHandler.execute(planNo, execDate);
VarChecker.checkEquals(result,expectResult,"实际结果与期望不符");
}catch (Exception e){
if (!expectExp){
e.printStackTrace();
throw e;
}
}finally {
// 校验数据
super.checkDB(iCase);
super.clearDB(iCase);
}
}
}
package com.abssqr.plat.test.unittest.capitalAstUnMatch;
import com.abssqr.plat.biz.shared.handler.CapitalAstUnMatchHandler;
import com.abssqr.plat.biz.shared.scheduler.job.capitalAssertMatch.CapitalAssertMatchJob;
import com.abssqr.plat.common.dal.mysql.auto.resultmap.AstScale;
import com.abssqr.plat.common.model.enums.OrgCodeEnum;
import com.abssqr.plat.common.model.repo.ast.LoanBakRepo;
import com.abssqr.plat.test.BaseAutoTests;
import com.abssqr.test.annotation.XTest;
import com.abssqr.test.icase.ICase;
import com.general.system.common.model.Money;
import com.general.system.common.util.DateTimeUtil;
import org.apache.shiro.util.Assert;
import org.springframework.beans.factory.annotation.Autowired;
import org.testng.annotations.Test;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class CapitalAstUnMatchTest extends BaseAutoTests {
@Autowired
CapitalAstUnMatchHandler capitalAstUnMatchHandler;
@Autowired
LoanBakRepo loanBakRepo;
@Autowired
private CapitalAssertMatchJob capitalAssertMatchJob;
@XTest(relatePath = "unittest/capitalAstUnMatch")
@Test(dataProvider = "YamlDataProvider", description = "资金资产解绑")
public void exec(ICase iCase, String planNo,String allocNo, String acctDay,String layerNo,Integer allOwnCapital) {
super.validJobCtr(capitalAssertMatchJob.getJobName());
try {
Date acctDate = DateTimeUtil.parseFromYMD(acctDay);
super.updateDate(acctDate, OrgCodeEnum.ABS.getCode());
capitalAstUnMatchHandler.execute(planNo,allocNo,acctDate);
List<AstScale> astScaleList = loanBakRepo.getAstScale(acctDate, planNo);
Map<String, List<AstScale>> capitalAstMap = astScaleList.stream()
.collect(Collectors.groupingBy(AstScale::getCapitalNo));
List<AstScale> astScales = capitalAstMap.get(layerNo);
Assert.notEmpty(astScales,"找不到投资层级"+layerNo+"对应的资产");
Money prinBal = astScales.get(0).getPrinBal();
Assert.isTrue(prinBal.getAmount().compareTo(new BigDecimal(allOwnCapital))<=0,"不符合预期资产规模");
}catch (Exception e){
e.printStackTrace();
throw e;
}finally {
// 校验数据
super.checkDB(iCase);
super.clearDB(iCase);
}
}
}
package com.abssqr.plat.test.unittest.job;
import com.abssqr.plat.biz.shared.scheduler.job.capitalAssertMatch.CapitalAssertMatchJob;
import com.abssqr.plat.common.facade.enums.YNEnum;
import com.abssqr.plat.common.model.domain.job.JobControl;
import com.abssqr.plat.common.model.enums.OrgCodeEnum;
import com.abssqr.plat.common.model.repo.job.JobControlRepository;
import com.abssqr.plat.test.BaseAutoTests;
import com.abssqr.test.annotation.XTest;
import com.abssqr.test.icase.ICase;
import org.springframework.beans.factory.annotation.Autowired;
import org.testng.annotations.Test;
import java.text.ParseException;
/*
前置条件: 不存在Init或者exec的任务
情况一,存在为Ignore的解绑匹配任务
情况二,存在已审批通过未解绑兑付计划
情况三,今日模型转换已完成且未生成同步匹配任务
*/
public class CapitalAssertMatchJobTest extends BaseAutoTests {
@Autowired
private CapitalAssertMatchJob capitalAssertMatchJob;
@Autowired
private JobControlRepository jobControlRepository;
@XTest(relatePath = "unittest/job/capitalAssetMatch")
@Test(dataProvider = "YamlDataProvider", description = "生成资产解绑和资产资金匹配的任务")
public void jobTest(ICase iCase, String strDate) throws ParseException {
try {
//开启CapitalAssertMatchJob任务
JobControl jobControl = jobControlRepository.selectByJobName(capitalAssertMatchJob.getJobName());
jobControl.setIsEff(YNEnum.Y);
jobControlRepository.update(jobControl);
// 更新会计日期
super.updateDate(strDate, OrgCodeEnum.ABS.getCode());
capitalAssertMatchJob.doExecute();
}catch (Exception e){
e.printStackTrace();
throw e;
}finally {
// 校验数据
super.checkDB(iCase);
super.clearDB(iCase);
}
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2020 All Rights Reserved.
*/
package com.abssqr.plat.test.unittest.job.keeper;
import com.abssqr.plat.biz.shared.scheduler.job.capitalAssertMatch.CapitalAssertMatchJob;
import com.abssqr.plat.biz.shared.scheduler.job.keeper.node.CapitalAstMatchKeeper;
import com.abssqr.plat.test.BaseAutoTests;
import com.abssqr.test.annotation.XTest;
import com.abssqr.test.icase.ICase;
import org.springframework.beans.factory.annotation.Autowired;
import org.testng.annotations.Test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 资金资产匹配监控测试
* @author xiachenxiang
* @version com.abssqr.plat.test.unittest.job.keeper: CapitalAstMatchKeeperTest.java, v 0.1 2020-02-07 4:59 PM xiachenxiang Exp $
*/
public class CapitalAstMatchKeeperTest extends BaseAutoTests {
@Autowired
private CapitalAstMatchKeeper capitalAstMatchKeeper;
@XTest(relatePath = "unittest/job/CapitalAstMatchKeeper")
@Test(dataProvider = "YamlDataProvider", description = "资金资产匹配监控测试")
public void jobTest(ICase iCase, String strDate) {
try {
// 更新会计日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = sdf.parse(strDate);
validJobCtr(CapitalAssertMatchJob.class.getName());
mockCapitalAstMatchKeeper(date);
capitalAstMatchKeeper.execute(date);
invalidJobCtr(CapitalAssertMatchJob.class.getName());
} catch (ParseException e) {
throw new RuntimeException(e.getMessage());
} finally {
// 校验数据
super.checkDB(iCase);
super.clearDB(iCase);
}
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2020 All Rights Reserved.
*/
package com.abssqr.plat.test.unittest.planBuyBack;
import com.abssqr.plat.biz.shared.dispatcher.buyBackMatch.LoanAstBuyBackMatchExecutor;
import com.abssqr.plat.biz.shared.dispatcher.buyBackMatch.LoanAstBuyBackMatchLoader;
import com.abssqr.plat.biz.shared.dispatcher.buyBackMatch.LoanAstBuyBackMatchStarter;
import com.abssqr.plat.common.model.domain.task.CommonTask;
import com.abssqr.plat.common.model.enums.OrgCodeEnum;
import com.abssqr.plat.test.BaseAutoTests;
import com.abssqr.test.annotation.XTest;
import com.abssqr.test.icase.ICase;
import org.springframework.beans.factory.annotation.Autowired;
import org.testng.annotations.Test;
import java.util.List;
/**
* 资产回购筛选测试
*
* @author xiachenxiang
* @version com.abssqr.plat.test.unittest.planBuyBack: PlanBuyBack.java, v 0.1 2020-02-12 2:10 PM xiachenxiang Exp $
*/
public class PlanBuyBackMatchTest extends BaseAutoTests {
@Autowired
private LoanAstBuyBackMatchLoader planBuyBackMatchLoader;
@Autowired
private LoanAstBuyBackMatchExecutor planBuyBackMatchExecutor;
@XTest(relatePath = "unittest/planBuyBack/match")
@Test(dataProvider = "YamlDataProvider", description = "资产回购筛选")
public void execute(ICase iCase, String acctDate) {
try {
// 更新会计日期
super.updateDate(acctDate, OrgCodeEnum.ABS.getCode());
// 设置任务关闭
this.invalidJobCtr(LoanAstBuyBackMatchStarter.JOB_NAME);
mockLoanAstBuyBackMatchHandler();
planBuyBackMatchLoader.setSleepTime(0L);
List<CommonTask> commonTasks = planBuyBackMatchLoader.loadToDoNodes(1);
planBuyBackMatchExecutor.execute(commonTasks.get(0));
} catch (Exception e) {
throw e;
} finally {
// 校验数据
super.checkDB(iCase);
super.clearDB(iCase);
}
}
}
...@@ -10,10 +10,7 @@ package com.abssqr.plat.web.controller.job; ...@@ -10,10 +10,7 @@ package com.abssqr.plat.web.controller.job;
import java.util.List; import java.util.List;
import com.abssqr.plat.biz.shared.scheduler.job.ast.ZLFinSerFeeJob;
import com.abssqr.plat.biz.shared.scheduler.job.capitalAssertMatch.CapitalAssertMatchJob;
import com.abssqr.plat.biz.shared.scheduler.job.plan.PlanDailyJob; import com.abssqr.plat.biz.shared.scheduler.job.plan.PlanDailyJob;
import com.abssqr.plat.biz.shared.scheduler.job.plan.PlanPackJob;
import com.abssqr.plat.common.facade.model.account.Account; import com.abssqr.plat.common.facade.model.account.Account;
import com.abssqr.plat.common.facade.model.plan.PlanBase; import com.abssqr.plat.common.facade.model.plan.PlanBase;
import com.abssqr.plat.common.facade.service.AccountService; import com.abssqr.plat.common.facade.service.AccountService;
...@@ -50,30 +47,14 @@ public class JobController { ...@@ -50,30 +47,14 @@ public class JobController {
@Autowired @Autowired
private PlanDailyJob planDailyJob; private PlanDailyJob planDailyJob;
@Autowired @Autowired
private PlanPackJob planPackJob;
@Autowired
private ZLFinSerFeeJob zlFinSerFeeJob;
@Autowired
private PlanReportRepo planReportRepo; private PlanReportRepo planReportRepo;
@Autowired @Autowired
private AccountService accountService; private AccountService accountService;
@Autowired @Autowired
private CapitalAssertMatchJob capitalAssertMatchJob;
@Autowired
private OrgAcctDayComponent orgAcctDayComponent; private OrgAcctDayComponent orgAcctDayComponent;
/**
* 计划资产包生成任务
*
* @return
* @description
*/
@RequestMapping(path = "/job/planPackJob.json", method = RequestMethod.GET)
public BaseResult<Boolean> planPackJob() {
planPackJob.doExecute();
return BaseResult.success(null);
}
/** /**
* 每日处理 * 每日处理
...@@ -92,18 +73,6 @@ public class JobController { ...@@ -92,18 +73,6 @@ public class JobController {
/** /**
* 资金资产任务Task生成Job
*
* @return
* @description
*/
@RequestMapping(path = "/job/capitalAssetMatchJob.json", method = RequestMethod.GET)
public BaseResult<Boolean> capitalAssetMatchJob() {
capitalAssertMatchJob.doExecute();
return BaseResult.success(null);
}
/**
* 查询账户余额 * 查询账户余额
* *
* @return * @return
...@@ -114,17 +83,6 @@ public class JobController { ...@@ -114,17 +83,6 @@ public class JobController {
return accountService.queryBalance(); return accountService.queryBalance();
} }
/**
* 查询账户余额
*
* @return
* @description
*/
@RequestMapping(path = "/acct/zlFinSerFeeJob.json", method = RequestMethod.GET)
public BaseResult<Boolean> zlFinSerFeeJob() {
zlFinSerFeeJob.doExecute();
return BaseResult.success(null);
}
/** /**
* 初始化计划 日报基础数据 * 初始化计划 日报基础数据
......
/**
* abssqr.comInc.
* Copyright(c)2019-2019AllRightsReserved.
*/
package com.abssqr.plat.web.controller.report;
import com.abssqr.plat.common.facade.enums.PlanTypeEnum;
import com.abssqr.plat.common.facade.enums.TimeStampTypeEnum;
import com.abssqr.plat.common.facade.model.report.MonthReportDateField;
import com.abssqr.plat.common.facade.model.report.PlanReport;
import com.abssqr.plat.common.facade.model.report.wk.WkManagerReport;
import com.abssqr.plat.common.facade.param.base.CommonPlanQryParam;
import com.abssqr.plat.common.facade.param.reportForm.ReportFormAstParam;
import com.abssqr.plat.common.facade.param.reportForm.ReportFormMgrParam;
import com.abssqr.plat.common.facade.service.report.ReportService;
import com.abssqr.plat.common.model.exception.AbssqrBizException;
import com.abssqr.plat.web.fileExport.FileExportTypeEnum;
import com.abssqr.plat.web.fileExport.FileExportUtil;
import com.abssqr.plat.common.facade.utils.ListID;
import com.general.system.common.util.MessageUtil;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 报表中心
*
* @author yangcheng
* @version ReportFormController.java, v0.12019-06-2819:14 yangchengExp$
*/
@Controller
@RequestMapping(value = "/export")
public class ReportFormController {
@Autowired
private FileExportUtil fileExportUtil;
@Autowired
private ReportService reportService;
/**
* 管理报表
* @param param
* @return
* @description 查询计划报表
*/
@RequestMapping(path = "/reportForm/plan/months", method = RequestMethod.GET)
public void getReportFormPlan(ReportFormMgrParam param, HttpServletResponse response) throws IOException {
FileExportTypeEnum fileExportType= param.getPlanType().equals(PlanTypeEnum.SPV.getCode())?
FileExportTypeEnum.MANAGER_SPV_RPT:FileExportTypeEnum.MANAGER_PLAN_RPT;
WkManagerReport wkManagerReport=reportService.getReportFormPlan(param);
String begin = param.getBeginTime();
String end = param.getEndTime();
if (wkManagerReport == null) {
throw new AbssqrBizException(MessageUtil.formatMsg("计划[{0}]对应日期[{1}-{2}]的报表未生成"
, param.getPlanNo(),begin,end));
}
// 报表模型数据
Map<String, Object> model = new HashMap<>();
String rptDate = param.getYear() + TimeStampTypeEnum.getByCode(param.getTimeStamp()).getDesc();
model.put("rpt", wkManagerReport);
model.put("rptDate", rptDate);
model.put("investId", new ListID());
model.put("feeId", new ListID());
MonthReportDateField beginDays = new MonthReportDateField();
beginDays.parse(begin);
MonthReportDateField endDays = new MonthReportDateField();
endDays.parse(end);
String fileKey = param.getPlanNo() + "_" + beginDays.desc() + "-" + endDays.desc();
fileExportUtil.exportXls(response, fileExportType, fileKey, model);
}
/**
* 查询资产报表
* @param param
* @return
* @description 查询资产报表
*/
@RequestMapping(path = "/reportForm/ast/days", method = RequestMethod.GET)
public void getReportFormPlanAst(ReportFormAstParam param, HttpServletResponse response) throws IOException {
FileExportTypeEnum fileExportType= param.getPlanType().equals(PlanTypeEnum.SPV.getCode())?
FileExportTypeEnum.AST_SPV_RPT:FileExportTypeEnum.AST_PLAN_RPT;
List<PlanReport> reports = reportService.getReportFormAst(param);
if (CollectionUtils.isEmpty(reports)) {
throw new AbssqrBizException(MessageUtil.formatMsg("计划[{0}]对应日期[{1}-{2}]的报表未生成", param.getPlanNo(),
param.getBeginDate(), param.getEndDate()));
}
PlanReport firstRpt = reports.get(0);
PlanReport lastRpt = reports.get(reports.size() - 1);
// 报表模型数据
Map<String, Object> model = new HashMap<>();
model.put("reports", reports);
String fileKey = param.getPlanNo() + "_" + firstRpt.getRptDate().desc() + "-" + lastRpt.getRptDate().desc();
fileExportUtil.exportXls(response, fileExportType, fileKey, model);
}
/**
* 受让池资产月末报表
* @param param
* @return
* @description 查询资产报表
*/
@RequestMapping(path = "/reportForm/ast/monthEnd", method = RequestMethod.GET)
public void getReportFormAstMonth(CommonPlanQryParam param, HttpServletResponse response) throws IOException {
List<PlanReport> reports = reportService.getReportFormMonthEnd(param);
if (CollectionUtils.isEmpty(reports)) {
throw new AbssqrBizException(MessageUtil.formatMsg("计划[{0}]月末报表没有生成", param.getPlanNo()));
}
PlanReport firstRpt = reports.get(0);
PlanReport lastRpt = reports.get(reports.size() - 1);
// 报表模型数据
Map<String, Object> model = new HashMap<>();
model.put("reports", reports);
String fileKey = param.getPlanNo() + "_" + firstRpt.getRptDate().desc() + "-" + lastRpt.getRptDate().desc();
fileExportUtil.exportXls(response, FileExportTypeEnum.AST_ME_RPT, fileKey, model);
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment