Commit 301a6da8 by 王德峰

bb 项目初始化

parents

Too many changes to show.

To preserve performance only 1000 of 1000+ files are displayed.

/target/
!.mvn/wrapper/maven-wrapper.jar
*.class
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
mvnw
mvnw.cmd
.mvn
### NetBeans ###
/nbproject/private/
/build/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
.DS_Store
blueBridge-梦想之桥
\ No newline at end of file
/target/
!.mvn/wrapper/maven-wrapper.jar
*.class
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
mvnw
mvnw.cmd
.mvn
### NetBeans ###
/nbproject/private/
/build/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
.DS_Store
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.abssqr.bbplat</groupId>
<artifactId>bb-parent</artifactId>
<version>1.0.0</version>
<relativePath>../../../pom.xml</relativePath>
</parent>
<groupId>com.abssqr.bbplat</groupId>
<artifactId>biz-service</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<name>biz-service</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.abssqr.bbplat</groupId>
<artifactId>common-facade</artifactId>
</dependency>
<dependency>
<groupId>com.abssqr.bbplat</groupId>
<artifactId>common-model</artifactId>
</dependency>
<dependency>
<groupId>com.abssqr.bbplat</groupId>
<artifactId>biz-shared</artifactId>
</dependency>
<!-- 数据库 -->
<dependency>
<groupId>com.abssqr.gateway</groupId>
<artifactId>abssqr-gateway</artifactId>
<version>${abssqr.gateway}</version>
</dependency>
</dependencies>
</project>
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.api.account;
import com.abssqr.plat.common.facade.enums.AccountTypeEnum;
import com.abssqr.plat.common.facade.enums.PlanStatusEnum;
import com.abssqr.plat.common.facade.model.account.Account;
import com.abssqr.plat.common.facade.model.plan.PlanBase;
import com.abssqr.plat.common.facade.service.AccountService;
import com.abssqr.plat.common.model.exception.AbssqrBizException;
import com.abssqr.plat.common.model.repo.plan.PlanRepo;
import com.abssqr.plat.core.service.acct.AcctManager;
import com.general.system.common.model.exception.BaseCommonException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
* 账户处理
* @author hanfei
* @version $Id: AccountServiceImpl.java, v 0.1 2019-12-27 12:42 AM hanfei Exp $
*/
@Service
public class AccountServiceImpl implements AccountService {
@Autowired
private AcctManager acctManager;
@Autowired
private PlanRepo planRepo;
/**
* 查询存续中计划所有账户余额
* @return
*/
@Override
public List<Account> queryBalance(){
// 1. 查询存续中的所有计划
List<PlanBase> planBases = planRepo.getPlansByStatus(null, PlanStatusEnum.ONGOING);
List<Account> accountList = new ArrayList<>();
for(PlanBase planBase : planBases){
int maxCnt = 3;
List<Account> accounts = null;
while (accounts == null && maxCnt > 0){
try {
// 查询计划对应虚拟户账户余额
accounts = acctManager.getAcctByPlanNoAndType(planBase.getPlanNo(),
AccountTypeEnum.PLAT_VIRTUAL,true);
accountList.addAll(accounts);
maxCnt = 0;
Thread.sleep(2000);
} catch (BaseCommonException e){
maxCnt --;
} catch (InterruptedException e) {
throw new AbssqrBizException("线程等待异常");
}
}
}
return accountList;
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.api.analyse;
import cn.hutool.core.collection.CollectionUtil;
import com.abssqr.plat.biz.api.analyse.node.AnalyseChartContext;
import com.abssqr.plat.biz.api.analyse.node.AnalyseChartNodeBase;
import com.abssqr.plat.common.facade.enums.AnalyseServiceEnum;
import com.general.system.common.util.LogUtil;
import com.general.system.util.adapter.selector.AbstractMultipleActionSelector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* 统计图执行多个符合条件节点的 数据整合
* @author hanfei
* @version $Id: AnalyseChartSelector.java, v 0.1 2019-09-25 11:58 PM hanfei Exp $
*/
@Component
public class AnalyseChartMultipleSelector extends AbstractMultipleActionSelector<AnalyseChartContext, AnalyseServiceEnum> {
protected final Logger LOGGER = LoggerFactory.getLogger(getClass());
@Autowired(required = false)
private AnalyseChartNodeBase[] analyseChartNodeBases;
@Override
public void initHandlers() {
LogUtil.info(LOGGER, "统计图总执行器加载可执行节点[{0}]", analyseChartNodeBases.length );
super.setHandlers(CollectionUtil.newArrayList(analyseChartNodeBases));
}
@Override
public List<AnalyseServiceEnum> getAllAllowTypeValues() {
return CollectionUtil.newArrayList(AnalyseServiceEnum.values());
}
@Override
public List<AnalyseServiceEnum> getRequestAllowTypes(AnalyseChartContext context) {
return context.getServices();
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.api.analyse.node;
import com.abssqr.plat.common.facade.enums.AnalyseServiceEnum;
import com.abssqr.plat.common.facade.model.report.ReportField;
import com.abssqr.plat.common.facade.model.report.wk.WkAstReportFields;
import com.abssqr.plat.common.facade.utils.CalcUtil;
import com.abssqr.plat.core.service.util.AnalyseReportUtil;
import com.google.common.collect.Lists;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.List;
/**
* 整体逾期率
* @author hanfei
* @version $Id: AnalyseChartAna101Node.java, v 0.1 2019-10-09 11:26 PM hanfei Exp $
*/
@Component
public class AnalyseChartAna101Node extends AnalyseChartNodeBase {
/**
* 放款池、承接池报表的逾期剩余本金和 (WK012) / 放款池、承接池资产剩余本金和 (WK017)
* @param context
* @return
*/
@Override
protected Void handle(AnalyseChartContext context) {
List<ReportField> amtFields = Lists.newArrayList(
WkAstReportFields.WK012,
WkAstReportFields.WK017
);
super.handleDayTrendChart(context, amtFields, true, (acctDate, itemMap) -> {
// 计算逾期率 = 放款池、承接池报表的逾期剩余本金和 / 放款池、承接池资产剩余本金和
BigDecimal denominator = AnalyseReportUtil.getItemBig(itemMap, WkAstReportFields.WK017);
return CalcUtil.dividePercRate(
AnalyseReportUtil.getItemBig(itemMap, WkAstReportFields.WK012), denominator);
});
return null;
}
@Override
protected AnalyseServiceEnum getServiceEnum(){
return AnalyseServiceEnum.DAY_OVD;
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.api.analyse.node;
import com.abssqr.plat.common.facade.enums.AnalyseServiceEnum;
import com.abssqr.plat.common.facade.model.report.ReportField;
import com.abssqr.plat.common.facade.model.report.wk.WkAstReportFields;
import com.abssqr.plat.common.facade.utils.CalcUtil;
import com.abssqr.plat.core.service.util.AnalyseReportUtil;
import com.google.common.collect.Lists;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.List;
/**
* 早偿率计算
* @author hanfei
* @version $Id: AnalyseChartAna102Node.java, v 0.1 2019-10-09 11:26 PM hanfei Exp $
*/
@Component
public class AnalyseChartAna102Node extends AnalyseChartNodeBase {
/**
* 放款池、承接池早偿金额和 (WK042+WK043) / 放款池、承接吃资产剩余本金和 (WK017)
* @param context
* @return
*/
@Override
protected Void handle(AnalyseChartContext context) {
List<ReportField> amtFields = Lists.newArrayList(
WkAstReportFields.WK042,
WkAstReportFields.WK043,
WkAstReportFields.WK017
);
super.handleDayTrendChart(context, amtFields, true, (acctDate, itemMap) -> {
List<ReportField> repayFields = Lists.newArrayList(
WkAstReportFields.WK042,
WkAstReportFields.WK043
);
// 计算早偿率 = 放款池、承接池早偿金额和 (WK042+WK043) / 放款池、承接吃资产剩余本金和 (WK017)
BigDecimal denominator = AnalyseReportUtil.getItemBig(itemMap, WkAstReportFields.WK017);
return CalcUtil.dividePercRate(AnalyseReportUtil.getItemBig(itemMap, repayFields), denominator);
});
return null;
}
@Override
protected AnalyseServiceEnum getServiceEnum(){
return AnalyseServiceEnum.DAY_PRE;
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.api.analyse.node;
import com.abssqr.plat.common.facade.enums.AnalyseServiceEnum;
import com.abssqr.plat.common.facade.model.report.ReportField;
import com.abssqr.plat.common.facade.model.report.wk.WkAstReportFields;
import com.abssqr.plat.core.service.util.AnalyseReportUtil;
import com.google.common.collect.Lists;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* 统计 新增放贷金额
* @author hanfei
* @version $Id: AnalyseChartAna103Node.java, v 0.1 2019-10-09 11:26 PM hanfei Exp $
*/
@Component
public class AnalyseChartAna103Node extends AnalyseChartNodeBase {
/**
* 日期区间 新增放贷金额
* @param context
* @return
*/
@Override
protected Void handle(AnalyseChartContext context) {
List<ReportField> amtFields = Lists.newArrayList(
WkAstReportFields.WK111
);
super.handleDayTrendChart(context, amtFields, false,
(acctDate, itemMap) -> AnalyseReportUtil.getItemMoney(itemMap, WkAstReportFields.WK111).getAmount());
return null;
}
@Override
protected AnalyseServiceEnum getServiceEnum(){
return AnalyseServiceEnum.GRANT;
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.api.analyse.node;
import com.abssqr.plat.common.facade.enums.AnalyseServiceEnum;
import com.abssqr.plat.common.facade.model.report.ReportField;
import com.abssqr.plat.common.facade.model.report.wk.WkAstReportFields;
import com.abssqr.plat.core.service.util.AnalyseReportUtil;
import com.google.common.collect.Lists;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* 统计 转让资产金额
* @author hanfei
* @version $Id: AnalyseChartAna104Node.java, v 0.1 2019-10-09 11:26 PM hanfei Exp $
*/
@Component
public class AnalyseChartAna104Node extends AnalyseChartNodeBase {
/**
* 日期区间 交易贷款发生额
* @param context
* @return
*/
@Override
protected Void handle(AnalyseChartContext context) {
List<ReportField> amtFields = Lists.newArrayList(
WkAstReportFields.WK028
);
super.handleDayTrendChart(context, amtFields, false,
(acctDate, itemMap) -> AnalyseReportUtil.getItemMoney(itemMap, WkAstReportFields.WK028).getAmount());
return null;
}
@Override
protected AnalyseServiceEnum getServiceEnum(){
return AnalyseServiceEnum.TRANS;
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.api.analyse.node;
import com.abssqr.plat.common.facade.enums.AnalyseServiceEnum;
import com.abssqr.plat.common.facade.model.report.ReportField;
import com.abssqr.plat.common.facade.model.report.wk.WkAstReportFields;
import com.abssqr.plat.core.service.util.AnalyseReportUtil;
import com.google.common.collect.Lists;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* 统计 总资产规模
* @author hanfei
* @version $Id: AnalyseChartAna105Node.java, v 0.1 2019-10-09 11:26 PM hanfei Exp $
*/
@Component
public class AnalyseChartAna105Node extends AnalyseChartNodeBase {
/**
* 日期区间 总贷款本金余额
* @param context
* @return
*/
@Override
protected Void handle(AnalyseChartContext context) {
List<ReportField> amtFields = Lists.newArrayList(
WkAstReportFields.WK017
);
super.handleDayTrendChart(context, amtFields,true,
(acctDate, itemMap) -> AnalyseReportUtil.getItemMoney(itemMap, WkAstReportFields.WK017).getAmount());
return null;
}
@Override
protected AnalyseServiceEnum getServiceEnum(){
return AnalyseServiceEnum.TOTAL_SCALE;
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.api.analyse.node;
import com.abssqr.plat.common.facade.enums.AnalyseServiceEnum;
import com.abssqr.plat.common.facade.model.report.ReportField;
import com.abssqr.plat.common.facade.model.report.wk.WkAstReportFields;
import com.abssqr.plat.core.service.util.AnalyseReportUtil;
import com.google.common.collect.Lists;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* 闲置资金余额
* @author hanfei
* @version $Id: AnalyseChartAna201Node.java, v 0.1 2019-10-09 11:26 PM hanfei Exp $
*/
@Component
public class AnalyseChartAna201Node extends AnalyseChartNodeBase {
/**
* 闲置资金余额
* @param context
* @return
*/
@Override
protected Void handle(AnalyseChartContext context) {
List<ReportField> amtFields = Lists.newArrayList(
WkAstReportFields.WK001
);
super.handleDayTrendChart(context, amtFields, true,
(acctDate, itemMap) -> AnalyseReportUtil.getItemMoney(itemMap, WkAstReportFields.WK001).getAmount());
return null;
}
@Override
protected AnalyseServiceEnum getServiceEnum(){
return AnalyseServiceEnum.BAL_FUND;
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.api.analyse.node;
import com.abssqr.plat.common.facade.enums.AnalyseServiceEnum;
import com.abssqr.plat.common.facade.model.report.ReportField;
import com.abssqr.plat.common.facade.model.report.wk.WkAstReportFields;
import com.abssqr.plat.core.service.util.AnalyseReportUtil;
import com.google.common.collect.Lists;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* 资金流出
* @author hanfei
* @version $Id: AnalyseChartAna202Node.java, v 0.1 2019-10-09 11:26 PM hanfei Exp $
*/
@Component
public class AnalyseChartAna202Node extends AnalyseChartNodeBase {
/**
* 资金流出
* 放款池兑付流出+承接池兑付流出+金融服务费+放款户贷款投放
* @param context
* @return
*/
@Override
protected Void handle(AnalyseChartContext context) {
List<ReportField> amtFields = Lists.newArrayList(
WkAstReportFields.WK005,
WkAstReportFields.WK108,
WkAstReportFields.WK111
);
super.handleDayTrendChart(context, amtFields, true,
(acctDate, itemMap) -> AnalyseReportUtil.getItemMoney(itemMap, amtFields).getAmount());
return null;
}
@Override
protected AnalyseServiceEnum getServiceEnum(){
return AnalyseServiceEnum.OUT_FUND;
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.api.analyse.node;
import com.abssqr.plat.common.facade.enums.AnalyseServiceEnum;
import com.abssqr.plat.common.facade.model.report.ReportField;
import com.abssqr.plat.common.facade.model.report.wk.WkAstReportFields;
import com.abssqr.plat.core.service.util.AnalyseReportUtil;
import com.google.common.collect.Lists;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* 资金流入
* @author hanfei
* @version $Id: AnalyseChartAna203Node.java, v 0.1 2019-10-09 11:26 PM hanfei Exp $
*/
@Component
public class AnalyseChartAna203Node extends AnalyseChartNodeBase {
/**
* 资金流入
* 放款池、承接池信托本金投入、贷款还款流入
* @param context
* @return
*/
@Override
protected Void handle(AnalyseChartContext context) {
List<ReportField> amtFields = Lists.newArrayList(
WkAstReportFields.WK004, WkAstReportFields.WK007
);
super.handleDayTrendChart(context, amtFields, true,
(acctDate, itemMap) -> AnalyseReportUtil.getItemMoney(
itemMap, WkAstReportFields.WK004, WkAstReportFields.WK007).getAmount());
return null;
}
@Override
protected AnalyseServiceEnum getServiceEnum(){
return AnalyseServiceEnum.IN_FUND;
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.api.analyse.node;
import com.abssqr.plat.common.facade.enums.AnalyseServiceEnum;
import com.abssqr.plat.common.facade.model.plan.PlanBase;
import com.abssqr.plat.common.facade.model.report.ReportField;
import com.abssqr.plat.common.facade.model.report.wk.WkAstReportFields;
import com.abssqr.plat.common.facade.utils.CalcUtil;
import com.abssqr.plat.core.service.util.AnalyseReportUtil;
import com.general.system.common.model.Money;
import com.google.common.collect.Lists;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.List;
/**
* 日闲置率
* @author hanfei
* @version $Id: AnalyseChartAna204Node.java, v 0.1 2019-10-09 11:26 PM hanfei Exp $
*/
@Component
public class AnalyseChartAna204Node extends AnalyseChartNodeBase {
/**
* 日闲置率
* 放款池、承接池 日可用资金总额/ 放款池 + 承接池信托规模
* @param context
* @return
*/
@Override
protected Void handle(AnalyseChartContext context) {
List<ReportField> amtFields = Lists.newArrayList(
WkAstReportFields.WK001
);
// 查询对应受让池计划
List<PlanBase> planBases = analyseSpvReportManager.getPlanBySpv(context.getPlanBase().getPlanNo());
// 统计图获取数据
super.handleDayTrendChart(context, amtFields, true, (acctDate, itemMap) -> {
// 放款池、承接池 日可用资金总额
BigDecimal numerator = AnalyseReportUtil.getItemBig(itemMap, WkAstReportFields.WK001);
// 获取放款池、承接池信托计划规模合计
Money denominator = AnalyseReportUtil.getPlanTotalAmtBySpvPlanNo(context.getPlanBase(), planBases);
return CalcUtil.dividePercRate(numerator, denominator.getAmount());
});
return null;
}
@Override
protected AnalyseServiceEnum getServiceEnum(){
return AnalyseServiceEnum.DAY_IDLE;
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.api.analyse.node;
import com.abssqr.plat.common.facade.enums.AnalyseServiceEnum;
import com.abssqr.plat.common.facade.model.report.PlanReportItem;
import com.abssqr.plat.common.facade.model.report.ReportField;
import com.abssqr.plat.common.facade.model.report.wk.WkAstReportFields;
import com.abssqr.plat.common.facade.result.analyse.AnalyseChartItemVO;
import com.abssqr.plat.core.service.util.AnalyseReportUtil;
import com.google.common.collect.Lists;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* 资金情况流动
* @author hanfei
* @version $Id: AnalyseChartAna205Node.java, v 0.1 2019-10-09 11:26 PM hanfei Exp $
*/
@Component
public class AnalyseChartAna205Node extends AnalyseChartNodeBase {
/**
* 资金情况流动
资金流出项 图表:资金流出明细
资金流入项 图表:资金流入明细
转让贷款资金发生额
兑付流出 兑付流出-启鑫、兑付流出-汇鑫……
金融服务费 金融服务费-启鑫、金融服务费-汇鑫……
新增贷款投放 启鑫放款
* @param context
* @return
*/
@Override
protected Void handle(AnalyseChartContext context) {
List<ReportField> statFields = Lists.newArrayList(
// 新增贷款投放 负
WkAstReportFields.WK111,
// 还款资金发生额 正
WkAstReportFields.WK004,
// 兑付流出 负
WkAstReportFields.WK005,
// 放款冲正金额 正
WkAstReportFields.WK101,
// 金融服务费 负
WkAstReportFields.WK108,
// 其他流入 正
WkAstReportFields.WK007,
// 其他流出 负
WkAstReportFields.WK006
);
// 查询计划对应统计项数据
Map<String, PlanReportItem> itemMap =
analyseSpvReportManager.querySpvStatPlanDayItem(context.getEndDate(),
context.getPlanBase().getPlanNo(), statFields, true);
List<AnalyseChartItemVO> itemVOS = new ArrayList<>();
// // 总流出
// AnalyseChartItemVO outTotal = new AnalyseChartItemVO();
// outTotal.setEntry(WkAstReportFields.WK008.getCode());
// outTotal.setItem(WkAstReportFields.WK008.getName());
// outTotal.setValue(AnalyseReportUtil.getItemBig(itemMap, CollectionUtil.newArrayList(
// // 流出
// // 兑付流出
// WkAstReportFields.WK005,
// // 金融服务费
// WkAstReportFields.WK108,
// // 新增贷款投放
// WkAstReportFields.WK111
// )));
// itemVOS.add(outTotal);
// 正负切换
int sign = 1;
// 各个分项
for (ReportField field : statFields) {
sign = sign * -1;
AnalyseChartItemVO itemVO = new AnalyseChartItemVO();
itemVO.setEntry(String.valueOf(sign));
itemVO.setItem(field.getName());
// 处理统计值
itemVO.setValue(AnalyseReportUtil.getItemBig(itemMap, field).multiply(new BigDecimal(sign)));
itemVOS.add(itemVO);
}
context.addItems(itemVOS);
return null;
}
@Override
protected AnalyseServiceEnum getServiceEnum(){
return AnalyseServiceEnum.DAY_FLOW;
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.api.analyse.node;
import com.abssqr.plat.common.facade.enums.AnalyseServiceEnum;
import com.abssqr.plat.common.facade.enums.AnalyseTypeEnum;
import com.abssqr.plat.common.facade.model.plan.PlanBase;
import com.abssqr.plat.common.facade.result.analyse.AnalyseChartItemVO;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* 统计图选择器参数结果上下文
* @author hanfei
* @version $Id: AnalyseChartContext.java, v 0.1 2019-09-26 12:04 AM hanfei Exp $
*/
public class AnalyseChartContext {
/**
* 计划编号
*/
private PlanBase planBase;
/**
* 统计起始日
*/
private Date startDate;
/**
* 统计截止日
*/
private Date endDate;
/**
* 业务类型
*/
private List<AnalyseServiceEnum> services;
/**
* 统计类型
*/
private AnalyseTypeEnum analyseType;
/**
* 统计图数据条目
*/
private List<AnalyseChartItemVO> items = new ArrayList<>();
public void addItems(List<AnalyseChartItemVO> items) {
this.items.addAll(items);
}
public PlanBase getPlanBase() {
return planBase;
}
public void setPlanBase(PlanBase planBase) {
this.planBase = planBase;
}
public List<AnalyseServiceEnum> getServices() {
return services;
}
public void setServices(List<AnalyseServiceEnum> services) {
this.services = services;
}
public AnalyseTypeEnum getAnalyseType() {
return analyseType;
}
public void setAnalyseType(AnalyseTypeEnum analyseType) {
this.analyseType = analyseType;
}
public List<AnalyseChartItemVO> getItems() {
return items;
}
public Date getStartDate() {
return startDate;
}
public void setStartDate(Date startDate) {
this.startDate = startDate;
}
public Date getEndDate() {
return endDate;
}
public void setEndDate(Date endDate) {
this.endDate = endDate;
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.api.analyse.node;
import cn.hutool.core.date.DateUtil;
import com.abssqr.plat.common.facade.enums.AnalyseServiceEnum;
import com.abssqr.plat.common.facade.model.report.PlanReportItem;
import com.abssqr.plat.common.facade.model.report.ReportField;
import com.abssqr.plat.common.facade.result.analyse.AnalyseChartItemVO;
import com.abssqr.plat.core.service.report.AnalyseSpvReportManager;
import com.general.system.tool.util.ToolUtil;
import com.general.system.util.adapter.selector.AbstractMultipleActionSelectorNode;
import org.springframework.beans.factory.annotation.Autowired;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 统计图节点基类
* @author hanfei
* @version $Id: AnalyseChartNodeBase.java, v 0.1 2019-09-26 12:03 AM hanfei Exp $
*/
public abstract class AnalyseChartNodeBase
extends AbstractMultipleActionSelectorNode<AnalyseChartContext, AnalyseServiceEnum> {
@Autowired
protected AnalyseSpvReportManager analyseSpvReportManager;
@Override
public boolean judge(AnalyseChartContext context) {
return context.getServices().contains(getServiceEnum());
}
/**
* 按日期趋势统计基础方法
* @param context
* @param statFields
*/
public void handleDayTrendChart(AnalyseChartContext context, List<ReportField> statFields,
boolean havePlan, AnalyseValueHandle valueHandle){
// 获取放款池计划 按日期与统计项的分组汇总数据
Map<Date, List<PlanReportItem>> planItemMap = analyseSpvReportManager.querySpvStatDaySectionItem(
context.getStartDate(), context.getEndDate(), context.getPlanBase().getPlanNo(), statFields, havePlan);
if (ToolUtil.isEmpty(planItemMap)) {
return;
}
List<AnalyseChartItemVO> itemVOS = new ArrayList<>();
for (Map.Entry<Date, List<PlanReportItem>> entry : planItemMap.entrySet()) {
Map<String, PlanReportItem> itemMap = entry.getValue().stream().collect(
Collectors.toMap(PlanReportItem::getRptItemCode, item -> item));
AnalyseChartItemVO itemVO = new AnalyseChartItemVO();
// X 轴按日期
itemVO.setEntry(DateUtil.formatDate(entry.getKey()));
itemVO.setItem(getServiceEnum().getDesc());
// 处理统计值
itemVO.setValue(valueHandle.handle(entry.getKey(), itemMap));
itemVOS.add(itemVO);
}
// 按X轴 日期 进行排序
itemVOS.sort(Comparator.comparing(item -> DateUtil.parse(item.getEntry())));
context.addItems(itemVOS);
}
/**
* 执行统计业务项目
* @return
*/
protected abstract AnalyseServiceEnum getServiceEnum();
protected interface AnalyseValueHandle{
/**
* 对应每日统计值处理
* @param itemMap
* @return
*/
BigDecimal handle(Date acctDate, Map<String, PlanReportItem> itemMap);
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.api.ast;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import com.abssqr.plat.biz.support.QryTemplate;
import com.abssqr.plat.biz.support.ServiceSupport;
import com.abssqr.plat.common.dal.mysql.auto.dataobject.AstScreenRuleDO;
import com.abssqr.plat.common.dal.mysql.auto.paging.ScreenRulePage;
import com.abssqr.plat.common.facade.model.rule.AstScreenRule;
import com.abssqr.plat.common.facade.param.ast.AstScreenRuleEditParam;
import com.abssqr.plat.common.facade.param.ast.AstScreenRulePageQryParam;
import com.abssqr.plat.common.facade.param.ast.AstScreenRuleQryParam;
import com.abssqr.plat.common.facade.result.BasePage;
import com.abssqr.plat.common.facade.result.ast.AstScreenRuleVO;
import com.abssqr.plat.common.facade.service.ast.AstScreenRuleService;
import com.abssqr.plat.common.facade.utils.CalcUtil;
import com.abssqr.plat.common.facade.validation.Valid;
import com.abssqr.plat.common.model.repo.plan.PlanRepo;
import com.abssqr.plat.common.model.utils.ApproveChangeUtil;
import com.abssqr.plat.core.service.rule.AstScreenRuleManager;
import com.general.system.bpm.enums.ApproveStatusEnum;
import com.general.system.facade.current.IdentityUtil;
import com.google.common.collect.Lists;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @author bangis.wangdf
* @version com.abssqr.plat.biz.api.ast: AstScreenRuleServiceImpl.java, v 0.1 2019-06-01 21:02 bangis.wangdf Exp $
*/
@Service
public class AstScreenRuleServiceImpl extends ServiceSupport implements AstScreenRuleService {
@Autowired
PlanRepo planRepo;
@Autowired
AstScreenRuleManager astScreenRuleManager;
@Override
public BasePage<AstScreenRuleVO> getAstScreenList(AstScreenRulePageQryParam param) {
return this.doQry(param, () -> {
ScreenRulePage screenRulePage = astScreenRuleManager.getScreenRuleList(param, IdentityUtil.getUserCode());
BasePage<AstScreenRuleVO> result = new BasePage<>();
result.setCurrPageNo(screenRulePage.getCurrPageNo());
result.setTotal(screenRulePage.getTotal());
result.setLimit(screenRulePage.getLimit());
if (CollectionUtils.isNotEmpty(screenRulePage.getDatas())) {
Set<String> lenderOrgCodes = screenRulePage.getDatas().stream().map(AstScreenRuleDO::getLenderOrgCode).collect(
Collectors.toSet());
Map<String, String> planNameMap = planRepo.getPlanNames(Lists.newArrayList(lenderOrgCodes));
List<AstScreenRuleVO> datas = screenRulePage.getDatas().stream().map(astScreenRuleDO -> {
AstScreenRuleVO vo = new AstScreenRuleVO();
vo.setGmtCreate(astScreenRuleDO.getGmtCreate());
vo.setGmtModified(astScreenRuleDO.getGmtModified());
vo.setScreenRuleNo(astScreenRuleDO.getScreenRuleNo());
vo.setScreenRuleName(astScreenRuleDO.getScreenRuleName());
vo.setProdCode(astScreenRuleDO.getProdCode());
vo.setProdName(astScreenRuleDO.getProdName());
vo.setLenderOrgCode(astScreenRuleDO.getLenderOrgCode());
vo.setLenderOrgName(planNameMap.get(astScreenRuleDO.getLenderOrgCode()));
vo.setApproveStatus(ApproveStatusEnum.getEnum(astScreenRuleDO.getApproveStatus()));
//可编辑判断
vo.setOperate(ApproveChangeUtil.allowEdit(vo.getApproveStatus()));
return vo;
}).collect(Collectors.toList());
result.setDatas(datas);
}
return result;
});
}
/**
* 新增Or编辑资产筛选
*
* @param param
* @return
*/
@Override
public AstScreenRule addOrUpdate(@Valid AstScreenRuleEditParam param) {
return this.doOpr(param, () -> {
String astScreeningNo = astScreenRuleManager.addOrUpdate(param, IdentityUtil.getUserCode(), IdentityUtil.getUserOrgCode());
return astScreenRuleManager.getScreenRuleByNo(astScreeningNo);
});
}
/**
* 查询资产筛选规则
* @param param
* @return
*/
@Override
public AstScreenRule getAstScreenRule(AstScreenRuleQryParam param) {
if (param.getWork()){
return this.doQry(param, new QryTemplate<AstScreenRule>() {
@Override
public AstScreenRule query() {
return astScreenRuleManager.getDataChangeScreenRuleBy(param.getScreenRuleNo());
}
@Override
public AstScreenRule afterProcess(AstScreenRule ret) {
calcRate(ret);
return ret;
}
});
}else{
return this.doQry(param, new QryTemplate<AstScreenRule>() {
@Override
public AstScreenRule query() {
return astScreenRuleManager.getScreenRuleByNo(param.getScreenRuleNo());
}
@Override
public AstScreenRule afterProcess(AstScreenRule ret) {
calcRate(ret);
return ret;
}
});
}
}
private void calcRate(AstScreenRule ret) {
if(ret!=null) {
if(ret.getSingleMaxInterRate()!=null) {
ret.setSingleMaxInterRate(CalcUtil.calcPercRate(ret.getSingleMaxInterRate()));
}
if(ret.getSingleMinInterRate()!=null) {
ret.setSingleMinInterRate(CalcUtil.calcPercRate(ret.getSingleMinInterRate()));
}
}
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.api.ast;
import com.abssqr.plat.biz.support.ServiceSupport;
import com.abssqr.plat.common.dal.mysql.auto.dao.LoanBakDAO;
import com.abssqr.plat.common.dal.mysql.auto.dataobject.LoanBakDO;
import com.abssqr.plat.common.dal.mysql.auto.paging.LoanBakListPage;
import com.abssqr.plat.common.dal.mysql.auto.resultmap.PropCntStat;
import com.abssqr.plat.common.facade.enums.LoanStatusEnum;
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.facade.param.loan.LoanPageQryParam;
import com.abssqr.plat.common.facade.param.loan.LoanQryParam;
import com.abssqr.plat.common.facade.result.BasePage;
import com.abssqr.plat.common.facade.result.ast.LoanDelVO;
import com.abssqr.plat.common.facade.result.ast.LoanListVO;
import com.abssqr.plat.common.facade.service.ast.LoanService;
import com.abssqr.plat.common.model.domain.contract.LoanContract;
import com.abssqr.plat.common.model.repo.ast.LoanInstalRepository;
import com.abssqr.plat.common.model.repo.ast.LoanRepository;
import com.abssqr.plat.common.model.repo.contract.LoanContractRepository;
import com.abssqr.plat.common.model.repo.plan.PlanAstRepository;
import com.abssqr.plat.common.model.repo.task.AstSyncTaskCtrRepo;
import com.abssqr.plat.common.model.utils.DescUtil;
import com.abssqr.plat.core.service.accounting.OrgAcctDayComponent;
import com.abssqr.plat.core.service.plan.PlanManager;
import com.abssqr.plat.core.service.util.RptBuilderUtil;
import com.general.system.common.model.Money;
import com.general.system.common.util.VarChecker;
import com.google.common.collect.Lists;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 资产
* @author zhenxuan.luo
* @version com.abssqr.plat.biz.api.ast: LoanServiceImpl.java, v 0.1 2019-05-30 19:45 zhenxuan.luo Exp $
*/
@Component
public class LoanServiceImpl extends ServiceSupport implements LoanService {
@Autowired
private LoanRepository loanRepository;
@Autowired
private LoanInstalRepository loanInstalRepository;
@Autowired
private LoanContractRepository loanContractRepository;
@Autowired
private AstSyncTaskCtrRepo astSyncTaskCtrRepo;
@Autowired
private PlanManager planManager;
@Autowired
private PlanAstRepository planAstRepository;
@Autowired
private LoanBakDAO loanBakDAO;
@Autowired
private OrgAcctDayComponent orgAcctDayComponent;
@Override
public BasePage<LoanListVO> getOrgLoanList(LoanPageQryParam param) {
return this.doQry(param, () -> {
// 获取计划
PlanBase planBase = planManager.getPlanFullByNo(param.getOwnOrg());
// 查询最近模型转换完成日期
Date maxDate = astSyncTaskCtrRepo.getTaskLogMaxOrgDate(
SyncTaskTypeEnum.AST_MOD, orgAcctDayComponent.getOrgCode(planBase).getCode());
LoanBakListPage listPage = loanRepository.getPageByOwnOrg(param, maxDate);
BasePage<LoanListVO> res = new BasePage<>();
res.setCurrPageNo(listPage.getCurrPageNo());
res.setTotal(listPage.getTotal());
res.setLimit(listPage.getLimit());
res.setDatas(buildListVos(listPage.getDatas()));
return res;
});
}
@Override
public LoanDelVO getPlanAstDetail(LoanQryParam param) {
PlanBase planBase = planManager.getPlanFullByNo(param.getPlanNo());
VarChecker.checkNotNull(planBase, "不存在该计划[{0}]", param.getPlanNo());
// 查询最近模型转换完成日期
Date maxDate = astSyncTaskCtrRepo.getTaskLogMaxOrgDate(
SyncTaskTypeEnum.AST_MOD, orgAcctDayComponent.getOrgCode(planBase).getCode());
LoanDelVO loanDelVO = new LoanDelVO();
//计划编号
loanDelVO.setPlanNo(planBase.getPlanNo());
//计划名称
loanDelVO.setPlanName(planBase.getPlanName());
//本金规模
loanDelVO.setTotalAmt(RptBuilderUtil.getInvestedAmt(planBase));
PlanAst planAst = planAstRepository.getByPlanNo(planBase.getPlanNo());
// 根据会计日获取loanbak 统计数据
PropCntStat planLoanStat = loanBakDAO.statPlanBal(maxDate, planBase.getPlanNo());
loanDelVO.setAstAmt((planAst == null) ? new Money() : planAst.getAccGrant());
loanDelVO.setAstCurrentBal((planAst == null) ? new Money() : planAst.getCash());
loanDelVO.setAstCurrentAmt((planLoanStat == null) ? new Money() : planLoanStat.getAmt());
loanDelVO.setAstCurrentCnt((planLoanStat == null) ? BigDecimal.ZERO : new BigDecimal(planLoanStat.getCnt()));
return loanDelVO;
}
/**
* 构建资产列表模型
* @param loans
* @return
*/
private List<LoanListVO> buildListVos(List<LoanBakDO> loans) {
List<LoanListVO> loanListVOS = Lists.newArrayList();
if (CollectionUtils.isEmpty(loans)) {
return loanListVOS;
}
// 1. 查找关联的合同信息
List<String> astNos = loans.stream().map(LoanBakDO::getAstNo).collect(Collectors.toList());
List<LoanContract> contracts = loanContractRepository.getByAstNos(astNos);
Map<String, LoanContract> contractMap = contracts.stream().collect(
Collectors.toMap(LoanContract::getAstNo, item -> item));
// 2. 转化领域模型到VO
for (LoanBakDO loanBakDO : loans) {
loanListVOS.add(buildListVo(loanBakDO, contractMap.get(loanBakDO.getAstNo())));
}
return loanListVOS;
}
private LoanListVO buildListVo(LoanBakDO loan, LoanContract loanContract) {
boolean isContNull = loanContract == null;
Money zeroMoney = new Money(0);
LoanListVO listVO = new LoanListVO();
listVO.setAstNo(loan.getAstNo());
listVO.setContractNo(loanContract.getOutContNo());
listVO.setOutAstNo(loan.getOutAstNo());
listVO.setOutProdNo(loan.getOutProdNo());
listVO.setManagerOrgCode(loan.getManagerOrgCode());
listVO.setLenderOrgCode(loan.getLenderOrgCode());
listVO.setInDate(loan.getInDate());
listVO.setDeptrName(isContNull ? "" : loanContract.getLoanCustInfo().getName());
listVO.setDistAmout(isContNull ? zeroMoney : loanContract.getDisbAmount());
listVO.setRepayMethod(isContNull ? null : loanContract.getLoanProperty().getRepayMethod());
listVO.setRateDesc(DescUtil.buildRateDesc(loanContract));
listVO.setStartDate(loanContract.getContractPeriod().getStartDate());
listVO.setEndDate(loanContract.getContractPeriod().getEndDate());
listVO.setTermCnt(loan.getTermCnt());
listVO.setCurTerm(loan.getCurTerm());
listVO.setPrinBal(loan.getPrinBal().add(loan.getOvdPrinBal()));
listVO.setIntrBal(loan.getIntrBal().add(loan.getOvdIntrBal()));
listVO.setPenalBal(loan.getPrinPenalBal().add(loan.getIntrPenalBal()));
listVO.setOvdDays(loan.getOvdDays());
listVO.setStatus(LoanStatusEnum.getByCode(loan.getStatus()));
listVO.setCost(loan.getCost());
// listVO.setRiskCl(loan.getLoanRisk().getRiskClass());
return listVO;
}
}
\ No newline at end of file
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.api.ast;
import com.abssqr.plat.biz.support.ServiceSupport;
import com.abssqr.plat.common.dal.mysql.auto.dao.LoanDAO;
import com.abssqr.plat.common.dal.mysql.auto.dataobject.LoanDO;
import com.abssqr.plat.common.dal.mysql.auto.paging.LoanListPage;
import com.abssqr.plat.common.dal.mysql.auto.resultmap.AstScale;
import com.abssqr.plat.common.dal.mysql.auto.resultmap.LoanPropCntStat;
import com.abssqr.plat.common.facade.enums.CapitalAstMatchEnum;
import com.abssqr.plat.common.facade.enums.PlanStatusEnum;
import com.abssqr.plat.common.facade.enums.SyncTaskTypeEnum;
import com.abssqr.plat.common.facade.enums.TitleTypeEnum;
import com.abssqr.plat.common.facade.model.plan.PlanAcctTitle;
import com.abssqr.plat.common.facade.model.plan.PlanAst;
import com.abssqr.plat.common.facade.model.plan.PlanBase;
import com.abssqr.plat.common.facade.param.loan.LoanAstQryParam;
import com.abssqr.plat.common.facade.param.loan.LoanAstTermQryParam;
import com.abssqr.plat.common.facade.param.loan.LoanPageQryParam;
import com.abssqr.plat.common.facade.param.loan.LoanQryParam;
import com.abssqr.plat.common.facade.result.BasePage;
import com.abssqr.plat.common.facade.result.PlanConst;
import com.abssqr.plat.common.facade.result.ast.LoanDelVO;
import com.abssqr.plat.common.facade.result.ast.LoanDetail;
import com.abssqr.plat.common.facade.result.ast.LoanInstalDetail;
import com.abssqr.plat.common.facade.result.ast.LoanListVO;
import com.abssqr.plat.common.facade.service.ast.SpvLoanService;
import com.abssqr.plat.common.model.convertor.vo.LoanVOConvert;
import com.abssqr.plat.common.model.domain.ast.Loan;
import com.abssqr.plat.common.model.domain.contract.LoanContract;
import com.abssqr.plat.common.model.repo.ast.LoanBakRepo;
import com.abssqr.plat.common.model.repo.ast.LoanRepository;
import com.abssqr.plat.common.model.repo.contract.LoanContractRepository;
import com.abssqr.plat.common.model.repo.plan.PlanAcctTitleRepo;
import com.abssqr.plat.common.model.repo.plan.PlanAstRepository;
import com.abssqr.plat.common.model.repo.plan.PlanRepo;
import com.abssqr.plat.common.model.repo.task.AstSyncTaskCtrRepo;
import com.abssqr.plat.core.service.accounting.OrgAcctDayComponent;
import com.abssqr.plat.core.service.ast.LoanAstAssembler;
import com.abssqr.plat.core.service.plan.PlanManager;
import com.abssqr.plat.core.service.util.RptBuilderUtil;
import com.general.system.common.model.Money;
import com.general.system.common.util.VarChecker;
import com.general.system.tool.util.ToolUtil;
import com.google.common.collect.Lists;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
* 放款池项目计划及资产服务
*
* @author hanfei
* @version $Id: SpvLoanServiceImpl.java, v 0.1 2019-12-12 5:21 PM hanfei Exp $
*/
@Service
public class SpvLoanServiceImpl extends ServiceSupport implements SpvLoanService {
@Autowired
private LoanAstAssembler loanAstAssembler;
@Autowired
private LoanRepository loanRepository;
@Autowired
private PlanManager planManager;
@Autowired
private PlanAstRepository planAstRepository;
@Autowired
private LoanContractRepository loanContractRepository;
@Autowired
private PlanRepo planRepo;
@Autowired
private LoanDAO loanDAO;
@Autowired
private LoanBakRepo loanBakRepo;
@Autowired
private PlanAcctTitleRepo planAcctTitleRepo;
@Autowired
private AstSyncTaskCtrRepo astSyncTaskCtrRepo;
@Autowired
private OrgAcctDayComponent orgAcctDayComponent;
/**
* 计划详情
*
* @param param
* @return
*/
@Override
public LoanDelVO getSpvDetail(LoanQryParam param) {
return this.doQry(param, () -> {
PlanBase planBase = planManager.getPlanFullByNo(param.getPlanNo());
VarChecker.checkNotNull(planBase, "不存在该计划[{0}]", param.getPlanNo());
LoanDelVO loanDelVO = new LoanDelVO();
//计划编号
loanDelVO.setPlanNo(planBase.getPlanNo());
//计划名称
loanDelVO.setPlanName(planBase.getPlanName());
//本金规模
loanDelVO.setTotalAmt(RptBuilderUtil.getInvestedAmt(planBase));
// 获取水位
PlanAst planAst = planAstRepository.getByPlanNo(planBase.getPlanNo());
loanDelVO.setAstAmt((planAst == null) ? new Money() : planAst.getAccGrant());
loanDelVO.setAstCurrentBal((planAst == null) ? new Money() : planAst.getCash());
// 获取loan 统计数据
LoanPropCntStat planLoanStat = loanDAO.statSpvBal(planBase.getPlanNo());
loanDelVO.setAstCurrentAmt((planLoanStat == null) ? new Money() : planLoanStat.getAmt());
loanDelVO
.setAstCurrentCnt((planLoanStat == null) ? BigDecimal.ZERO : new BigDecimal(planLoanStat.getCnt()));
// 资金剩余规模
Money capitalBal = new Money();
loanDelVO.setCapitalBal(capitalBal);
// 获取本金科目
List<PlanAcctTitle> planAcctTitleList = planAcctTitleRepo.getByEntityNo(param.getPlanNo());
planAcctTitleList.forEach(item -> {
if (item.getTitleType() == TitleTypeEnum.INVESTED || item.getTitleType() == TitleTypeEnum.PRIOR_INVESTED || item.getTitleType() == TitleTypeEnum.SECND_INVESTED) {
if (StringUtils.isEmpty(param.getCapitalNo()) || param.getCapitalNo().equals(item.getRefNo())) {
capitalBal.addTo(item.getBal());
}
}
});
// 根据机构编码获取
Date maxDate = astSyncTaskCtrRepo.getTaskLogMaxOrgDate(
SyncTaskTypeEnum.AST_MOD, orgAcctDayComponent.getOrgCode(planBase).getCode());
// 匹配规模
List<AstScale> astScale = loanBakRepo.getAstScale(maxDate, param.getPlanNo());
Money astMatchAmt = new Money();
loanDelVO.setAstMatchAmt(astMatchAmt);
astScale.forEach(item -> {
if ((!CapitalAstMatchEnum.DEFAULT.getCode().equals(item.getCapitalNo())) && (StringUtils.isEmpty(param.getCapitalNo()) || param.getCapitalNo().equals(item.getCapitalNo()))) {
astMatchAmt.addTo(item.getPrinBal());
}
});
return loanDelVO;
});
}
/**
* 资产列表
*
* @param param
* @return
*/
@Override
public BasePage<LoanListVO> queryLoanPage(LoanPageQryParam param) {
return this.doQry(param, () -> {
LoanListPage listPage = loanRepository.queryLoanPage(param);
BasePage<LoanListVO> res = new BasePage<>();
res.setCurrPageNo(listPage.getCurrPageNo());
res.setTotal(listPage.getTotal());
res.setLimit(listPage.getLimit());
if (ToolUtil.isNotEmpty(listPage.getDatas())) {
// 查找关联的合同信息
List<String> astNos = listPage.getDatas().stream().map(LoanDO::getAstNo).collect(Collectors.toList());
List<LoanContract> contracts = loanContractRepository.getByAstNos(astNos);
res.setDatas(LoanVOConvert.buildDetailList(listPage.getDatas(), contracts));
}
return res;
});
}
/**
* 获取资产详情
*
* @param param
* @return
*/
@Override
public LoanDetail getLoanDetail(LoanAstQryParam param) {
return this.doQry(param, () -> {
this.initPlan();
LoanDetail detail = LoanVOConvert.buildDetail(getLoan(param.getAstNo()));
return detail;
});
}
/**
* 分期资产收益详情
*
* @param param
* @return
*/
@Override
public LoanInstalDetail getLoanInstalDetail(LoanAstTermQryParam param) {
return this.doQry(param, () -> {
this.initPlan();
Loan loan = getLoan(param.getAstNo());
LoanInstalDetail detail = LoanVOConvert.buildDetail(loan, param.getTermNo());
return detail;
});
}
/**
* 取资产
*
* @param astNo
* @return
*/
private Loan getLoan(String astNo) {
Loan loan = loanRepository.getByAstNo(astNo);
VarChecker.checkNotNull(loan, "错误的资产编号[{0}]", astNo);
loanAstAssembler.assembleLoan(loan, null);
return loan;
}
/**
* 初始化计划信息,方便后面取信息
*/
private void initPlan() {
// 查询计划
List<PlanBase> planBaseList = planRepo.getPlansByStatusList(null,
Lists.newArrayList(PlanStatusEnum.ONGOING, PlanStatusEnum.PREPARING));
for (PlanBase planBase : planBaseList) {
if (!PlanConst.getAllPlan().containsKey(planBase.getPlanNo())) {
PlanConst.getAllPlan().put(planBase.getPlanNo(), planBase);
}
}
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.api.org;
import java.util.List;
import com.abssqr.plat.biz.support.ServiceSupport;
import com.abssqr.plat.common.dal.mysql.auto.dataobject.OrganizationDO;
import com.abssqr.plat.common.dal.mysql.auto.paging.OrgListPage;
import com.abssqr.plat.common.facade.model.org.Organization;
import com.abssqr.plat.common.facade.param.org.OrgEditParam;
import com.abssqr.plat.common.facade.param.org.OrgPageQryParam;
import com.abssqr.plat.common.facade.param.org.OrgQryParam;
import com.abssqr.plat.common.facade.result.BasePage;
import com.abssqr.plat.common.facade.result.org.OrgListVO;
import com.abssqr.plat.common.facade.service.OrgService;
import com.abssqr.plat.common.facade.validation.Valid;
import com.abssqr.plat.core.service.org.OrgManager;
import com.general.system.common.model.BaseResult;
import com.google.common.collect.Lists;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @author zhenxuan.luo
* @version com.abssqr.plat.biz.api.org: OrgService.java, v 0.1 2019-05-28 10:56 zhenxuan.luo Exp $
*/
@Component
public class OrgServiceImpl extends ServiceSupport implements OrgService {
@Autowired
private OrgManager orgManager;
private Logger logger = LoggerFactory.getLogger(OrgServiceImpl.class);
@Override
public BasePage<OrgListVO> getOrgList(@Valid OrgPageQryParam param) {
return this.doQry(param, () -> {
OrgListPage listPage = orgManager.getOrgList(param);
List<OrgListVO> abbrs = Lists.newArrayList();
for (OrganizationDO organization : listPage.getDatas()) {
//机构编码,机构简称,机构全称,联系人,联系人电话
OrgListVO orgListVO = new OrgListVO();
orgListVO.setOrgCode(organization.getOrgCode());
orgListVO.setOrgAbbr(organization.getOrgAbbreviation());
orgListVO.setOrgName(organization.getOrgName());
orgListVO.setLinkmanName(organization.getLinkmanName());
orgListVO.setLinkmanPhone(organization.getLinkmanPhone());
abbrs.add(orgListVO);
}
BasePage<OrgListVO> res = new BasePage<>();
res.setCurrPageNo(listPage.getCurrPageNo());
res.setTotal(listPage.getTotal());
res.setLimit(listPage.getLimit());
res.setDatas(abbrs);
return res;
});
}
@Override
public BaseResult<String> addOrUpdate(@Valid OrgEditParam param) {
return BaseResult.success(this.doOpr(param, () -> orgManager.addOrUpdate(param)));
}
@Override
public Organization getOrg(@Valid OrgQryParam param) {
return this.doQry(param, () -> orgManager.getOrg(param.getOrgCode()));
}
}
\ No newline at end of file
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.api.plan;
import com.abssqr.plat.biz.shared.handler.PlanAllocHandler;
import com.abssqr.plat.biz.support.ServiceSupport;
import com.abssqr.plat.common.facade.enums.AccountAttributeEnum;
import com.abssqr.plat.common.facade.enums.AccountTypeEnum;
import com.abssqr.plat.common.facade.enums.PlanAllocStatusEnum;
import com.abssqr.plat.common.facade.enums.PlanTypeEnum;
import com.abssqr.plat.common.facade.model.account.Account;
import com.abssqr.plat.common.facade.model.plan.PlanAlloc;
import com.abssqr.plat.common.facade.model.plan.PlanBase;
import com.abssqr.plat.common.facade.param.plan.alloc.PlanAllocHandleParam;
import com.abssqr.plat.common.facade.param.plan.alloc.PlanAllocPayParam;
import com.abssqr.plat.common.facade.result.plan.PlanAllocPayInfoVO;
import com.abssqr.plat.common.facade.service.plan.PlanAllocPayService;
import com.abssqr.plat.common.facade.validation.Valid;
import com.abssqr.plat.common.model.repo.plan.PlanAllocRepo;
import com.abssqr.plat.common.model.repo.plan.PlanRepo;
import com.abssqr.plat.core.service.acct.AcctManager;
import com.general.system.common.util.VarChecker;
import com.google.common.collect.Lists;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 分配支付或入账
*
* @author hanfei
* @version $Id: PlanAllocPayServiceImpl.java, v 0.1 2019-07-09 4:48 PM hanfei Exp $
*/
@Service
public class PlanAllocPayServiceImpl extends ServiceSupport implements PlanAllocPayService {
@Autowired
private PlanAllocRepo planAllocRepo;
@Autowired
private PlanAllocHandler planAllocHandler;
@Autowired
private PlanRepo planRepo;
@Autowired
private AcctManager acctManager;
/**
* 分配支付或人工分配入账
*
* @param param
*/
@Override
public void allocPay(@Valid PlanAllocPayParam param) {
super.doOpr(param, () -> {
// 获取对应分配计划进行支付
PlanAlloc alloc = planAllocRepo.getPlanAllocDetail(param.getAllocNo());
if (alloc.getStatus() == PlanAllocStatusEnum.ASSIGNED) {
return null;
}
PlanAllocHandleParam handleParam = new PlanAllocHandleParam();
handleParam.setAlloc(alloc);
handleParam.setOutTransNo(param.getOutTransNo());
handleParam.setOffLine(param.getOffLine());
// 判断线上线下操作
if (param.getOffLine()) {
// 线下支付 创建支付单,同时进行入账等后续操作
planAllocHandler.execute(handleParam);
} else {
// 在线支付,只创建支付单
planAllocHandler.handle(handleParam);
}
return null;
});
}
/**
* 查询分配详情
*
* @param param
* @return
*/
@Override
public PlanAllocPayInfoVO allocInfo(@Valid PlanAllocPayParam param) {
return super.doQry(param, () -> {
// 获取对应分配计划进行支付
PlanAlloc alloc = planAllocRepo.getPlanAllocDetail(param.getAllocNo());
// 获取对应计划
PlanBase plan = planRepo.getPlanByNo(alloc.getPlanNo());
//回款账户状态
AccountAttributeEnum sourceAcct = PlanTypeEnum.SPV == alloc.getPlanType() ?
AccountAttributeEnum.RECV : AccountAttributeEnum.NORMAL;
// 获取账户信息
List<Account> accounts = acctManager.getAllAcctByPlanNo(alloc.getPlanNo(),
Lists.newArrayList(AccountTypeEnum.BANK, AccountTypeEnum.PLAT_VIRTUAL));
VarChecker.checkNotEmpty(accounts, "计划[{0}]找不到对应的账户信息", alloc.getPlanNo());
// 组装模型
PlanAllocPayInfoVO infoVO = new PlanAllocPayInfoVO();
infoVO.setPlanNo(alloc.getPlanNo());
infoVO.setPlanName(plan.getPlanName());
infoVO.setPayAmt(alloc.getTotalConfirmAllocAmt());
for (Account account : accounts) {
// 源账户 为 银行一般业务户
if (account.getActAttr() == sourceAcct
&& account.getActType() == AccountTypeEnum.BANK) {
infoVO.setSourceAcct(infoVO.installAccount(account));
}
// 目标账户为 银行 托管户
if (account.getActAttr() == AccountAttributeEnum.HOSTED
&& account.getActType() == AccountTypeEnum.BANK) {
infoVO.setTargetAcct(infoVO.installAccount(account));
}
}
return infoVO;
});
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.api.plan;
import com.abssqr.plat.biz.support.ServiceSupport;
import com.abssqr.plat.common.facade.service.plan.PlanAllocRiskService;
import com.abssqr.plat.common.model.repo.plan.PlanAllocFrozenRepo;
import com.abssqr.plat.common.model.repo.plan.PlanAstRepository;
import com.abssqr.plat.core.service.plan.PlanAllocManager;
import com.abssqr.plat.core.service.plan.PlanManager;
import com.general.system.bpm.service.ProcessQueryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
*
* @author hanfei
* @version $Id: PlanAllocRiskServiceImpl.java, v 0.1 2019-07-07 12:22 AM hanfei Exp $
*/
@Service
public class PlanAllocRiskServiceImpl extends ServiceSupport implements PlanAllocRiskService {
@Autowired
private ProcessQueryService processQueryService;
@Autowired
private PlanManager planManager;
@Autowired
private PlanAstRepository planAstRepository;
@Autowired
private PlanAllocManager planAllocManager;
@Autowired
private PlanAllocFrozenRepo planAllocFrozenRepo;
// /**
// * 分配计划 兑付风险详情
// * @param param
// * @return
// */
// @Override
// public AllocRiskDetail getAllocRisk(@Valid WorkOrderQryParam param) {
// return super.doQry(param, () -> {
// // 流程数据
// ProcessHistoricEntity entity = processQueryService.getHistoricByBusinessKey(param.getWorkOrdCode());
// // 查计划
// Plan plan = planManager.getPlanByNo(entity.getBusinessKey());
// // 查余额
// PlanAst planAst = planAstRepository.getByPlanNo(entity.getBusinessKey());
//
// // 查分配计划
// List<PlanAlloc> allocs = planAllocManager.queryAllocByEntityNo(entity.getBusinessKey());
// // 查冻结明细
// List<PlanAllocFrozen> allocFrozens = planAllocFrozenRepo.getByPlanNo(entity.getBusinessKey());
//
// AllocRiskDetail detail = new AllocRiskDetail();
//
// return detail;
// });
// }
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.api.plan;
import com.abssqr.plat.biz.support.ServiceSupport;
import com.abssqr.plat.common.facade.enums.DataChangeBizTypeEnum;
import com.abssqr.plat.common.facade.enums.PriceTypeEnum;
import com.abssqr.plat.common.facade.model.BizDataChange;
import com.abssqr.plat.common.facade.model.plan.PlanAstPriceRule;
import com.abssqr.plat.common.facade.model.plan.PlanBase;
import com.abssqr.plat.common.facade.param.plan.priceRule.PlanAstPriceRuleParam;
import com.abssqr.plat.common.facade.param.plan.priceRule.PriceQryParam;
import com.abssqr.plat.common.facade.result.plan.PlanAstPriceRuleVo;
import com.abssqr.plat.common.facade.service.plan.PlanAstPriceRuleService;
import com.abssqr.plat.common.facade.utils.CalcUtil;
import com.abssqr.plat.common.facade.validation.Valid;
import com.abssqr.plat.common.model.repo.dataChange.ChangeRepo;
import com.abssqr.plat.common.model.repo.plan.PlanAstPriceRuleRepo;
import com.abssqr.plat.core.service.change.ChangeManager;
import com.abssqr.plat.core.service.plan.PlanAstPriceRuleManager;
import com.abssqr.plat.core.service.plan.PlanManager;
import com.general.system.bpm.enums.ApproveStatusEnum;
import com.general.system.common.util.VarChecker;
import com.general.system.facade.current.IdentityUtil;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Optional;
/**
* @author xiachenxiang
* @version com.abssqr.plat.biz.api.plan: PlanAstPriceRuleServiceImpl.java, v 0.1 2019-11-07 5:33 PM xiachenxiang Exp $
*/
@Service
public class PlanAstPriceRuleServiceImpl extends ServiceSupport implements PlanAstPriceRuleService {
@Autowired
private PlanAstPriceRuleRepo planAstPriceRuleRepo;
@Autowired
private PlanAstPriceRuleManager planAstPriceRuleManager;
@Autowired
private PlanManager planManager;
@Autowired
private ChangeManager changeManager;
@Autowired
private ChangeRepo changeRepo;
@Override
public PlanAstPriceRuleVo queryDtl(@Valid PriceQryParam param) {
return this.doQry(param, () -> {
PlanAstPriceRuleVo result = new PlanAstPriceRuleVo();
if (param.getWork()) {
BizDataChange<PlanBase> dataChange = changeManager.getDataChange(param.getPlanNo());
VarChecker.checkNotNull(dataChange, "未找到对应待审批的定价规则数据");
PlanBase planBase = dataChange.getDatas();
result.setPlanNo(planBase.getPlanNo());
result.setPlanName(planBase.getPlanName());
result.setPriceType(planBase.getPriceType().getCode());
result.setPlanAstPriceRuleList(planBase.getPlanAstPriceRuleList());
} else {
PlanBase planBase = planManager.getPlanFullByNo(param.getPlanNo());
VarChecker.checkNotNull(planBase, "未找到对应的计划");
result.setPlanNo(planBase.getPlanNo());
result.setPriceType(Optional.ofNullable(planBase.getPriceType()).map(PriceTypeEnum::getCode).orElse(null));
result.setPlanAstPriceRuleList(planAstPriceRuleRepo.queryByPriceRulePlanNo(param.getPlanNo()));
}
// 判断是否有审批中的定价
Long cnt = changeRepo.cntByBizNoAndStatusAndBizType(DataChangeBizTypeEnum.PanAstPriceRule.getCode(),result.getPlanNo(), ApproveStatusEnum.PENDING.getCode());
result.setPending(cnt > 0L);
if(CollectionUtils.isNotEmpty(result.getPlanAstPriceRuleList())){
for (PlanAstPriceRule planAstPriceRule : result.getPlanAstPriceRuleList()) {
if(planAstPriceRule.getIntrDiscountRate()!=null) {
planAstPriceRule.setIntrDiscountRate(
CalcUtil.calcPercRate(planAstPriceRule.getIntrDiscountRate()));
}
}
}
return result;
});
}
@Override
public Void edit(PlanAstPriceRuleParam param) {
if(param!=null&&CollectionUtils.isNotEmpty(param.getPlanAstPriceRuleList())){
for (PlanAstPriceRule planAstPriceRule : param.getPlanAstPriceRuleList()) {
if(planAstPriceRule.getIntrDiscountRate()!=null) {
planAstPriceRule.setIntrDiscountRate(CalcUtil.calcRealRate(planAstPriceRule.getIntrDiscountRate()));
}
}
}
return this.doOpr(param, () -> planAstPriceRuleManager.updateRule(param, IdentityUtil.getUserCode(), IdentityUtil.getUserOrgCode()));
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.api.plan;
import com.abssqr.plat.biz.support.ServiceSupport;
import com.abssqr.plat.common.dal.mysql.auto.dataobject.PlanCapitalLogDO;
import com.abssqr.plat.common.dal.mysql.auto.paging.PlanCapitalLogListPage;
import com.abssqr.plat.common.facade.model.plan.PlanCapitalLog;
import com.abssqr.plat.common.facade.param.base.CommonPlanLogQryParam;
import com.abssqr.plat.common.facade.param.plan.log.PlanCapitalLogPageQryParam;
import com.abssqr.plat.common.facade.result.BasePage;
import com.abssqr.plat.common.facade.service.plan.PlanCapitalLogService;
import com.abssqr.plat.common.facade.validation.Valid;
import com.abssqr.plat.common.model.convertor.PlanCapitalLogConvertor;
import com.abssqr.plat.common.model.repo.plan.PlanCapitalLogRepo;
import com.google.common.collect.Lists;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
/**
*
* @author zhenxuan.luo
* @version com.abssqr.plat.biz.api.plan: PlanCapitalLogServiceImpl.java, v 0.1 2019-05-28 17:40 zhenxuan.luo Exp $
*/
@Component
public class PlanCapitalLogServiceImpl extends ServiceSupport implements PlanCapitalLogService {
@Autowired
private PlanCapitalLogRepo planCapitalLogRepo;
@Override
public BasePage<PlanCapitalLog> queryLogList(@Valid PlanCapitalLogPageQryParam param) {
return this.doQry(param, () -> {
PlanCapitalLogListPage listPage = planCapitalLogRepo.getByPlanNo(param);
List<PlanCapitalLog> capitalLogList = Lists.newArrayList();
for (PlanCapitalLogDO planCapitalLogDO : listPage.getDatas()) {
capitalLogList.add(PlanCapitalLogConvertor.convert2Domain(planCapitalLogDO));
}
BasePage<PlanCapitalLog> res = new BasePage<>();
res.setCurrPageNo(listPage.getCurrPageNo());
res.setTotal(listPage.getTotal());
res.setLimit(listPage.getLimit());
res.setDatas(capitalLogList);
return res;
});
}
@Override
public PlanCapitalLog queryLogDtl(@Valid CommonPlanLogQryParam param) {
return this.doQry(param, () -> planCapitalLogRepo.getBySeqNo(param.getSeqNo(), param.getPlanNo()));
}
}
\ No newline at end of file
/**
* abssqr.com Inc.
* Copyright (c) 2017-2020 All Rights Reserved.
*/
package com.abssqr.plat.biz.api.plan;
import com.abssqr.plat.biz.support.ServiceSupport;
import com.abssqr.plat.common.facade.param.plan.structure.InvestStructureQryParam;
import com.abssqr.plat.common.facade.result.plan.PlanInvestStructureVO;
import com.abssqr.plat.common.facade.service.plan.PlanInvestStructureService;
import com.abssqr.plat.common.facade.validation.Valid;
import com.abssqr.plat.common.model.convertor.PlanInvestStructureConvert;
import com.abssqr.plat.common.model.repo.plan.PlanInvestStructureRepo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
/**
*
* @author xiachenxiang
* @version com.abssqr.plat.biz.api.plan: PlanInvestStructureServiceImpl.java, v 0.1 2020-02-06 1:40 PM xiachenxiang Exp $
*/
@Component
public class PlanInvestStructureServiceImpl extends ServiceSupport implements PlanInvestStructureService {
@Autowired
private PlanInvestStructureRepo planInvestStructureRepo;
@Override
public List<PlanInvestStructureVO> getStructureList(@Valid InvestStructureQryParam param) {
return super.doQry(param,()-> PlanInvestStructureConvert.convert2VoList(planInvestStructureRepo.selectByPlanNo(param.getPlanNo())));
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.api.plan;
import com.abssqr.plat.biz.support.ServiceSupport;
import com.abssqr.plat.common.dal.mysql.auto.paging.MonitorRecordPage;
import com.abssqr.plat.common.facade.enums.PlanIndicatorEnum;
import com.abssqr.plat.common.facade.model.plan.PlanMonitor;
import com.abssqr.plat.common.facade.model.plan.PlanMonitorRecord;
import com.abssqr.plat.common.facade.param.base.CommonPlanQryParam;
import com.abssqr.plat.common.facade.param.plan.monitor.PlanEventMonitorQryParam;
import com.abssqr.plat.common.facade.param.plan.monitor.PlanMonitorDelParam;
import com.abssqr.plat.common.facade.param.plan.monitor.PlanMonitorOprParam;
import com.abssqr.plat.common.facade.param.plan.monitor.PlanMonitorQryParam;
import com.abssqr.plat.common.facade.result.BasePage;
import com.abssqr.plat.common.facade.service.plan.PlanMonitorService;
import com.abssqr.plat.common.facade.validation.Valid;
import com.abssqr.plat.common.model.exception.AbssqrBizException;
import com.abssqr.plat.common.model.repo.plan.PlanMonitorRecordRepo;
import com.abssqr.plat.common.model.repo.plan.PlanMonitorRepo;
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.List;
import java.util.stream.Collectors;
/**
* @author zhenxuan.luo
* @version com.abssqr.plat.biz.api.plan: PlanMonitorServiceImpl.java, v 0.1 2019-05-28 15:23 zhenxuan.luo Exp $
*/
@Component
public class PlanMonitorServiceImpl extends ServiceSupport implements PlanMonitorService {
private final static Logger LOGGER = LoggerFactory.getLogger(PlanMonitorServiceImpl.class);
@Autowired
private PlanMonitorRepo planMonitorRepo;
@Autowired
private PlanMonitorRecordRepo planMonitorRecordRepo;
@Override
public PlanMonitor editMonitor(@Valid PlanMonitorOprParam param) {
return this.doOpr(param, () -> {
PlanMonitor existPlanMonitor = planMonitorRepo.getByIndicator(param.getPlanNo(), param.getIndicator());
if (param.getAdd()) {
if (existPlanMonitor!=null) {
throw new AbssqrBizException(
MessageUtil.formatMsg("存在[{0}]的{1}监控指标,无法新增", param.getPlanNo(), PlanIndicatorEnum.getByCode(param.getIndicator()).getDesc()));
}
planMonitorRepo.insert(constructDomain(param));
} else {
planMonitorRepo.updateByIndicator(constructDomain(param));
}
return planMonitorRepo.getByIndicator(param.getPlanNo(), param.getIndicator());
});
}
@Override
public Void deletePlanMonitor(@Valid PlanMonitorDelParam param) {
return this.doOpr(param, () -> {
int refCnt = planMonitorRepo.deleteByIndicator(param.getPlanNo(), param.getIndicator());
LogUtil.info(LOGGER, "删除计划指标项[{0}],实际删除[{1}]条数据", param, refCnt);
return null;
});
}
/**
* 事件列表
*
* @param param
* @return
*/
@Override
public BasePage<PlanMonitorRecord> queryEventMonitorList(@Valid PlanEventMonitorQryParam param) {
return this.doQry(param, () -> {
MonitorRecordPage monitorRecordPage=planMonitorRecordRepo.getEventByPlan(param);
BasePage<PlanMonitorRecord> result = new BasePage<>();
result.setCurrPageNo(monitorRecordPage.getCurrPageNo());
result.setTotal(monitorRecordPage.getTotal());
result.setLimit(monitorRecordPage.getLimit());
if (CollectionUtils.isNotEmpty(monitorRecordPage.getDatas())) {
List<PlanMonitorRecord> datas = monitorRecordPage.getDatas().stream().map(planMonitorRecordDO -> {
PlanMonitorRecord vo = new PlanMonitorRecord();
vo.setGmtCreate(planMonitorRecordDO.getGmtCreate());
vo.setMonitorName(planMonitorRecordDO.getMonitorName());
vo.setExcessValue(planMonitorRecordDO.getExcessValue());
vo.setId(planMonitorRecordDO.getId());
vo.setIndicator(PlanIndicatorEnum.getByCode(planMonitorRecordDO.getIndicator()));
vo.setPlanNo(planMonitorRecordDO.getPlanNo());
vo.setValue(planMonitorRecordDO.getValue());
return vo;
}).collect(Collectors.toList());
result.setDatas(datas);
}
return result;
}
);
}
@Override
public PlanMonitor queryMonitorDtl(@Valid PlanMonitorQryParam param) {
return this.doQry(param, () -> {
return planMonitorRepo.getByIndicator(param.getPlanNo(), param.getIndicator());
});
}
@Override
public List<PlanMonitor> queryMonitorList(@Valid CommonPlanQryParam param) {
return this.doQry(param, () -> planMonitorRepo.getByPlan(param.getPlanNo()));
}
private PlanMonitor constructDomain(PlanMonitorOprParam param) {
PlanMonitor planMonitor = new PlanMonitor();
planMonitor.setPlanNo(param.getPlanNo());
planMonitor.setIndicator(PlanIndicatorEnum.getByCode(param.getIndicator()));
planMonitor.setName(param.getName());
planMonitor.setValue(param.getValue());
return planMonitor;
}
}
\ No newline at end of file
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.api.prod;
import com.abssqr.plat.biz.support.OprTemplate;
import com.abssqr.plat.biz.support.QryTemplate;
import com.abssqr.plat.biz.support.ServiceSupport;
import com.abssqr.plat.common.dal.mysql.auto.dataobject.ProductDO;
import com.abssqr.plat.common.dal.mysql.auto.paging.ProductListPage;
import com.abssqr.plat.common.facade.model.prod.LoanProduct;
import com.abssqr.plat.common.facade.param.prod.ProdEditParam;
import com.abssqr.plat.common.facade.param.prod.ProdPageQryParam;
import com.abssqr.plat.common.facade.param.prod.ProdQryParam;
import com.abssqr.plat.common.facade.result.BasePage;
import com.abssqr.plat.common.facade.result.prod.ProdListVO;
import com.abssqr.plat.common.facade.service.ProdService;
import com.abssqr.plat.common.facade.validation.Valid;
import com.abssqr.plat.common.model.repo.org.OrgRepository;
import com.abssqr.plat.common.model.utils.ApproveChangeUtil;
import com.abssqr.plat.core.service.prod.ProdManager;
import com.general.system.bpm.enums.ApproveStatusEnum;
import com.general.system.common.model.BaseResult;
import com.general.system.facade.current.IdentityUtil;
import com.google.common.collect.Lists;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
/**
* 项目计划对应产品管理
* @author bangis.wangdf
* @version com.abssqr.plat.biz.api.prod: ProdServiceImpl.java, v 0.1 2019-05-28 14:19 bangis.wangdf Exp $
*/
@Service
public class ProdServiceImpl extends ServiceSupport implements ProdService {
@Autowired
private OrgRepository orgRepository;
@Autowired
private ProdManager prodManager;
/**
* 产品分页查询
*
* @param param
* @return
*/
@Override
public BasePage<ProdListVO> getProdList(@Valid ProdPageQryParam param) {
return this.doQry(param, (QryTemplate<BasePage<ProdListVO>>)() -> {
ProductListPage page = prodManager.getProdList(param, IdentityUtil.getUserCode());
BasePage<ProdListVO> result = new BasePage<ProdListVO>();
result.setCurrPageNo(page.getCurrPageNo());
result.setTotal(page.getTotal());
result.setLimit(page.getLimit());
List<ProdListVO> datas = Lists.newArrayList();
if (CollectionUtils.isNotEmpty(page.getDatas())) {
Set<String> orgCodes = page.getDatas().stream().map(ProductDO::getManagerOrgCode).collect(
Collectors.toSet());
Map<String, String> orgNameMap = orgRepository.getOrgNames(orgCodes);
page.getDatas().forEach(DO -> {
ProdListVO data = new ProdListVO();
//prodCode 外部产品码
data.setProdCode(DO.getProdCode());
//prodName 产品名
data.setProdName(DO.getProdName());
//approveStatus 审批状态
data.setApproveStatus(ApproveStatusEnum.getEnum(DO.getApproveStatus()));
//abssqrProdCode 内部产品码
data.setAbssqrProdCode(DO.getAbssqrProdCode());
//managerOrgCode 贷款的管理机构
data.setManagerOrgCode(DO.getManagerOrgCode());
data.setManagerOrgName(orgNameMap.get(DO.getManagerOrgCode()));
//gmtModified
data.setGmtModified(DO.getGmtModified());
//可编辑判断
data.setOperate(ApproveChangeUtil.allowEdit(data.getApproveStatus()));
datas.add(data);
});
}
result.setDatas(datas);
return result;
});
}
/**
* 新增OrUpdate
*
* @param param
* @return
*/
@Override
public BaseResult<String> addOrUpdate(@Valid ProdEditParam param) {
return BaseResult.success(this.doOpr(param,
(OprTemplate<String>)() -> prodManager.addOrUpdate(param, IdentityUtil.getUserCode(), IdentityUtil.getUserOrgCode())));
}
/**
* 获取产品
*
* @param param
* @return
*/
@Override
public LoanProduct getProd(@Valid ProdQryParam param) {
if (param.getWork()){
return this.doQry(param, () -> prodManager.getDataChangeProductBy(param.getAbssqrProdCode()));
}else{
return this.doQry(param, () -> prodManager.getProductBy(param.getAbssqrProdCode()));
}
}
}
/**
* 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-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.api.utility;
import com.abssqr.plat.biz.support.ServiceSupport;
import com.abssqr.plat.common.facade.model.plan.PlanBase;
import com.abssqr.plat.common.facade.param.utility.PlanVaTaxCalcParam;
import com.abssqr.plat.common.facade.service.utility.UtilService;
import com.abssqr.plat.common.facade.utils.CalcUtil;
import com.abssqr.plat.common.facade.validation.Valid;
import com.abssqr.plat.common.model.repo.plan.PlanRepo;
import com.general.system.common.model.Money;
import com.general.system.common.util.VarChecker;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
/**
* 计算税金工具服务
* @author zhenxuan.luo
* @version com.abssqr.plat.biz.interceptor: UtilServiceImpl.java, v 0.1 2019-06-05 01:42 zhenxuan.luo Exp $
*/
@Component
public class UtilServiceImpl extends ServiceSupport implements UtilService {
@Autowired
private PlanRepo planRepo;
/**
* 计算税金
* @param param
* @return
*/
@Override
public Money calcVatTaxForNet(@Valid PlanVaTaxCalcParam param) {
return this.doQry(param, () -> {
PlanBase planBase = planRepo.getPlanByNo(param.getPlanNo());
VarChecker.checkNotNull(planBase, "计划[{0}]不存在", param.getPlanNo());
BigDecimal taxRate = planBase.getVatRate();
return CalcUtil.calcVatTaxForNet(param.getAmt(), taxRate);
});
}
}
\ No newline at end of file
/**
* abssqr.com Inc.
* Copyright (c) 2017-2018 All Rights Reserved.
*/
package com.abssqr.plat.biz.api.workbench;
import cn.hutool.core.collection.CollectionUtil;
import com.abssqr.plat.common.facade.enums.PlanTypeEnum;
import com.abssqr.plat.common.facade.result.workbench.OrgPlanInfo;
import com.abssqr.plat.common.facade.service.workbench.WorkBenchQueryService;
import com.abssqr.plat.core.service.workbenchquery.WorkBenchQueryManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* 工作台查询接口
*
* @author yangcheng
* @version com.abssqr.admin.biz.service.workbench: WorkBenchQueryServiceImpl.java, v 0.1 2018-06-19 上午10:51 guozhenhua Exp $
*/
@Component
public class WorkBenchQueryServiceImpl implements WorkBenchQueryService {
@Autowired
private WorkBenchQueryManager workBenchQueryManager;
/**
* 获取机构信息总览
* @return
*/
@Override
public List<OrgPlanInfo> getOrgProductInfo() {
// 放款池
OrgPlanInfo spv = workBenchQueryManager.getOrgProductInfo(PlanTypeEnum.SPV);
// 承接池
OrgPlanInfo plan = workBenchQueryManager.getOrgProductInfo(PlanTypeEnum.PLAN);
return CollectionUtil.newArrayList(spv, plan);
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2018 All Rights Reserved.
*/
package com.abssqr.plat.biz.interceptor;
import com.abssqr.plat.common.facade.enums.CommonErrorCodeEnum;
import com.abssqr.plat.common.util.constants.LogConstants;
import com.abssqr.plat.common.util.loggers.CommonLoggers;
import com.abssqr.plat.common.util.loggers.DigestLoggers;
import com.abssqr.plat.common.util.loggers.LogInfo;
import com.abssqr.plat.common.util.thread.BizContextHolder;
import com.general.system.common.model.IErrorCode;
import com.general.system.common.model.exception.BaseException;
import com.general.system.common.util.DateTimeUtil;
import org.aopalliance.intercept.MethodInvocation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author zhenxuan.luo
* @version com.loan.common.model.log: BizLogUtil.java, v 0.1 2018-12-19 AM11:56 zhenxuan.luo Exp $
*/
public class BizLogUtil {
/**
*
*/
private final static Logger LOGGER = LoggerFactory.getLogger(BizLogUtil.class);
private final static Logger BIZ_DIGEST = DigestLoggers.SERVICE_DIGEST;
private final static Logger BIZ_REQUEST = CommonLoggers.BIZ_REQUEST;
private final static String UNDEFINE = CommonErrorCodeEnum.UNDEFINE.getCode();
/**
* 记录业务请求日志
*
* @param invocation
*/
public static void logBizReqeust(LogInfo logInfo, MethodInvocation invocation) {
if (BIZ_REQUEST.isInfoEnabled()) {
StringBuilder sb = new StringBuilder(512);
sb.append(logInfo.getFacadeName()).append(LogConstants.DOT).append(logInfo.getMethodName());
sb.append(LogConstants.FMT_BEGIN);
Object[] params = invocation.getArguments();
if (params != null) {
for (int i = 0; i < params.length; i++) {
sb.append(params[i]);
if (i != params.length - 1) {
sb.append(LogConstants.COMMA);
}
}
}
sb.append(LogConstants.FMT_END);
BIZ_REQUEST.info(sb.toString());
}
}
/**
* 构建操作类型的摘要日志
*
* @param eventCode 本系统事件码
* @param throwable
*/
public static void logBizDigest(LogInfo logInfo, String eventCode, Throwable throwable) {
try {
//1.1 构建开始标志
StringBuilder sb = new StringBuilder(400);
sb.append(LogConstants.FMT_BEGIN);
sb.append(logInfo.getFacadeName()).append(LogConstants.DOT);
sb.append(logInfo.getMethodName()).append(LogConstants.COMMA);
sb.append((throwable == null) ? LogConstants.YES : LogConstants.NO).append(LogConstants.COMMA);
sb.append(logInfo.getElapseTime()).append(LogConstants.MS);
sb.append(LogConstants.FMT_MIDDLE);
sb.append(eventCode).append(LogConstants.COMMA);
sb.append(ifNull(BizContextHolder.getBizNo())).append(LogConstants.COMMA);
sb.append(ifNull(DateTimeUtil.formatYMDHMsS(BizContextHolder.getTransTime())));
sb.append(LogConstants.FMT_MIDDLE);
IErrorCode errorCode = getErrorCode(throwable);
sb.append((errorCode == null) ? LogConstants.NONE : errorCode.getCode()).append(LogConstants.COMMA);
sb.append((errorCode == null) ? LogConstants.NONE : errorCode.getDesc());
sb.append(LogConstants.FMT_END);
//2 写入摘要日志文件
if (BIZ_DIGEST.isInfoEnabled()) {
BIZ_DIGEST.info(sb.toString());
}
} catch (Throwable e) {
LOGGER.error("打印摘要日志异常", e);
}
}
/**
* 入参为null时,返回"-",否则返回自身toString
*
* @param value 入参
* @return
*/
private static String ifNull(String value) {
return value == null ? LogConstants.NONE : value;
}
private static IErrorCode getErrorCode(Throwable ex) {
if (null == ex) {
return null;
}
IErrorCode errorCode;
if (ex instanceof BaseException) {
errorCode = ((BaseException) ex).getErrCode();
} else {
errorCode = CommonErrorCodeEnum.UNDEFINE;
}
return errorCode;
}
}
\ No newline at end of file
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.interceptor;
import org.springframework.aop.support.RegexpMethodPointcutAdvisor;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
*
* @author zhenxuan.luo
* @version com.ruiyi.rdassist.biz.service.interceptor: BizServiceInceptorConfig.java, v 0.1 2019-01-07 PM19:42 zhenxuan.luo Exp $
*/
@Configuration
public class BizServiceInceptorConfig {
@Autowired
private BizServiceInterceptor bizServiceInterceptor;
@Autowired
private BeanFactory beanFactory;
@Bean
public RegexpMethodPointcutAdvisor bizServiceDigestAdvisor() {
RegexpMethodPointcutAdvisor advisor = new RegexpMethodPointcutAdvisor();
advisor.setPattern("com.abssqr.plat.biz.api.*Service.*");
advisor.setAdvice(bizServiceInterceptor);
return advisor;
}
}
\ No newline at end of file
/**
* abssqr.com Inc.
* Copyright (c) 2017-2018 All Rights Reserved.
*/
package com.abssqr.plat.biz.interceptor;
import com.abssqr.plat.biz.validate.ValidateUtil;
import com.abssqr.plat.biz.validate.ValidatorError;
import com.abssqr.plat.common.facade.base.BaseParam;
import com.abssqr.plat.common.facade.enums.CommonErrorCodeEnum;
import com.abssqr.plat.common.facade.validation.Valid;
import com.abssqr.plat.common.model.exception.AbssqrInvalidParamException;
import com.abssqr.plat.common.util.interceptor.AbstractInterceptor;
import com.abssqr.plat.common.util.loggers.LogInfo;
import com.abssqr.plat.common.util.thread.ThreadLocalCleaner;
import com.general.system.common.model.exception.BaseException;
import com.general.system.common.util.LogUtil;
import org.aopalliance.intercept.MethodInvocation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
/**
*
* @author zhenxuan.luo
* @version com.loan.biz.service.inteceptor: BizServiceInterceptor.java, v 0.1 2018-12-19 AM11:38 zhenxuan.luo Exp $
*/
@Component
public class BizServiceInterceptor extends AbstractInterceptor {
/** logger */
private static final Logger LOGGER = LoggerFactory.getLogger(BizServiceInterceptor.class);
@Override
public Object businessInvoke(MethodInvocation invocation) throws Throwable {
Object result = null;
Throwable ex = null;
// 初始化调用者信息
LogInfo logInfo = initDigestLogCallerInfo(invocation);
try {
// 打印请求日志
BizLogUtil.logBizReqeust(logInfo, invocation);
// 检查请求参数合法性
result = checkRequestParam(invocation);
if (result != null) {
// 请求参数非法,直接返回非法结果
ex = new IllegalArgumentException("请求参数非法");
return result;
}
// 确保租户id,zoneUid设置到上下文中
result = invocation.proceed();
} catch (BaseException e) {
LogUtil.error(LOGGER, e, "服务调用[{0}]发生业务异常", logInfo);
ex = e;
throw e;
//result = InterceptorUtil.processError(LOGGER, invocation, e.getMessage(), e);
} catch (Throwable e) {
LogUtil.error(LOGGER, e, "服务调用[{0}]发生未知异常", logInfo);
ex = e;
throw e;
// result = InterceptorUtil.processError(LOGGER, invocation, e);
} finally {
// 防止中间出现异常未release
// 打印业务摘要日志
BizLogUtil.logBizDigest(logInfo, InterceptorUtil.getEventCode(invocation), ex);
// 清除本地线程变量
ThreadLocalCleaner.clean();
}
return result;
}
/**
* 请求参数校验
*
* @param invocation
* @return 校验成功返回null,否则返回失败结果
*/
private Object checkRequestParam(MethodInvocation invocation)
throws InstantiationException, IllegalAccessException {
try {
Annotation[][] parameterAnnotations = invocation.getMethod().getParameterAnnotations();
for (int i = 0; i < parameterAnnotations.length; i++) {
for (int j = 0; j < parameterAnnotations[i].length; j++) {
if (parameterAnnotations[i][j] instanceof Valid) {
Valid param = (Valid) parameterAnnotations[i][j];
Object currentArg = invocation.getArguments()[i];
//参数为null
if (null == currentArg) {
if (param.nullable()) {
break;
} else {
String errorMsg = "请求参数不能为null ["
+ invocation.getMethod().getDeclaringClass()
.getSimpleName() + "."
+ invocation.getMethod().getName() + "]";
LogUtil.warn(LOGGER, errorMsg);
return buildFailedResult(invocation, true, errorMsg);
}
}
ValidatorError errors = ValidateUtil.validate(currentArg);
if (errors.hasErrors()) {
String errorMsg = ValidateUtil.collectErrorsLog(currentArg, errors);
LogUtil.warn(LOGGER, "非法的请求参数:" + errorMsg);
return buildFailedResult(invocation, true, "非法的请求参数" + errorMsg);
}
if (currentArg instanceof BaseParam) {
((BaseParam) currentArg).checkParam();
}
}
}
}
return null;
} catch (AbssqrInvalidParamException e) {
throw e;
} catch (IllegalArgumentException e) {
LogUtil.error(LOGGER, e, "非法的请求参数:" + e.getMessage());
return buildFailedResult(invocation, true, "非法的请求参数:" + e.getMessage());
} catch (Throwable e) {
LogUtil.error(LOGGER, e, "请求参数校验时发生未知错误:" + e.getMessage());
return buildFailedResult(invocation, false, "请求参数校验时发生未知错误!");
}
}
/**
* 构造参数检查失败时的结果
*
* @param invocation
* @param invalidRequestParam
* @param errorMsg
* @return
*/
private Object buildFailedResult(MethodInvocation invocation, boolean invalidRequestParam,
String errorMsg) throws IllegalAccessException, InstantiationException {
return InterceptorUtil.processError(LOGGER, invocation, errorMsg,
invalidRequestParam ? CommonErrorCodeEnum.INVALID_PARAM : CommonErrorCodeEnum.SYS_ERROR, null);
}
/**
* 构建调用方基础信息
*
* @param invocation
*/
private LogInfo initDigestLogCallerInfo(MethodInvocation invocation) {
//设置日志摘要信息
LogInfo logInfo = new LogInfo();
Method method = invocation.getMethod();
logInfo.setFacadeName(method.getDeclaringClass().getSimpleName());
logInfo.setMethodName(method.getName());
return logInfo;
}
}
\ No newline at end of file
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.interceptor;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
*
* @author zhenxuan.luo
* @version com.ruiyi.rdassist.biz.service.interceptor: BizServiceMonitor.java, v 0.1 2019-01-07 PM20:30 zhenxuan.luo Exp $
*/
@Target({ ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface BizServiceMonitor {
}
\ No newline at end of file
/**
* abssqr.com Inc.
* Copyright (c) 2017-2018 All Rights Reserved.
*/
package com.abssqr.plat.biz.interceptor;
import com.abssqr.plat.common.facade.base.BaseParam;
import com.abssqr.plat.common.facade.enums.EventCodeEnum;
import com.abssqr.plat.common.model.exception.AbssqrInvalidParamException;
import com.general.system.common.model.BaseResult;
import com.general.system.common.model.IErrorCode;
import com.general.system.common.model.exception.BaseException;
import com.general.system.common.util.LogUtil;
import org.aopalliance.intercept.MethodInvocation;
import org.slf4j.Logger;
/**
*
* @author zhenxuan.luo
* @version com.loan.biz.service.inteceptor: InterceptorUtil.java, v 0.1 2018-12-19 PM12:20 zhenxuan.luo Exp $
*/
public class InterceptorUtil {
/**
* 私有构造函数
*/
private InterceptorUtil() {
}
/**
* 处理错误,打日志并生成facade的返回结果
*
* @param logger logger
* @param invocation 接口调用
* @param message 错误消息
* @param errorCodeEnum 错误码
* @param e 错误
* @return facade的返回结果
*/
public static Object processError(Logger logger, MethodInvocation invocation, String message,
IErrorCode errorCodeEnum, BaseException e)
throws IllegalAccessException, InstantiationException {
LogUtil.error(logger, e, message);
// 构造结果
Class<?> returnType = invocation.getMethod().getReturnType();
if (BaseResult.class.isAssignableFrom(returnType)) {
// 资产交换一阶段处理结果
BaseResult<?> result = (BaseResult<?>) returnType.newInstance();
result.setSuccess(false);
result.setErrorMessage(message);
result.setErrorCode(String.valueOf(errorCodeEnum.getCode()));
if (null != e) {
result.setNeedRetry(e.isCanRetry());
}
return result;
}
throw new AbssqrInvalidParamException(message);
// return null;
}
/**
* 获取一次接口调用的事件码编码
*
* @param invocation 接口调用
* @return 事件码编码, 获取不到时返回EventCodeEnum.UNKNOWN
*/
public static String getEventCode(MethodInvocation invocation) {
EventCodeEnum eventCode = getEventCodeEnum(invocation);
return eventCode == null ? EventCodeEnum.OTHER.getCode() : eventCode.getCode();
}
/**
* 获取一次接口调用的事件码枚举
*
* @param invocation 接口调用
* @return 事件码
*/
private static EventCodeEnum getEventCodeEnum(MethodInvocation invocation) {
Object[] args = invocation.getArguments();
if (args == null) {
return null;
}
for (Object arg : args) {
if (arg instanceof BaseParam) {
return ((BaseParam) arg).getEventCode();
}
}
return EventCodeEnum.OTHER;
}
}
\ No newline at end of file
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.support;
/**
*
* @author zhenxuan.luo
* @version com.abssqr.plat.biz.service.support: QryTemplate.java, v 0.1 2019-01-08 AM24:31 zhenxuan.luo Exp $
*/
public interface OprTemplate<R> {
/**
* 执行逻辑
*
* @return
*/
R execute();
default R afterProcess(R ret) {
return ret;
}
}
\ No newline at end of file
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.support;
/**
*
* @author zhenxuan.luo
* @version com.abssqr.plat.biz.service.support: QryTemplate.java, v 0.1 2019-01-08 AM24:31 zhenxuan.luo Exp $
*/
public interface QryTemplate<R> {
/**
* 执行查询逻辑
*
* @return 查询结果
*/
R query();
default R afterProcess(R ret) {
return ret;
}
}
\ No newline at end of file
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.support;
import com.abssqr.plat.common.facade.base.BaseOprParam;
import com.abssqr.plat.common.facade.base.BasePageQryParam;
import com.abssqr.plat.common.facade.base.BaseParam;
import com.abssqr.plat.common.model.seq.SequenceUtil;
import com.abssqr.plat.common.util.thread.BizContextHolder;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.support.TransactionTemplate;
/**
* @author zhenxuan.luo
* @version com.abssqr.plat.biz.service.support: ServiceSupport.java, v 0.1 2019-01-17 16:47 zhenxuan.luo Exp $
*/
public abstract class ServiceSupport {
protected final static Logger logger = LoggerFactory.getLogger(ServiceSupport.class);
@Autowired
private TransactionTemplate transactionTemplate;
/**
* 查询数据
* @param param
* @param qryTemplate
* @param <P>
* @param <R>
* @return
*/
protected <P extends BaseParam, R> R doQry(final P param, final QryTemplate<R> qryTemplate) {
if (param instanceof BasePageQryParam) {
if (((BasePageQryParam)param).getPageNum() == null) {
((BasePageQryParam)param).setPageNum(BasePageQryParam.DEFAULT_PAGENUM);
}
if (((BasePageQryParam)param).getPageSize() == null) {
((BasePageQryParam)param).setPageSize(BasePageQryParam.DEFAULT_PAGESIZE);
}
}
String bizNo = SequenceUtil.genFakeSeqNo();
BizContextHolder
.set(bizNo, param.getEventCode().getCode());
R ret = qryTemplate.query();
return qryTemplate.afterProcess(ret);
}
/**
* 变更数据
* @param param
* @param oprTemplate
* @param <P>
* @param <R>
* @return
*/
protected <P extends BaseOprParam, R> R doOpr(final P param, final OprTemplate<R> oprTemplate) {
String bizNo = SequenceUtil.genSeqNo(param.getEventCode().getCode());
BizContextHolder
.set(bizNo, param.getEventCode().getCode());
if (StringUtils.isBlank(param.getBizNo())) {
param.setBizNo(bizNo);
}
R ret = transactionTemplate.execute(status -> oprTemplate.execute());
return oprTemplate.afterProcess(ret);
}
}
\ No newline at end of file
/**
* abssqr.com Inc.
* Copyright (c) 2017-${YEAR} All Rights Reserved.
*/
package com.abssqr.plat.biz.validate;
import com.abssqr.plat.common.facade.validation.Bind;
import com.abssqr.plat.common.model.exception.AbssqrValidationException;
import org.springframework.util.ReflectionUtils;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* Field校验抽象类
*
* @author zhenxuan.luo
* @version $Id: AFieldValidator.java, v 0.1 2015年5月19日 上午10:31:23 zhenxuan.luo Exp $
*/
public abstract class AFieldValidator<A extends Annotation> {
//一个校验注解类可能对应多个校验的类型
/** Object类型和原始类型的映射 */
private static Map<Class<?>, Class<?>> classPrimitiveMap = new HashMap<Class<?>, Class<?>>();
static {
classPrimitiveMap.put(Boolean.class, Boolean.TYPE);
classPrimitiveMap.put(Byte.class, Byte.TYPE);
classPrimitiveMap.put(Character.class, Character.TYPE);
classPrimitiveMap.put(Double.class, Double.TYPE);
classPrimitiveMap.put(Float.class, Float.TYPE);
classPrimitiveMap.put(Integer.class, Integer.TYPE);
classPrimitiveMap.put(Long.class, Long.TYPE);
classPrimitiveMap.put(Short.class, Short.TYPE);
}
/** 校验注解类,用来注解需要校验的对象 例如:NotBlank */
private final Class<A> annotationClass;
/** 和注解类搭配的可以被校验的类型 例如:Integer.Type String */
private final Set<Class<?>> verifiableClassSet;
/**
* 构造函数
* @param annotationClass 注解类,用来注解需要校验的对象
*/
public AFieldValidator(Class<A> annotationClass) {
//参数为null
if (annotationClass == null) {
throwValidateException("构造器参数异常", annotationClass);
}
//校验注解没有设置Bind
Bind bind = getBind(annotationClass);
if (bind == null) {
throwValidateException("Bind注解没有设置", annotationClass);
}
//获取校验注解中Bind中表示的可校验类型
Class<?>[] verifiableClassArray = bind.verifiableClass();
if (verifiableClassArray == null || verifiableClassArray.length == 0) {
throwValidateException("Bind的校验器列表为空", annotationClass);
}
this.annotationClass = annotationClass;
//由于校验注解中只能填 对象的class,基本数据类型的class无法手填,所以这里需要扩展一下
Set<Class<?>> set = new HashSet<Class<?>>();
for (Class<?> c : verifiableClassArray) {
Class<?> primitiveClass = getPrimitiveClassIfExisted(c);
if (primitiveClass != null) {
set.add(primitiveClass);
}
set.add(c);
}
this.verifiableClassSet = set;
}
/**
* 校验对象(validTargetObj)的某个字段(field)
* @param validateService 对象校验器
* @param validTargetObj 校验的对象
* @param field 校验对象(validTargetObj)的某个字段
* @return null:没有错误;反之返回FieldError对象
* @throws IllegalAccessException
*/
@SuppressWarnings("unchecked")
public FieldError validate(final ValidateService validateService, final Object validTargetObj,
final Field field, final Annotation annotationObj)
throws IllegalAccessException {
// 当前字段存在本校验注解对象
if (annotationObj != null) {
ReflectionUtils.makeAccessible(field);
// 注解的字段类型是否合理
Class<?> type = field.getType();
if (!fieldTypeVerifiable(type)) {
throw new AbssqrValidationException("注解标注的字段类型和注解注册的校验类型不一致" + field + ":" + type
+ ":" + verifiableClassSet);
}
// 取出字段的值进行校验
Object validTargetFieldObj = field.get(validTargetObj);
FieldError fieldError = new FieldError(validTargetObj.getClass().getName(),
field.getName(), validTargetFieldObj);
// 校验字段是否合法
boolean isValid = isValid(validateService, (A) annotationObj, validTargetFieldObj,
fieldError);
if (!isValid) {
return fieldError;
}
}
return null;
}
/**
* 给子类实现的具体校验方法
* @param validateService 对象校验器
* @param annotationObj 校验注解对象
* @param validTargetFieldObj 需要校验的字段对象
* @param errorConext 每个字段错误的存储类
* @return true:校验通过;反之返回false
*/
protected abstract boolean isValid(ValidateService validateService, A annotationObj,
Object validTargetFieldObj, FieldError errorConext);
/**
* throw {@link AbssqrValidationException}
* @param errorDesc
* @param annotationClass 注解类,用来注解需要校验的对象
*/
private void throwValidateException(String errorDesc, Class<A> annotationClass) {
StringBuilder sb = new StringBuilder();
sb.append("构造").append(this).append("异常\tannotationClass:").append(annotationClass)
.append(errorDesc);
throw new AbssqrValidationException(sb.toString());
}
/**
* 字段类型是否为注解可校验的类型
* @param type
* @return true:字段类型是可以被校验的类型:反之返回false
*/
private boolean fieldTypeVerifiable(Class<?> type) {
if (verifiableClassSet.contains(type)) {
return true;
}
for (Class<?> verifiableClass : verifiableClassSet) {
if (verifiableClass.isAssignableFrom(type)) {
return true;
}
}
return false;
}
/**
* 通过Object找到对应的原始类型
* @param c
* @return null:没找到对应的原始类型;反之返回找到的Class对象
*/
private Class<?> getPrimitiveClassIfExisted(Class<?> c) {
return classPrimitiveMap.get(c);
}
/**
* 获取校验注解的{@link Bind}标注对象,这个Bind限制了标注的校验实现类,目的是用来防止错误的绑定关系
* @param annotationClass 校验注解
*/
private Bind getBind(Class<A> annotationClass) {
Annotation[] annotations = annotationClass.getAnnotations();
for (Annotation annotation : annotations) {
if (annotation instanceof Bind) {
return (Bind) annotation;
}
}
return null;
}
/**
* Getter method for property <tt>annotationClass</tt>.
*
* @return property value of annotationClass
*/
public Class<A> getAnnotationClass() {
return annotationClass;
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-${YEAR} All Rights Reserved.
*/
package com.abssqr.plat.biz.validate;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
/**
* 每个字段错误的存储,以保存所有的参数错误信息,避免出现错误信息中断。
*
* @author zhenxuan.luo
* @version $Id: FieldError.java, v 0.1 2015年5月18日 下午7:36:15 zhenxuan.luo Exp $
*/
public class FieldError {
/** 对象名称 */
private final String objectName;
/** 字段名称 */
private final String fieldName;
/** 字段的值 */
private final Object fieldValue;
/** 错误信息 */
private String errorMsg;
/**
* @param objectName 字段所在的对象
* @param fieldName 字段的名称
* @param fieldValue 字段的值
*/
public FieldError(String objectName, String fieldName, Object fieldValue) {
super();
this.objectName = objectName;
this.fieldName = fieldName;
this.fieldValue = fieldValue;
}
/**
* Getter method for property <tt>errorMsg</tt>.
*
* @return property value of errorMsg
*/
public String getErrorMsg() {
return errorMsg == null ? "" : errorMsg;
}
/**
* Setter method for property <tt>errorMsg</tt>.
*
* @param errorMsg value to be assigned to property errorMsg
*/
public void setErrorMsg(String errorMsg) {
this.errorMsg = errorMsg;
}
/**
* Getter method for property <tt>objectName</tt>.
*
* @return property value of objectName
*/
public String getObjectName() {
return objectName;
}
/**
* Getter method for property <tt>fieldName</tt>.
*
* @return property value of fieldName
*/
public String getFieldName() {
return fieldName;
}
/**
* Getter method for property <tt>fieldValue</tt>.
*
* @return property value of fieldValue
*/
public Object getFieldValue() {
return fieldValue;
}
/**
* 以短格式的方式输出对象属性
*
* @see Object#toString()
*/
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-${YEAR} All Rights Reserved.
*/
package com.abssqr.plat.biz.validate;
/**
* 参数校验服务
*
* @author zhenxuan.luo
* @version $Id: ValidateService.java, v 0.1 2015年5月19日 下午3:24:17 zhenxuan.luo Exp $
*/
public interface ValidateService {
/**
* 校验被加了相应注解(例如:{@link VldString} {@link VldNotNull})的字段
* <b>注意:<br/>
* 如果子类和父类中包含有同名,同类型的字段,则会导致校验报错<br/>
* </b>
*
* @param targetObj 被校验的对象
* @return 错误上下文
*/
ValidatorError validate(Object targetObj);
/**
* 搜集所有错误日志,一般用于日志输出
*
* @param targetObj 被校验对象
* @param errors 校验的错误信息
* @return 错误信息,没有一定的格式
*/
String collectErrorsLog(Object targetObj, ValidatorError errors);
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2018 All Rights Reserved.
*/
package com.abssqr.plat.biz.validate;
import com.abssqr.plat.biz.validate.validator.BigDecimalValidator;
import com.abssqr.plat.biz.validate.validator.CollectionValidator;
import com.abssqr.plat.biz.validate.validator.DateValidator;
import com.abssqr.plat.biz.validate.validator.DtValidator;
import com.abssqr.plat.biz.validate.validator.EnumsValidator;
import com.abssqr.plat.biz.validate.validator.MapValidator;
import com.abssqr.plat.biz.validate.validator.MoneyValidator;
import com.abssqr.plat.biz.validate.validator.NotNullValidator;
import com.abssqr.plat.biz.validate.validator.RangeValidator;
import com.abssqr.plat.biz.validate.validator.StringValidator;
import com.abssqr.plat.biz.validate.validator.ValueSetValidator;
import com.general.system.common.util.LogUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 校验器工具类
* @author guozhenhua
* @version com.loan.biz.service.util.validation: ValidateUtil.java, v 0.1 2018-12-16 11:36 PM guozhenhua Exp $
*/
public class ValidateUtil {
private final static Logger LOGGER = LoggerFactory.getLogger(
ValidateUtil.class);
private static ValidateServiceImpl validateService = new ValidateServiceImpl();
static {
validateService.register(new CollectionValidator());
validateService.register(new DateValidator());
validateService.register(new DtValidator());
validateService.register(new EnumsValidator());
validateService.register(new MapValidator());
validateService.register(new NotNullValidator());
validateService.register(new RangeValidator());
validateService.register(new StringValidator());
validateService.register(new BigDecimalValidator());
validateService.register(new ValueSetValidator());
validateService.register(new MoneyValidator());
LogUtil.info(LOGGER, "校验器工具类初始化完毕ValidateUtil");
}
/**
* 校验请求对象参数,校验结果ValidatorError返回值交给调用者,由调用者来处理校验结果
* @param targetObj
* @return
*/
public static ValidatorError validate(Object targetObj) {
return validateService.validate(targetObj);
}
/**
* 校验结果的描述信息提取
* @param targetObj
* @param validatorError
* @return
*/
public static String collectErrorsLog(Object targetObj, ValidatorError validatorError) {
return validateService.collectErrorsLog(targetObj, validatorError);
}
/**
* 校验请求对象参数,参数校验不通过直接输出异常
* @param targetObj
*/
public static void validateNoRes(Object targetObj) {
ValidatorError validatorError = validateService.validate(targetObj);
if (validatorError.hasErrors()) {
String errorMsg = validateService.collectErrorsLog(targetObj, validatorError);
LogUtil.error(LOGGER, "校验器校验失败,校验对象:{0},结果:{1}", targetObj, errorMsg);
throw new IllegalArgumentException(errorMsg);
}
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-${YEAR} All Rights Reserved.
*/
package com.abssqr.plat.biz.validate;
import java.util.ArrayList;
import java.util.List;
/**
* 参数校验错误上下文
*
* @author zhenxuan.luo
* @version $Id: ValidatorError.java, v 0.1 2015年5月18日 下午7:35:16 zhenxuan.luo Exp $
*/
public class ValidatorError {
/** 异常信息 */
private List<FieldError> errList = null;
/**
* 存在异常
* @return true:存在异常;反之返回false
*/
public boolean hasErrors() {
return errList != null && errList.size() > 0;
}
/**
* 设置异常
* @param fieldError
*/
public void addFieldError(FieldError fieldError) {
if (errList == null) {
errList = new ArrayList<FieldError>();
}
errList.add(fieldError);
}
/**
* 获取异常
* @return 字段错误清单
*/
public List<FieldError> getFieldErrors() {
return errList;
}
/**
* 错误信息描述
* @return 错误信息
*/
public StringBuilder getErrorMsg() {
return getErrorMsg(null, null);
}
/**
* 错误信息描述
* @param prefix 前缀
* @param suffix 后缀
* @return 错误信息
*/
public StringBuilder getErrorMsg(String prefix, String suffix) {
StringBuilder sb = new StringBuilder();
if (prefix != null) {
sb.append(prefix);
}
if (errList == null) {
return sb;
}
// 添加校验不通过的所有参数名、值和不通过信息
for (FieldError error : errList) {
sb.append(error.getObjectName()).append("#").append(error.getFieldName()).append("=[")
.append(error.getFieldValue()).append("]:[").append(error.getErrorMsg())
.append("];");
}
if (suffix != null) {
sb.append(suffix);
}
return sb;
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2017 All Rights Reserved.
*/
package com.abssqr.plat.biz.validate.validator;
import com.abssqr.plat.biz.validate.AFieldValidator;
import com.abssqr.plat.biz.validate.FieldError;
import com.abssqr.plat.biz.validate.ValidateService;
import com.abssqr.plat.common.facade.validation.VldBigDecimal;
import java.math.BigDecimal;
/**
* 注解@{@link VldBigDecimal}的校验类实现
*
* @author zhenxuan.luo
* @version $Id: MoneyValidator.java, v 0.1 2015年5月19日 上午11:01:04 zhenxuan.luo Exp $
*/
public final class BigDecimalValidator extends AFieldValidator<VldBigDecimal> {
/**
* 默认构造器
*/
public BigDecimalValidator() {
super(VldBigDecimal.class);
}
@Override
public boolean isValid(ValidateService validateService, VldBigDecimal annotationObj,
Object validTargetFieldObj, FieldError errorConext) {
boolean isValid = false;
try {
return isValid = validate(annotationObj, validTargetFieldObj);
} finally {
if (!isValid) {
errorConext.setErrorMsg(annotationObj.message());
}
}
}
/**
* 校验
* @param annotationObj 校验注解对象
* @param validTargetFieldObj 需要校验的字段对象
* @return true:校验通过,反之返回false
*/
private boolean validate(VldBigDecimal annotationObj, Object validTargetFieldObj) {
if (validTargetFieldObj == null) {
return (annotationObj.nullable()) ? true : false;
}
if (validTargetFieldObj instanceof BigDecimal) {
BigDecimal decimal = (BigDecimal) validTargetFieldObj;
if (annotationObj.isGreaterThanZero() && decimal.compareTo(BigDecimal.ZERO) <= 0) {
return false;
}
if (!annotationObj.canNegative() && decimal.compareTo(BigDecimal.ZERO) < 0) {
return false;
}
return true;
}
return false;
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2017 All Rights Reserved.
*/
package com.abssqr.plat.biz.validate.validator;
import com.abssqr.plat.biz.validate.AFieldValidator;
import com.abssqr.plat.biz.validate.FieldError;
import com.abssqr.plat.biz.validate.ValidateService;
import com.abssqr.plat.biz.validate.ValidatorError;
import com.abssqr.plat.common.facade.validation.VldCollection;
import java.util.Collection;
/**
* 注解@{@link VldCollection}的校验类实现
* @author zhenxuan.luo
* @version $Id: CollectionValidator.java, v 0.1 2015年5月19日 上午10:54:34 zhenxuan.luo Exp $
*/
public final class CollectionValidator extends AFieldValidator<VldCollection> {
/**
* 默认构造器
*/
public CollectionValidator() {
super(VldCollection.class);
}
@Override
public boolean isValid(ValidateService validateService, VldCollection annotationObj,
Object validTargetFieldObj, FieldError errorConext) {
boolean isValid = false;
try {
return isValid = validate(validateService, annotationObj, validTargetFieldObj,
errorConext);
} finally {
if (!isValid) {
errorConext.setErrorMsg(errorConext.getErrorMsg() + annotationObj.message());
}
}
}
/**
* 校验
* @param validateService 对象校验器
* @param annotationObj 校验注解对象
* @param validTargetFieldObj 需要校验的字段对象
* @param errorConext 每个字段错误的存储类
* @return true:校验通过,反之返回false
*/
private boolean validate(ValidateService validateService, VldCollection annotationObj,
Object validTargetFieldObj, FieldError errorConext) {
if (validTargetFieldObj == null) {
return (annotationObj.nullable()) ? true : false;
}
int minSize = annotationObj.minSize();
int maxSize = annotationObj.maxSize();
if (validTargetFieldObj instanceof Collection) {
Collection<?> c = (Collection<?>) validTargetFieldObj;
int size = c.size();
boolean isValid = (size >= minSize) && (size <= maxSize);
// 如果不做嵌套校验,则直接返回结果
if (!annotationObj.nestable()) {
return isValid;
} else if (isValid) {
//嵌套校验
for (Object nestTargetObj : c) {
ValidatorError ve = validateService.validate(nestTargetObj);
//嵌套校验,发现一个出错就直接退出,不校验后续
if (ve.hasErrors()) {
StringBuilder sb = ve.getErrorMsg("<[cause by:", "]>");
errorConext.setErrorMsg(sb.toString());
return false;
}
}
return true;
}
}
return false;
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2017 All Rights Reserved.
*/
package com.abssqr.plat.biz.validate.validator;
import com.abssqr.plat.biz.validate.AFieldValidator;
import com.abssqr.plat.biz.validate.FieldError;
import com.abssqr.plat.biz.validate.ValidateService;
import com.abssqr.plat.common.facade.validation.VldDate;
import com.general.system.common.util.SystemDateUtil;
import java.util.Date;
/**
* 注解@{@link VldDate}的校验类实现
*
* @author zhenxuan.luo
* @version $Id: DtValidator.java, v 0.1 2015年5月19日 上午11:29:42 zhenxuan.luo Exp $
*/
public final class DateValidator extends AFieldValidator<VldDate> {
/**
* 默认构造函数
* @return
*/
public DateValidator() {
super(VldDate.class);
}
/**
* @param annotationClass
*/
public DateValidator(Class<VldDate> annotationClass) {
super(annotationClass);
}
/**
*
* @param validateService 对象校验器
* @param annotationObj 校验注解对象
* @param validTargetFieldObj 需要校验的字段对象
* @param errorConext 每个字段错误的存储类
* @return
*/
@Override
protected boolean isValid(ValidateService validateService, VldDate annotationObj,
Object validTargetFieldObj, FieldError errorConext) {
boolean isValid = false;
try {
return isValid = validate(annotationObj, validTargetFieldObj);
} finally {
if (!isValid) {
errorConext.setErrorMsg(errorConext.getErrorMsg() + annotationObj.message());
}
}
}
private boolean validate(VldDate annotationObj, Object validTargetFieldObj) {
if (validTargetFieldObj == null) {
return (annotationObj.nullable()) ? true : false;
}
if (validTargetFieldObj instanceof Date) {
Date date = (Date) validTargetFieldObj;
if (annotationObj.isFuture()) {
return date.after(SystemDateUtil.getSystemDate());
} else {
return true;
}
}
return false;
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2017 All Rights Reserved.
*/
package com.abssqr.plat.biz.validate.validator;
import com.abssqr.plat.biz.validate.AFieldValidator;
import com.abssqr.plat.biz.validate.FieldError;
import com.abssqr.plat.biz.validate.ValidateService;
import com.abssqr.plat.common.facade.validation.VldDt;
import com.general.system.common.util.LogUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
/**
* 注解@{@link VldDt}的校验类实现
*
* @author zhenxuan.luo
* @version $Id: DtValidator.java, v 0.1 2015年5月19日 上午11:29:42 zhenxuan.luo Exp $
*/
public final class DtValidator extends AFieldValidator<VldDt> {
private final static Logger LOGGER = LoggerFactory.getLogger(
DtValidator.class);
/**
* 默认构造函数
*/
public DtValidator() {
super(VldDt.class);
}
/**
* @param annotationClass
*/
public DtValidator(Class<VldDt> annotationClass) {
super(annotationClass);
}
@Override
public boolean isValid(ValidateService validateService, VldDt annotationObj,
Object validTargetFieldObj, FieldError errorConext) {
boolean isValid = false;
try {
return isValid = validate(annotationObj, validTargetFieldObj);
} finally {
if (!isValid) {
errorConext.setErrorMsg(errorConext.getErrorMsg() + annotationObj.message());
}
}
}
private boolean validate(VldDt annotationObj, Object validTargetFieldObj) {
if (validTargetFieldObj == null) {
return (annotationObj.nullable()) ? true : false;
}
if (validTargetFieldObj instanceof String) {
String dtText = (String) validTargetFieldObj;
// 先校验长度
if (dtText.length() != annotationObj.dtFormat().length()) {
return false;
}
// 再校验日期格式
DateFormat dateFormat = new SimpleDateFormat(annotationObj.dtFormat());
try {
dateFormat.parse(dtText);
} catch (Throwable e) {
LogUtil.warn(LOGGER, "对于dt的参数校验失败,格式不匹配: [dtText={0}, format={1}]", dtText,
annotationObj.dtFormat());
return false;
}
return true;
}
return false;
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2017 All Rights Reserved.
*/
package com.abssqr.plat.biz.validate.validator;
import com.abssqr.plat.biz.validate.AFieldValidator;
import com.abssqr.plat.biz.validate.FieldError;
import com.abssqr.plat.biz.validate.ValidateService;
import com.abssqr.plat.common.facade.validation.VldEnums;
import com.general.system.common.util.LogUtil;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.reflect.Method;
import java.util.concurrent.ConcurrentHashMap;
/**
* 注解@{@link VldEnums}的校验类实现
* @author zhenxuan.luo
* @version $Id: EnumsValidator.java, v 0.1 2015年5月19日 上午10:58:17 zhenxuan.luo Exp $
*/
public final class EnumsValidator extends AFieldValidator<VldEnums> {
private final static Logger LOGGER = LoggerFactory.getLogger(
EnumsValidator.class);
/** Method的cache */
private final ConcurrentHashMap<String, Method> methodCache = new ConcurrentHashMap<String, Method>();
/**
* 默认构造器
*/
public EnumsValidator() {
super(VldEnums.class);
}
@Override
public boolean isValid(ValidateService validateService, VldEnums annotationObj,
Object validTargetFieldObj, FieldError errorConext) {
boolean isValid = false;
try {
return isValid = validate(annotationObj, validTargetFieldObj);
} finally {
if (!isValid) {
errorConext.setErrorMsg(annotationObj.message());
}
}
}
/**
* 校验
* @param annotationObj 校验注解对象
* @param validTargetFieldObj 需要校验的字段对象
* @return true:校验通过,反之返回false
*/
@SuppressWarnings("rawtypes")
private boolean validate(VldEnums annotationObj, Object validTargetFieldObj) {
if (validTargetFieldObj == null) {
return (annotationObj.nullable()) ? true : false;
}
if (validTargetFieldObj instanceof String) {
String enumCode = (String) validTargetFieldObj;
if (StringUtils.isBlank(enumCode)) {
return (annotationObj.nullable()) ? true : false;
}
Class<? extends Enum> enumClass = annotationObj.enumClass();
String methodName = annotationObj.getByMethod();
try {
Method method = getMethod(enumClass, methodName);
Enum result = (Enum) method.invoke(null, enumCode);
if (result != null && result.getClass() == enumClass) {
return true;
}
} catch (Throwable e) {
LogUtil.error(LOGGER, e, "EnumsValidator:校验失败" + annotationObj + ":" + validTargetFieldObj);
return false;
}
}
return false;
}
/**
*
* @param enumClass
* @param methodName
* @return 方法对象, 如果Method找不到会抛出异常
* @throws NoSuchMethodException
* @throws SecurityException
*/
@SuppressWarnings("rawtypes")
private Method getMethod(Class<? extends Enum> enumClass,
String methodName) throws SecurityException, NoSuchMethodException {
String key = enumClass.getName() + methodName;
Method cacheData = methodCache.get(key);
if (cacheData != null) {
return cacheData;
}
Method method = enumClass.getMethod(methodName, String.class);
methodCache.put(key, method);
return method;
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2017 All Rights Reserved.
*/
package com.abssqr.plat.biz.validate.validator;
import com.abssqr.plat.biz.validate.AFieldValidator;
import com.abssqr.plat.biz.validate.FieldError;
import com.abssqr.plat.biz.validate.ValidateService;
import com.abssqr.plat.biz.validate.ValidatorError;
import com.abssqr.plat.common.facade.validation.VldMap;
import java.util.Map;
/**
* 注解@{@link VldMap}的校验类实现
* @author zhenxuan.luo
* @version $Id: MapValidator.java, v 0.1 2015年5月19日 上午10:59:50 zhenxuan.luo Exp $
*/
public final class MapValidator extends AFieldValidator<VldMap> {
/**
* 默认构造器
*/
public MapValidator() {
super(VldMap.class);
}
@Override
public boolean isValid(ValidateService validateService, VldMap annotationObj,
Object validTargetFieldObj, FieldError errorConext) {
boolean isValid = false;
try {
return isValid = validate(validateService, annotationObj, validTargetFieldObj,
errorConext);
} finally {
if (!isValid) {
errorConext.setErrorMsg(errorConext.getErrorMsg() + annotationObj.message());
}
}
}
/**
* 校验
* @param annotationObj 校验注解对象
* @param validTargetFieldObj 需要校验的字段对象
* @return true:校验通过,反之返回false
*/
@SuppressWarnings("rawtypes")
private boolean validate(ValidateService validateService, VldMap annotationObj,
Object validTargetFieldObj, FieldError errorConext) {
if (validTargetFieldObj == null) {
return (annotationObj.nullable()) ? true : false;
}
int minSize = annotationObj.minSize();
int maxSize = annotationObj.maxSize();
if (validTargetFieldObj instanceof Map) {
Map map = (Map) validTargetFieldObj;
int size = map.size();
boolean isValid = (size >= minSize) && (size <= maxSize);
if (!annotationObj.nestable()) {
return isValid;
} else if (isValid) {
//嵌套校验
for (Object nestTargetObj : map.values()) {
ValidatorError ve = validateService.validate(nestTargetObj);
//嵌套校验,发现一个出错就直接退出,不校验后续
if (ve.hasErrors()) {
StringBuilder sb = ve.getErrorMsg("<[cause by:", "]>");
errorConext.setErrorMsg(sb.toString());
return false;
}
}
return true;
}
}
return false;
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2017 All Rights Reserved.
*/
package com.abssqr.plat.biz.validate.validator;
import com.abssqr.plat.biz.validate.AFieldValidator;
import com.abssqr.plat.biz.validate.FieldError;
import com.abssqr.plat.biz.validate.ValidateService;
import com.abssqr.plat.common.facade.validation.VldMoney;
import com.general.system.common.model.Money;
import com.general.system.common.util.MoneyUtil;
/**
* 注解@{@link VldMoney}的校验类实现
*
* @author zhenxuan.luo
* @version $Id: MoneyValidator.java, v 0.1 2015年5月19日 上午11:01:04 zhenxuan.luo Exp $
*/
public final class MoneyValidator extends AFieldValidator<VldMoney> {
/**
* 默认构造器
*/
public MoneyValidator() {
super(VldMoney.class);
}
@Override
public boolean isValid(ValidateService validateService, VldMoney annotationObj,
Object validTargetFieldObj, FieldError errorConext) {
boolean isValid = false;
try {
return isValid = validate(annotationObj, validTargetFieldObj);
} finally {
if (!isValid) {
errorConext.setErrorMsg(annotationObj.message());
}
}
}
/**
* 校验
* @param annotationObj 校验注解对象
* @param validTargetFieldObj 需要校验的字段对象
* @return true:校验通过,反之返回false
*/
private boolean validate(VldMoney annotationObj, Object validTargetFieldObj) {
if (validTargetFieldObj == null) {
return (annotationObj.nullable()) ? true : false;
}
if (validTargetFieldObj instanceof Money) {
Money money = (Money) validTargetFieldObj;
if (annotationObj.zeroable() && MoneyUtil.compare(money, new Money()) >= 0) {
return true;
} else if (!annotationObj.zeroable() && MoneyUtil.compare(money, new Money()) > 0) {
return true;
}
}
return false;
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2017 All Rights Reserved.
*/
package com.abssqr.plat.biz.validate.validator;
import com.abssqr.plat.biz.validate.AFieldValidator;
import com.abssqr.plat.biz.validate.FieldError;
import com.abssqr.plat.biz.validate.ValidateService;
import com.abssqr.plat.common.facade.validation.VldNotNull;
/**
* 注解@{@link VldNotNull}的校验类实现
*
* @author zhenxuan.luo
* @version $Id: NotNullValidator.java, v 0.1 2015年5月19日 上午11:03:19 zhenxuan.luo Exp $
*/
public final class NotNullValidator extends AFieldValidator<VldNotNull> {
/**
* 默认构造器
*/
public NotNullValidator() {
super(VldNotNull.class);
}
@Override
public boolean isValid(ValidateService validateService, VldNotNull annotation, Object object,
FieldError fieldError) {
boolean isValid = true;
try {
return isValid = validate(object);
} finally {
if (!isValid) {
fieldError.setErrorMsg(annotation.message());
}
}
}
/**
* 校验
* @param object 被校验的字段对象
* @return true:校验通过,反之返回false
*/
private boolean validate(Object object) {
if (object != null) {
return true;
}
return false;
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2017 All Rights Reserved.
*/
package com.abssqr.plat.biz.validate.validator;
import com.abssqr.plat.biz.validate.AFieldValidator;
import com.abssqr.plat.biz.validate.FieldError;
import com.abssqr.plat.biz.validate.ValidateService;
import com.abssqr.plat.common.facade.validation.VldRange;
import java.math.BigDecimal;
/**
* 注解@{@link VldRange}的校验类实现
* @author zhenxuan.luo
* @version $Id: RangeValidator.java, v 0.1 2015年5月19日 上午10:56:18 zhenxuan.luo Exp $
*/
public final class RangeValidator extends AFieldValidator<VldRange> {
/**
* 默认构造器
*/
public RangeValidator() {
super(VldRange.class);
}
/**
* 校验value的范围是否在 annotationObj 范围内
* @param range 范围注解 {@link VldRange}
* @param value 需要校验的值
* @return true:校验成功;反之返回false
*/
private boolean valid(VldRange range, long value) {
long max = range.max();
long min = range.min();
return value >= min && value <= max;
}
private boolean validDecimal(VldRange range, BigDecimal value) {
BigDecimal max = new BigDecimal(range.max());
BigDecimal min = new BigDecimal(range.min());
return value.compareTo(min) >= 0 && value.compareTo(max) <= 0;
}
@Override
public boolean isValid(ValidateService validateService, VldRange annotationObj,
Object validTargetFieldObj, FieldError errorConext) {
boolean isValid = false;
try {
return isValid = validate(annotationObj, validTargetFieldObj);
} finally {
if (!isValid) {
errorConext.setErrorMsg(annotationObj.message());
}
}
}
/**
* 校验
* @param annotationObj 校验注解对象
* @param validTargetFieldObj 需要校验的字段对象
* @return true:校验通过,反之返回false
*/
private boolean validate(VldRange annotationObj, Object validTargetFieldObj) {
if (validTargetFieldObj == null) {
return (annotationObj.nullable()) ? true : false;
}
if (validTargetFieldObj instanceof Integer) {
int value = (Integer) validTargetFieldObj;
return valid(annotationObj, value);
} else if (validTargetFieldObj instanceof Long) {
long value = (Long) validTargetFieldObj;
return valid(annotationObj, value);
} else if (validTargetFieldObj instanceof BigDecimal) {
BigDecimal value = (BigDecimal) validTargetFieldObj;
return validDecimal(annotationObj, value);
}
return false;
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2017 All Rights Reserved.
*/
package com.abssqr.plat.biz.validate.validator;
import com.abssqr.plat.biz.validate.AFieldValidator;
import com.abssqr.plat.biz.validate.FieldError;
import com.abssqr.plat.biz.validate.ValidateService;
import com.abssqr.plat.common.facade.validation.VldString;
import org.apache.commons.lang3.StringUtils;
/**
*
* @author zhenxuan.luo
* @version $Id: StringValidator.java, v 0.1 2015年5月19日 上午11:04:04 zhenxuan.luo Exp $
*/
public final class StringValidator extends AFieldValidator<VldString> {
/**
* 默认构造器
*/
public StringValidator() {
super(VldString.class);
}
/**
* @param annotationClass
*/
public StringValidator(Class<VldString> annotationClass) {
super(annotationClass);
}
@Override
public boolean isValid(ValidateService validateService, VldString annotationObj,
Object validTargetFieldObj, FieldError errorConext) {
boolean isValid = true;
try {
return isValid = validate(annotationObj, validTargetFieldObj);
} finally {
if (!isValid) {
errorConext.setErrorMsg(annotationObj.message());
}
}
}
/**
* 实际校验逻辑
*
* @param annotationObj
* @param validTargetFieldObj
* @return
*/
private boolean validate(VldString annotationObj, Object validTargetFieldObj) {
if (null == validTargetFieldObj) {
return (annotationObj.nullable()) ? true : false;
}
if (validTargetFieldObj instanceof String) {
String checkText = (String) validTargetFieldObj;
boolean ret = checkEmpty(annotationObj, checkText);
// 空校验通过,且需要校验range
if (ret) {
return (checkText.length() >= annotationObj.minLength())
&& (checkText.length() <= annotationObj.maxLength());
}
return ret;
}
return false;
}
/**
* blank校验
*
* @return
*/
private boolean checkEmpty(VldString annotationObj, String checkText) {
if (annotationObj.checkEmpty()) {
return !StringUtils.isBlank(checkText);
} else {
return true;
}
}
}
/**
* abssqr.com Inc.
* Copyright (c) 2017-2017 All Rights Reserved.
*/
package com.abssqr.plat.biz.validate.validator;
import com.abssqr.plat.biz.validate.AFieldValidator;
import com.abssqr.plat.biz.validate.FieldError;
import com.abssqr.plat.biz.validate.ValidateService;
import com.abssqr.plat.common.facade.validation.VldValueSet;
import org.apache.commons.lang3.StringUtils;
/**
* 注解@{@link VldValueSet}的校验类实现
* @author zhenxuan.luo
* @version $Id: RangeValidator.java, v 0.1 2015年5月19日 上午10:56:18 zhenxuan.luo Exp $
*/
public final class ValueSetValidator extends AFieldValidator<VldValueSet> {
/**
* 默认构造器
*/
public ValueSetValidator() {
super(VldValueSet.class);
}
@Override
public boolean isValid(ValidateService validateService, VldValueSet annotationObj,
Object validTargetFieldObj, FieldError errorConext) {
boolean isValid = false;
try {
return isValid = validate(annotationObj, validTargetFieldObj);
} finally {
if (!isValid) {
errorConext.setErrorMsg(annotationObj.message());
}
}
}
/**
* 校验
* @param annotationObj 校验注解对象
* @param validTargetFieldObj 需要校验的字段对象
* @return true:校验通过,反之返回false
*/
private boolean validate(VldValueSet annotationObj, Object validTargetFieldObj) {
if (validTargetFieldObj == null) {
return (annotationObj.nullable()) ? true : false;
}
if (annotationObj.valueSet() == null || annotationObj.valueSet().length == 0) {
return true;
}
String targetValue = (String) validTargetFieldObj;
for (String value : annotationObj.valueSet()) {
if (StringUtils.equals(StringUtils.trim(value), targetValue)) {
return true;
}
}
return false;
}
}
/target/
!.mvn/wrapper/maven-wrapper.jar
*.class
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
mvnw
mvnw.cmd
.mvn
### NetBeans ###
/nbproject/private/
/build/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
.DS_Store
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.abssqr.bbplat</groupId>
<artifactId>bb-parent</artifactId>
<version>1.0.0</version>
<relativePath>../../../pom.xml</relativePath>
</parent>
<groupId>com.abssqr.bbplat</groupId>
<artifactId>biz-shared</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<name>biz-shared</name>
<dependencies>
<dependency>
<groupId>com.abssqr.bbplat</groupId>
<artifactId>core-service</artifactId>
</dependency>
<dependency>
<groupId>com.abssqr.gateway</groupId>
<artifactId>abssqr-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
</dependency>
</dependencies>
</project>
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.shared.astclient.base;
import com.abssqr.plat.common.model.domain.astSync.BaseAstEntity;
/**
*
* @author zhenxuan.luo
* @version com.abssqr.plat.biz.shared.astclient.adapter: AstClientAdapter.java, v 0.1 2019-06-14 01:33 zhenxuan.luo Exp $
*/
public interface AstClientAdapter<T extends BaseAstEntity> {
boolean process(T astEntity);
}
\ No newline at end of file
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.shared.astclient.base;
import com.abssqr.plat.common.facade.enums.AstContractTypeEnum;
import com.abssqr.plat.common.facade.enums.AstTypeEnum;
import com.abssqr.plat.common.facade.enums.GrantFundTypeEnum;
import com.abssqr.plat.common.facade.enums.LoanStatusEnum;
import com.abssqr.plat.common.facade.enums.LoanTypeEnum;
import com.abssqr.plat.common.facade.enums.PeriodTypeEnum;
import com.abssqr.plat.common.facade.enums.RateTypeEnum;
import com.abssqr.plat.common.facade.enums.RepayMethodEnum;
/**
*
* @author zhenxuan.luo
* @version com.abssqr.plat.biz.shared.astclient.base: FieldTranslator.java, v 0.1 2019-06-14 20:13 zhenxuan.luo Exp $
*/
public interface FieldTranslator {
LoanStatusEnum transAstStatus(String... statusFields);
LoanStatusEnum transTermStatus(String termStatus);
LoanTypeEnum transLoanType(String loanType);
AstTypeEnum transAstType(String astType);
AstContractTypeEnum transContType(String contType);
GrantFundTypeEnum transGrantType(String grantType);
RepayMethodEnum transRepayMethod(String repayMethod);
PeriodTypeEnum transPeriodType(String periodType);
RateTypeEnum transRateType(String rateType);
}
\ No newline at end of file
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.shared.astclient.wkloan.adapter;
import com.abssqr.plat.biz.shared.astclient.base.FieldTranslator;
import com.abssqr.plat.common.facade.enums.AstContractTypeEnum;
import com.abssqr.plat.common.facade.enums.AstTypeEnum;
import com.abssqr.plat.common.facade.enums.CommonErrorCodeEnum;
import com.abssqr.plat.common.facade.enums.GrantFundTypeEnum;
import com.abssqr.plat.common.facade.enums.LoanStatusEnum;
import com.abssqr.plat.common.facade.enums.LoanTypeEnum;
import com.abssqr.plat.common.facade.enums.PeriodTypeEnum;
import com.abssqr.plat.common.facade.enums.RateTypeEnum;
import com.abssqr.plat.common.facade.enums.RepayMethodEnum;
import com.abssqr.plat.common.model.exception.AbssqrBizException;
import com.general.system.common.util.MessageUtil;
import com.google.common.collect.Lists;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* 字段转译组装工具
* @author zhenxuan.luo
* @version com.abssqr.plat.biz.shared.astclient.wkloan.adapter: WkFieldTranslater.java, v 0.1 2019-06-14 18:28 zhenxuan.luo Exp $
*/
@Component
public class WkFieldTranslator implements FieldTranslator {
/**
* 五矿资产状态转换
* @param statusFields
* @return
*/
@Override
public LoanStatusEnum transAstStatus(String... statusFields) {
String status = statusFields[0];
String form = statusFields[1];
List<String> acptStatus = Lists.newArrayList("2", "3", "5", "6");
if (!acptStatus.contains(status)) {
throw new AbssqrBizException(MessageUtil.formatMsg("不支持的贷款状态[{0}]", status),
CommonErrorCodeEnum.INVALID_PARAM, false);
}
if (StringUtils.equals("6", status)) {
// 已结清
return LoanStatusEnum.CLEAR;
} else if (StringUtils.equals("3", status)) {
// 已取消
return LoanStatusEnum.REVERSE;
} else {
switch (form) {
case "1":
return LoanStatusEnum.NORMAL;
case "2":
return LoanStatusEnum.OVERDUE;
case "5":
return LoanStatusEnum.NORMAL;
default:
throw new AbssqrBizException(MessageUtil.formatMsg("不支持的贷款形态[{0}]", form),
CommonErrorCodeEnum.INVALID_PARAM, false);
}
}
}
@Override
public LoanStatusEnum transTermStatus(String termStatus) {
switch (termStatus) {
case "1":
return LoanStatusEnum.NORMAL;
case "2":
return LoanStatusEnum.OVERDUE;
case "3":
return LoanStatusEnum.REVERSE;
case "4":
return LoanStatusEnum.CANCEL;
case "5":
return LoanStatusEnum.CLEAR;
case "6":
return LoanStatusEnum.NORMAL;
default:
throw new AbssqrBizException(MessageUtil.formatMsg("不支持的分期形态[{0}]", termStatus),
CommonErrorCodeEnum.INVALID_PARAM, false);
}
}
@Override
public LoanTypeEnum transLoanType(String loanType) {
if (StringUtils.isBlank(loanType)) {
return LoanTypeEnum.LT03;
}
return LoanTypeEnum.getByCode(loanType);
}
@Override
public AstTypeEnum transAstType(String astType) {
return AstTypeEnum.LOAN;
}
@Override
public AstContractTypeEnum transContType(String contType) {
return AstContractTypeEnum.CT01;
}
@Override
public GrantFundTypeEnum transGrantType(String grantType) {
return GrantFundTypeEnum.CT01;
}
@Override
public RepayMethodEnum transRepayMethod(String repayMethod) {
if (StringUtils.isBlank(repayMethod)) {
return RepayMethodEnum.RM02;
}
switch (repayMethod) {
case "01":
return RepayMethodEnum.RM02;
case "02":
return RepayMethodEnum.RM01;
// case "1":
// return RepayMethodEnum.RM02;
// case "2":
// return RepayMethodEnum.RM01;
}
throw new AbssqrBizException(MessageUtil.formatMsg("不支持的还款方式[{0}]", repayMethod),
CommonErrorCodeEnum.INVALID_PARAM, false);
}
@Override
public PeriodTypeEnum transPeriodType(String periodType) {
if (StringUtils.isBlank(periodType)) {
return PeriodTypeEnum.Month;
}
return PeriodTypeEnum.getByCode(periodType);
}
@Override
public RateTypeEnum transRateType(String rateType) {
if (StringUtils.isBlank(rateType)) {
return RateTypeEnum.RT02;
}
switch (rateType) {
case "10":
return RateTypeEnum.RT01;
case "20":
return RateTypeEnum.RT02;
case "30":
return RateTypeEnum.RT03;
default:
throw new AbssqrBizException(MessageUtil.formatMsg("不支持的利率类型[{0}]", rateType),
CommonErrorCodeEnum.INVALID_PARAM, false);
}
}
}
\ No newline at end of file
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.shared.astclient.wkloan.adapter;
import com.abssqr.plat.biz.shared.astclient.wkloan.entity.WkMfsLoanEntity;
import com.abssqr.plat.common.dal.sync.auto.dao.WkMfsLnPactDAO;
import com.abssqr.plat.common.dal.sync.auto.dao.WkMfsOpenRepayDAO;
import com.abssqr.plat.common.dal.sync.auto.dao.WkMfsRepayInfoDAO;
import com.abssqr.plat.common.dal.sync.auto.dao.WkMfsRepayPlanDAO;
import com.abssqr.plat.common.dal.sync.auto.dataobject.WkMfsDueBillDO;
import com.abssqr.plat.common.model.wk.domain.sync.WkMfsSyncCtr;
import com.abssqr.plat.common.util.base.autoconfig.AbsConfig;
import com.abssqr.plat.core.service.wk.ast.sync.WkMfsAstManager;
import com.general.system.common.util.DateTimeUtil;
import com.general.system.common.util.VarChecker;
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.astclient.wkloan.adapter: WkAstAssemply.java, v 0.1 2019-06-14 01:35 zhenxuan
* .luo Exp $
*/
@Component
public class WkMfsAstAssembly {
@Autowired
WkMfsAstManager wkMfsAstManager;
@Autowired
WkMfsOpenRepayDAO wkMfsOpenRepayDAO;
@Autowired
WkMfsLnPactDAO wkMfsLnPactDAO;
@Autowired
WkMfsRepayInfoDAO wkMfsRepayInfoDAO;
@Autowired
WkMfsRepayPlanDAO wkMfsRepayPlanDAO;
@Autowired
AbsConfig absConfig;
/**
* 组装原始数据
* @param ctrl
* @return
*/
public WkMfsLoanEntity assembly(WkMfsSyncCtr ctrl) {
WkMfsLoanEntity wkLoanEntity = new WkMfsLoanEntity();
Date syncDate = DateTimeUtil.getStandardDate(ctrl.getAbsSyncDate());
WkMfsDueBillDO wkMfsDueBillDO = wkMfsAstManager.getWkMfsDueBillDO(ctrl);
VarChecker.checkNotNull(wkMfsDueBillDO, "五矿资产同步[{0}]找不到对应的借据信息", ctrl);
wkLoanEntity.setOutAstNo(wkMfsDueBillDO.getLoanId());
wkLoanEntity.setManagerOrgCode(wkMfsDueBillDO.getOrgNo());
wkLoanEntity.setLenderOrgCode(wkMfsDueBillDO.getProjNo());
wkLoanEntity.setAccountDate(DateTimeUtil.addDays(syncDate, -1));
wkLoanEntity.setSyncDate(syncDate);
wkLoanEntity.setProdNo(wkMfsDueBillDO.getProductId());
wkLoanEntity.setWkMfsDueBillDO(wkMfsDueBillDO);
wkLoanEntity.setWkMfsRepayPlanDOS(wkMfsAstManager.getWkMfsRepayPlanDOS(ctrl));
wkLoanEntity.setWkMfsLnPactDO(wkMfsAstManager.getWkMfsLnPactDO(ctrl));
wkLoanEntity.setWkMfsOpenRepayDO(wkMfsAstManager.getWkMfsOpenRepayDO(ctrl));
wkLoanEntity.setWkMfsRepayInfoDOS(wkMfsAstManager.getWkMfsRepayInfoDOS(ctrl));
wkLoanEntity.check(ctrl.getLoanId(), DateTimeUtil.formatYMD(wkLoanEntity.getAccountDate()));
return wkLoanEntity;
}
/**
* 同步数据到业务库中 便于做数据订正
* @param ctrl
*/
public void syncData2Local(WkMfsSyncCtr ctrl){
wkMfsAstManager.syncData2Local(ctrl);
}
}
\ No newline at end of file
/**
* abssqr.com Inc.
* Copyright (c) 2017-2019 All Rights Reserved.
*/
package com.abssqr.plat.biz.shared.astclient.wkloan.entity;
import cn.hutool.core.util.NumberUtil;
import com.abssqr.plat.common.dal.sync.auto.dataobject.WkMfsDueBillDO;
import com.abssqr.plat.common.dal.sync.auto.dataobject.WkMfsLnPactDO;
import com.abssqr.plat.common.dal.sync.auto.dataobject.WkMfsOpenRepayDO;
import com.abssqr.plat.common.dal.sync.auto.dataobject.WkMfsRepayInfoDO;
import com.abssqr.plat.common.dal.sync.auto.dataobject.WkMfsRepayPlanDO;
import com.abssqr.plat.common.model.domain.astSync.BaseAstEntity;
import com.general.system.common.util.StringUtil;
import com.general.system.common.util.VarChecker;
import com.google.common.collect.Lists;
import org.apache.commons.collections.CollectionUtils;
import java.math.BigDecimal;
import java.util.List;
import java.util.stream.Collectors;
/**
*
* @author zhenxuan.luo
* @version com.abssqr.plat.biz.shared.astclient.wkloan.entity: WkLoan.java, v 0.1 2019-06-07 04:26 zhenxuan.luo Exp $
*/
public class WkMfsLoanEntity extends BaseAstEntity {
/**
* 借据
*/
private WkMfsDueBillDO wkMfsDueBillDO;
/**
* 还款计划
*/
private List<WkMfsRepayPlanDO> wkMfsRepayPlanDOS = Lists.newArrayList();
/**
* 合同
*/
private WkMfsLnPactDO wkMfsLnPactDO;
/**
* 放款信息
*/
private WkMfsOpenRepayDO wkMfsOpenRepayDO;
/**
* 还款信息
*/
private List<WkMfsRepayInfoDO> wkMfsRepayInfoDOS = Lists.newArrayList();
public void check(String loanId, String curDt) {
VarChecker.checkNotNull(this.wkMfsDueBillDO, "[{0}]数据模型同步:账单数据为空", loanId);
VarChecker.checkArgument(CollectionUtils.isNotEmpty(this.wkMfsRepayPlanDOS),
"[{0}]数据模型同步:还款计划为空", loanId);
if (CollectionUtils.isNotEmpty(wkMfsRepayInfoDOS)) {
List<WkMfsRepayInfoDO> curRepayInfos = wkMfsRepayInfoDOS.stream()
.filter(item -> StringUtil.equals(curDt, item.getCurDate()))
.collect(Collectors.toList());
for (WkMfsRepayInfoDO curRepayInfo : curRepayInfos) {
BigDecimal incomeAmt = curRepayInfo.getIncomeAmt();
BigDecimal checkIncomeAmt = NumberUtil.add(
curRepayInfo.getPrinAmt(),
curRepayInfo.getTrustIntAmtAcc(),
curRepayInfo.getTrustPnltIntAmtAcc(),
curRepayInfo.getTrustRepayViolateAmtAcc());
VarChecker.checkArgument(incomeAmt.compareTo(checkIncomeAmt) == 0,
"[{0}]数据模型同步:还款流水总实收[{1}]和各项金额[{2}]不相等",
loanId, incomeAmt, checkIncomeAmt);
}
}
}
public WkMfsDueBillDO getWkMfsDueBillDO() {
return wkMfsDueBillDO;
}
public void setWkMfsDueBillDO(WkMfsDueBillDO wkMfsDueBillDO) {
this.wkMfsDueBillDO = wkMfsDueBillDO;
}
public List<WkMfsRepayPlanDO> getWkMfsRepayPlanDOS() {
return wkMfsRepayPlanDOS;
}
public void setWkMfsRepayPlanDOS(
List<WkMfsRepayPlanDO> wkMfsRepayPlanDOS) {
this.wkMfsRepayPlanDOS = wkMfsRepayPlanDOS;
}
public WkMfsLnPactDO getWkMfsLnPactDO() {
return wkMfsLnPactDO;
}
public void setWkMfsLnPactDO(WkMfsLnPactDO wkMfsLnPactDO) {
this.wkMfsLnPactDO = wkMfsLnPactDO;
}
public WkMfsOpenRepayDO getWkMfsOpenRepayDO() {
return wkMfsOpenRepayDO;
}
public void setWkMfsOpenRepayDO(WkMfsOpenRepayDO wkMfsOpenRepayDO) {
this.wkMfsOpenRepayDO = wkMfsOpenRepayDO;
}
public List<WkMfsRepayInfoDO> getWkMfsRepayInfoDOS() {
return wkMfsRepayInfoDOS;
}
public void setWkMfsRepayInfoDOS(
List<WkMfsRepayInfoDO> wkMfsRepayInfoDOS) {
this.wkMfsRepayInfoDOS = wkMfsRepayInfoDOS;
}
}
\ 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