Java微服务系统项目技术栈总结
Common:
1.RetryPolicyFactory 重試工廠類
2.SpringCtxUtils spring上下文工廠類
3.SleuthMyBatisPluginTraceInterceptor 服務(wù)鏈路追蹤(Spring Cloud Sleuth)
4.RequestValidator 請(qǐng)求參數(shù)校驗(yàn)
5.UUIDGenerator UUID生成器
6.ThreadPoolUtil 線程池
/*線程池的最大線程數(shù)量/
private static final int MAX_THREAD = 100;
/*線程池的最大等待隊(duì)列數(shù)量/
private static final int MAX_QUEUE = 1000;
//拒絕策略
RejectedExecutionHandler handler = new CallerRunsPolicy();
threadPool = new ThreadPoolExecutor(MAX_THREAD, MAX_THREAD,
30L, TimeUnit.SECONDS,
new LinkedBlockingQueue(MAX_QUEUE),
Executors.defaultThreadFactory(),
handler);
7.ReflectHelper 反射幫助類
getKeyAndValue() 把請(qǐng)求參數(shù)解析成map
8.PasswordUtil 密碼相關(guān)
9.millis 耗時(shí)
10.DateUtils 日期時(shí)間類
11.BeanCopy 未用到
12.ApolloConfigListener 阿波羅配置監(jiān)聽器?
13.OSinfo 操作系統(tǒng)相關(guān)信息
14.MoneyUtil 金額操作
15.NumberUtil 獲取隨機(jī)數(shù)字
16.HandleFileUtils 讀取文件
17.FileTools 文件工具
18.EventBus 允許組件之間通過發(fā)布-訂閱進(jìn)行通信,而不需要組件之間顯示的注冊(cè)。它專門設(shè)計(jì)為了代替使用顯示注冊(cè)的傳統(tǒng)的Java進(jìn)程內(nèi)事件分發(fā)。它不是通用的發(fā)布-訂閱系統(tǒng),也不是用于進(jìn)程間通信的。優(yōu)點(diǎn):簡(jiǎn)化組件之間的通信。是發(fā)布者和訂閱之間解耦,同時(shí)避免了復(fù)雜且容易出錯(cuò)的依賴性和生命周期問題。使代碼更加簡(jiǎn)潔
19.EventbusPublisher 的實(shí)現(xiàn)描述:發(fā)布異步消息
20.@PostConstruct 注解的用途: 在當(dāng)前對(duì)象加載完依賴注入的 bean 后,運(yùn)行這個(gè)被 @PostConstruct 注解的方法,而且只運(yùn)行一次。
21.Signature 簽名
22.Cache redis接口
23.SETEX key seconds value SET key value EXPIRE key seconds # 設(shè)置生存時(shí)間 含義(setex = set expire)
24.SETNX key value 含義(setnx = SET if Not eXists):
25.Collections.singletonList被限定只被分配一個(gè)內(nèi)存空間,也就是只能存放一個(gè)元素的內(nèi)容
26.RedisCache 對(duì)redis的操作
27.創(chuàng)建redis池
public JedisPool jedisPool() {
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxWaitMillis(maxWaitMillis);
poolConfig.setMaxTotal(maxTotal);
poolConfig.setMinIdle(minIdle);
poolConfig.setMaxIdle(maxIdle);
poolConfig.setTestOnBorrow(testOnBorrow);
return new JedisPool(poolConfig, address, port, timeout, password);
}
28. 加鎖執(zhí)行并且回調(diào)
try {
//RequestValidator.validate(req);
resp = lock.lockAndExecute(req.getRepayPlanNo(), req.get_requestId(), new LockExecuteCallback() {
@SuppressWarnings(“unchecked”)
@Override
public BaseRespDto doBusiness() {
BaseRespDto resp1 = repayService.applyRepay(req);
return resp1;
}
});
29.LOCK_EXPIRE_SECONDS = 5 * 60;
30.一秒鐘最多嘗試十次
long timeout = System.currentTimeMillis() + 1000;
long sleepInterval = 100;//這個(gè)又是什么作用
//在一秒鐘之內(nèi)每隔0.1秒獲取一次鎖
while (System.currentTimeMillis() <= timeout) {
Boolean success = redisCache.lock(new StringBuffer(RedisLock.LOCK).append(operateNo).toString(), new StringBuffer(_requestId).append(RedisLock.LOCK_SPLIT).append(operateNo).toString(), expire);
if (success) {
return true;
}
try {
Thread.sleep(sleepInterval);
} catch (InterruptedException e) {
}
}
31.ConvertBeanUtil Bean 對(duì)象屬性copy Util
32.
- POJO :plain ordinary java object 無(wú)規(guī)則簡(jiǎn)單java對(duì)象
- BO:business object 業(yè)務(wù)對(duì)象
- VO:value object 值對(duì)象 / view object 表現(xiàn)層對(duì)象
- DTO(TO):Data Transfer Object 數(shù)據(jù)傳輸對(duì)象
- DAO:data access object數(shù)據(jù)訪問對(duì)象
33.ExceptionHandler 異常的拋出都要封裝一下
ops
34.application.properties
spring.application.name=fjy-ops
mybatis.logger=io.jiayan.fjy.ops.dao
logging.path=/alidata1/apphome/logs
logging.level=INFO
max.history=300
35.jdbc.xml 之前從來(lái)沒有仔細(xì)看過這個(gè)文件的配置 這個(gè)文件要怎么被spring加載?
這里配置了mapper的位置
classpath*:/mybatis/sqlmap//.xml
classpath:/mybatis/sqlmapExt//*.xml
配置隔離級(jí)別和傳播類型
36.applicationContext-service.xml 加載 DicCacheManager
37.DicCacheManager implements ApplicationListener 數(shù)據(jù)字典
從application中獲得實(shí)例,再調(diào)用方法,查詢放在緩(了解spring的原理還是重要的,否則不會(huì)理解這個(gè)做法的,不會(huì)看懂這個(gè)代碼的意思的,application是干什么的都不知道)
public void onApplicationEvent(ApplicationReadyEvent event) {
ApplicationContext applicationContext = event.getApplicationContext();
dictionariesService = applicationContext.getBean(DictionariesService.class);
List opsDictionariesDOListAll = dictionariesService.queryOpsDictionariesDOListAll();
if (opsDictionariesDOListAll == null || opsDictionariesDOListAll.size() == 0) {
return;
}
}
38.app.properties app.id=fjy-ops
39.過濾器
SessionFilter 封裝,不需要登錄過濾的list列表
RequestHolder 存放登錄相關(guān)緩存
CorsFilter
40.@FeignClient(value = “fjy-chain”, url=“${chainFeignClient.url}”)
41.@Api是Swagger的注解。該注解用于Controller類上,表示對(duì)類的說(shuō)明
42.@ApiOperation是Swagger包中的一種注解使用@ApiOperation注解用來(lái)描述我們寫的接口。ApiOperation 注解提供了豐富的屬性來(lái)允許我們自定義接口描述信息,包括接口名稱,接口所屬分組等
43.@AllArgsConstructor 它是lombok中的注解,作用在類上;使用后添加一個(gè)構(gòu)造函數(shù),該構(gòu)造函數(shù)含有所有已聲明字段屬性參數(shù)
44.@Data注解在類上時(shí),簡(jiǎn)化java代碼編寫,為該類提供讀寫屬性。簡(jiǎn)單來(lái)說(shuō)就是不用再手動(dòng)添加構(gòu)造方法和get/set等方法了
45.BaseDto implements Serializable, Cloneable 提供toString fromJson toJson clone 方法
46.BaseRespDto extends BaseDto 包含resultCode-業(yè)務(wù)應(yīng)答碼 resultMessage-業(yè)務(wù)應(yīng)答信息字段
47.BaseReqDto extends BaseDto 只包含請(qǐng)求流水號(hào) private String _requestId = UUID.randomUUID().toString().replace(“-”, “”);
48.Constant 常數(shù); 常量 干java這么久了,現(xiàn)在才知道這個(gè)單詞的意思
49.Feign是Netflix開源的一個(gè)REST客戶端,通過定義接口,使用注解的方式描述接口的信息,就可以發(fā)起接口調(diào)用。
50.ProceedingJoinPoint 過程連接點(diǎn)
51.Dto還有 BasePlatformOperateReqDto BaseCorpOperateReqDto 的區(qū)分
52.BizImplProxy 統(tǒng)一對(duì)Api層進(jìn)行異常處理和日志記錄 @Pointcut(“execution(* io.jiayan.fjy.ops.api.Ops*.*(…))”) OpsAssetRegisterApiImpl
53.Config
Trans
54.app.properties app.id=fjy-trans
55.logback.xml 只需配置好 log.dir 和 projectname 屬性
56.application.properties
spring.application.name=fjy-trans
mybatis.logger=io.jiayan.fjy.trans.dao
logging.path=/alidata1/apphome/logs
logging.level=INFO
max.history=300
server.port=8082
57.DtoUtils DO到Dto的轉(zhuǎn)化
58.RespUtils 返回對(duì)象組裝
59.TransUtils 請(qǐng)求信息組裝等
60.spring提供的TransactionTemplate 工具類來(lái)控制細(xì)粒度事務(wù)
//一個(gè)sql為什么要加事務(wù)
transactionTemplate.execute(new TransactionCallback() {
@Override
public Boolean doInTransaction(TransactionStatus status) {
upperChainRecordDOMapperExt.updateByPrimaryKeySelective(item);
return Boolean.TRUE;
}
});
61.Handler 就是處理器
62.AbstractHandler 這個(gè)抽象類就寫的很高深 這么多交易處理器是干什么的?
63.以ApplyIssueQuotaTransHandler為例,其run方法被AbstractHandler的internalHandle方法調(diào)用,internalHandle 又被 RetryJobTask.getBaseRespDto 和 AbstractHandler.handled調(diào)用
64.handle可以手動(dòng)調(diào)用,也可以批處理執(zhí)行
65.批處理:task,都繼承AbstractTask
User
66.Config多了,阿波羅的和xxljob的配置
67.資產(chǎn):1.資產(chǎn)登記 2.資產(chǎn)編輯 3.應(yīng)收/應(yīng)付資產(chǎn)列表查詢 4.資產(chǎn)詳情查詢 5.資產(chǎn)作廢 6.資產(chǎn)交易控制 7.修改資產(chǎn)hash信息 8.修改資產(chǎn)交易狀態(tài)
68. 線程數(shù)計(jì)算用的是 AtomicInteger,緩存隊(duì)列是LinkedBlockingQueue
public void init() {
executor = new ThreadPoolExecutor(30, 30, 0l, TimeUnit.MILLISECONDS, new LinkedBlockingQueue(10000),
new ThreadFactory() {
private AtomicInteger index = new AtomicInteger(0);
private static final ThreadLocal<ConcurrentHashMap<String, ConcurrentHashMap<String, Object>>> threadLocal = new ThreadLocal<ConcurrentHashMap<String, ConcurrentHashMap<String, Object>>>();
ConcurrentHashMap<String, ConcurrentHashMap<String, Object>> outMap = new ConcurrentHashMap<String, ConcurrentHashMap<String, Object>>(); outMap.put(operateNo, innerMap);
70.可以改進(jìn)的地方:(1)if else會(huì)增加代碼的耦合度,以衛(wèi)語(yǔ)句取代嵌套的條件表達(dá)式。應(yīng)該會(huì)策略模式代替 (2)長(zhǎng)參數(shù)列表(一旦參數(shù)列表變得很長(zhǎng),作為普通人,我們就很難對(duì)這些內(nèi)容進(jìn)行把控了)可以做的就是將這些參數(shù)封裝成一個(gè)類,一個(gè)創(chuàng)建作品的參數(shù)類這樣一來(lái),這個(gè)函數(shù)參數(shù)列表就只剩下一個(gè)參數(shù)了,一個(gè)長(zhǎng)參數(shù)列表就消除了。
71.TransactionTemplate的編程式事務(wù)管理是使用模板方法設(shè)計(jì)模式對(duì)原始事務(wù)管理方式的封裝
72. 這個(gè)才能看出事務(wù)的優(yōu)勢(shì)
Boolean flag = transactionTemplate.execute(status -> {
//更新邀請(qǐng)碼狀態(tài)
corpInviteCodeService.changeCorpInviteCodeStatus(modifyStatus);
//新增企業(yè)
CorpDto respDto = corpService.addCorp(addCorp);
//新增用戶
record.setCorpNo(respDto.getCorpNo());
corpOperDOMapperExt.insertSelective(record);
// send notice
addNoticeReq.setReceiverCorpNo(respDto.getCorpNo());
messageService.addNotice(addNoticeReq);
73.注冊(cè):1.參數(shù)判空 2.郵箱格式校驗(yàn) 3.驗(yàn)證碼校驗(yàn) 4.登錄名是否存在校驗(yàn) 5.企業(yè)名稱是否存在校驗(yàn) 6.邀請(qǐng)碼校驗(yàn)(1)邀請(qǐng)碼是否存在 (2)邀請(qǐng)碼是否和企業(yè)匹配 (3)邀請(qǐng)碼是否失效 (4)邀請(qǐng)碼是否已被使用 7.生成操作員號(hào)operNo 8.綁定動(dòng)態(tài)碼(參數(shù)是json.setOperNo(operNo)) 8.生成秘鑰bindGoogle.getData().getSecretKey();9.更新邀請(qǐng)碼狀態(tài) 10.新增企業(yè),新增用戶
74.發(fā)送通知:消息模板參數(shù):手機(jī)號(hào)碼,業(yè)務(wù)類型,企業(yè)名稱,登錄名,原因,發(fā)起方,接收方,(1)檢查消息模板參數(shù)是否存在 (2)插入消息 (3)把消息參數(shù)解析成KV結(jié)構(gòu) (4)替換模板中的占位符 (5)插入數(shù)據(jù)庫(kù),發(fā)送站內(nèi)信,發(fā)送短信 (6)發(fā)送狀態(tài):生成業(yè)務(wù)通知時(shí)待發(fā)送,生成公告時(shí)是發(fā)送中,
75.登錄:createUserToken(1)判斷用戶名密碼是否正確(查詢用戶信息是否存在),用戶名或密碼不正確,用登錄作參數(shù) (2)校驗(yàn)密碼 (3)驗(yàn)證安全碼 (4)返回權(quán)限列表
76.登出:刪除緩存,清空緩存
77.重置密碼:1.參數(shù)校驗(yàn) 2.兩次輸入密碼校驗(yàn) 3.操作員賬號(hào)校驗(yàn) 4.驗(yàn)證碼校驗(yàn)
78.修改密碼:1.參數(shù)校驗(yàn) 2.新密碼和舊密碼校驗(yàn) 3.新密碼兩次輸入校驗(yàn) 4.獲取用戶信息 5.根據(jù)用戶信息查詢舊密碼,驗(yàn)證舊密碼 6.執(zhí)行修改
79.賬戶管理:不是這個(gè)賬戶管理 鏈屬企業(yè)賬戶管理 核心企業(yè)賬戶管理 資金方回收賬戶管理 資金方融資賬 根據(jù)企業(yè)編號(hào),查詢token信息
角色管理
80.查詢系統(tǒng)角色列表 (1)校驗(yàn)用戶是否登錄(2)根據(jù)登錄信息獲得企業(yè)編號(hào),角色類型 (3)查詢角色列表(角色名稱,狀態(tài),角色用戶)(4)查詢權(quán)限列表(權(quán)限編號(hào),權(quán)限名稱)
81.||新增角色 (1)創(chuàng)建并設(shè)置角色編號(hào)(2)獲取登錄信息,設(shè)置企業(yè)編號(hào),角色類型(3)角色是否重復(fù)校驗(yàn)(4)執(zhí)行插入
82.||修改角色 (1)用角色I(xiàn)D查詢角色是否存在 (2) 用角色名稱查詢覺得是否存在(3)刪除角色對(duì)應(yīng)的權(quán)限列表并且新增新的權(quán)限列表 (4)更新角色表
83.||禁用/啟動(dòng)角色 (其實(shí)就是修改角色狀態(tài))(1)查詢角色信息 (2)校驗(yàn)角色狀態(tài),狀態(tài)相同不允許修改 (3)修改
84.||刪除角色 (1)查詢角色信息 (2)校驗(yàn)角色用戶信息是否為空,如果不為空不能刪除 (3)執(zhí)行刪除操作
||新增角色用戶 (1)查詢角色信息 (2)角色狀態(tài)校驗(yàn)未生效狀態(tài)不允許增加用戶 (3)驗(yàn)證所新增角色是否存在,如果存在,返回該賬號(hào)已被使用 (4)新增操作 (5)發(fā)送信息
85.||刪除角色用戶(1)根據(jù)角色用戶ID查詢用戶信息是否存在 (2)刪除信息
權(quán)限管理
86.新增權(quán)限 (1)生成權(quán)限編號(hào)(2)直接新增
87.獲取權(quán)限列表 直接分頁(yè)查詢,校驗(yàn)都沒有
企業(yè)注冊(cè)
88.分頁(yè)獲取邀請(qǐng)碼列表 直接查詢,字段:id,邀請(qǐng)碼,企業(yè)類型,企業(yè)名稱,聯(lián)系人,過期時(shí)間,狀態(tài)
89.查詢邀請(qǐng)碼 (1)查詢邀請(qǐng)碼,參數(shù)(邀請(qǐng)碼,被邀請(qǐng)企業(yè)名稱)
90.生成邀請(qǐng)碼 (1)邀請(qǐng)碼相關(guān)信息入庫(kù) (2)發(fā)送信息
91.修改邀請(qǐng)碼狀態(tài) (1)無(wú)需校驗(yàn),直接修改 UNUSED-未使用,USED-已使用,INVALID-已失效
92.分頁(yè)獲取企業(yè)列表 (1)直接查詢企業(yè)信息,查詢參數(shù):企業(yè)編號(hào),狀態(tài)(INIT-初始無(wú)信息, FREEZE-審核凍結(jié), VALID-有效, INVALID-失效),流程狀態(tài)(INIT-初始無(wú)信息, FREEZE-審核凍結(jié), VALID-有效, INVALID-失效),增信狀態(tài)(VALID-有效;INVALID-失效),企業(yè)類型,企業(yè)名稱。返回值:企業(yè)名稱,企業(yè)類型,企業(yè)編號(hào),主賬號(hào)名稱,狀態(tài),流程狀態(tài),增信狀態(tài),企業(yè)認(rèn)證時(shí)間
93.平臺(tái)方分頁(yè)獲取企業(yè)審核列表(1)
94.平臺(tái)查詢企業(yè)審核信息(1)
95.查詢企業(yè)(1)
96.查詢企業(yè)詳情(1)
97.新增企業(yè)(1)創(chuàng)建企業(yè)編號(hào) (2)設(shè)置企業(yè)編號(hào),狀態(tài) (3)執(zhí)行插入
98.更新企業(yè) (1)直接更新沒有校驗(yàn)
99.新增企業(yè)信息(1)校驗(yàn)企業(yè)是存在 (2)校驗(yàn)企業(yè)名稱(3)執(zhí)行插入
100.修改企業(yè)信息(1)和新增邏輯差不多
101.發(fā)送短信(1)和發(fā)送通知邏輯一樣
資產(chǎn)管理
102.資產(chǎn)登記(1)冪等處理,合同編號(hào)重復(fù)性校驗(yàn) (2)從請(qǐng)求頭獲取當(dāng)前登陸用戶及企業(yè)信息 (3)業(yè)務(wù)檢查(查詢企業(yè)信息,查詢企業(yè)詳情,查詢企業(yè)狀態(tài),校驗(yàn)應(yīng)收方和應(yīng)付方不能一樣)(4)獲取應(yīng)收和應(yīng)付方企業(yè)信息(5)封裝資產(chǎn)數(shù)據(jù) (6)封裝資產(chǎn)附件數(shù)據(jù) (7)數(shù)據(jù)入庫(kù)
103.資產(chǎn)編輯(1)查看要編輯的資產(chǎn)是否存在 (2)從請(qǐng)求頭獲取當(dāng)前登陸用戶及企業(yè)信息 (3)控制編輯操作只能資產(chǎn)登記方的企業(yè)才能進(jìn)行編輯 (4)控制編輯操作只能在沒有產(chǎn)生交易的情況下才能進(jìn)行編輯 (5)業(yè)務(wù)檢查 (6)獲取企業(yè)信息 (7)資產(chǎn)主數(shù)據(jù)入庫(kù) (8)刪除編輯刪除的數(shù)據(jù) (9)附件數(shù)據(jù)入庫(kù) (10)刪除原來(lái)的文件記錄 (11)添加新的文件
104.應(yīng)收/應(yīng)付資產(chǎn)列表查詢(1)獲取當(dāng)前用戶信息 2.查金額>0的資產(chǎn)
105.資產(chǎn)詳情查詢(1)查詢資產(chǎn)主表數(shù)據(jù) (2)查詢資產(chǎn)附件
106.資產(chǎn)作廢(1)獲取當(dāng)前用戶信息 (2)檢查企業(yè)狀態(tài)是否正常 (3)控制編輯操作只能資產(chǎn)登記方的企業(yè)才能進(jìn)行作廢 (4)控制編輯操作只能在沒有產(chǎn)生交易的情況下才能進(jìn)行作廢 (5)執(zhí)行更新操作
107.資產(chǎn)交易控制 這里有用到lock,為什么這里會(huì)用到鎖,有涉及到并發(fā)嗎?
RequestValidator.validate(req);
resp = lock.lockAndExecute(req.getAssetNo(), req.get_requestId(), new LockExecuteCallback() {
@SuppressWarnings(“unchecked”)
@Override
public BaseRespDto doBusiness() {
BaseRespDto resp1 = assetRegisterService.transControl(req);
return resp1;
(1)冪等校驗(yàn),查詢交易信息 (2)從請(qǐng)求頭獲取當(dāng)前登陸用戶及企業(yè)信息 (3)基本業(yè)務(wù)校驗(yàn),資產(chǎn)編號(hào)查詢資產(chǎn)表信息 (4)交易請(qǐng)求入表transReqDOMapperExt.insertSelective(transReq); (5)交易入表 assetDOMapperExt.updateByPrimaryKeySelectiveUseLock(assetDO);
108.修改資產(chǎn)hash信息(1)查詢是否存在資產(chǎn)記錄 (2)確認(rèn)資產(chǎn)是否已上鏈 (3)執(zhí)行修改
109.修改資產(chǎn)交易狀態(tài)(1)冪等校驗(yàn),查詢是否存在資產(chǎn)交易信息 (2)從請(qǐng)求頭獲取當(dāng)前登陸用戶及企業(yè)信息 (3)資產(chǎn)編號(hào)查詢資產(chǎn)信息是否存在 (4)更新操作
110.費(fèi)率維護(hù)
費(fèi)率類型 (單一/階梯) 費(fèi)率(大于 0,小于 100,保留小數(shù)點(diǎn)后
四位) 計(jì)費(fèi)方式(年/月/日(單利)) 融資比例(0-100%,整數(shù)) 生效日期(可設(shè)置某一時(shí)間生效) 處理日期(流程最后處理人處理的日期) 維護(hù)內(nèi)容(費(fèi)率類型/收費(fèi)方式/費(fèi)率/計(jì)費(fèi)方
式/融資比例) 更新前(更新前的狀態(tài)或金額) 更新后(更新后的狀態(tài)或金額) 處理結(jié)果(通過/拒絕) 經(jīng)辦 ID
待辦
111.queryTodoTaskCount 查詢待辦任務(wù)總數(shù) (1)緩存獲得登錄信息,校驗(yàn)與參數(shù)是否一致(2)注冊(cè)審核、授信審批、簽發(fā)審核、融資審批、兌付審核
112.queryUndoTaskCount
113.報(bào)表(1)遠(yuǎn)期兌付報(bào)表 近期兌付報(bào)表 (2)查詢和下載功能
114.Ereka(1)
115.xxl-job(1)
116.apollo(1)
117.業(yè)務(wù)架構(gòu)圖
118.應(yīng)用架構(gòu)圖
119.交互層 基于nodejs+vue的前端PC網(wǎng)站,同時(shí)支持調(diào)用CFCA控件讀取Ukey信息
120.接入層 運(yùn)營(yíng)前置管理會(huì)話,調(diào)用交易核心及其他接口;
121.
1)業(yè)務(wù)層 運(yùn)營(yíng)管理
(1)安全管理
注冊(cè):
登錄:
忘記密碼:
修改密碼:
修改郵箱:
動(dòng)態(tài)碼管理:
ukey管理:
(2)權(quán)限管理
基于企業(yè)-角色-菜單的權(quán)限管理;
基于賬戶-角色-按鈕的權(quán)限管理;
2)基礎(chǔ)業(yè)務(wù)
(1)用戶系統(tǒng)
企業(yè)管理及審核:企業(yè)新增、企業(yè)信息審核
銀行卡管理及審核:銀行卡新增、銀行卡審核
邀請(qǐng)碼管理:邀請(qǐng)碼生成,邀請(qǐng)碼驗(yàn)證
融資產(chǎn)品管理:融資產(chǎn)品配置,支持資金方自定義地區(qū)、還款方式、利率等各種的融資產(chǎn)品;
平臺(tái)服務(wù)費(fèi)管理:平臺(tái)服務(wù)費(fèi)配置
站內(nèi)信:站內(nèi)信模板配置,站內(nèi)信發(fā)送
郵件服務(wù):郵件模板配置,郵件發(fā)送
(2)通證系統(tǒng)
通證生成:
通證簽發(fā):
通證轉(zhuǎn)讓:
通證凍結(jié):
通證解凍:
通證解凍并扣減;
通證收回:
(3)資產(chǎn)系統(tǒng)
應(yīng)收資產(chǎn)登記;
應(yīng)付資產(chǎn)登記:
(4)合約系統(tǒng)
合約生成:
合約確認(rèn):
3)交易核心
(1)審批
基于用戶-賬戶-角色的通用審批流程,支持自動(dòng)重試補(bǔ)償;
(2)開戶
核心企業(yè)、鏈屬企業(yè)、資金方注冊(cè),平臺(tái)審核通過后,新增企業(yè)用戶;
(3)授信
資金方根據(jù)企業(yè)基本信息、企業(yè)增信等進(jìn)行授信動(dòng)作,授信成功后,頒發(fā)額度;
(4)簽發(fā)
核心企業(yè)基于應(yīng)付資產(chǎn),簽發(fā)額度給到鏈屬企業(yè);
(5)轉(zhuǎn)讓
鏈屬企業(yè)基于應(yīng)付資產(chǎn),轉(zhuǎn)讓額度給到下級(jí)鏈屬企業(yè);
(6)融資
鏈屬企業(yè)基于持有的通證,選擇通證額度簽發(fā)資金方進(jìn)行融資;
(7)抽成
鏈屬企業(yè)基于平臺(tái)配置的抽成規(guī)則,主動(dòng)進(jìn)行抽成打款;
(8)還款
核心企業(yè)在通證簽發(fā)有效期到期后,對(duì)通證持有方進(jìn)行還款;
(9)上鏈
應(yīng)用區(qū)塊鏈技術(shù),對(duì)所有基礎(chǔ)數(shù)據(jù)、交易數(shù)據(jù)進(jìn)行上鏈操作,存證防篡改;
支撐系統(tǒng)
1)電子簽章
2)郵件短信
3)動(dòng)態(tài)碼
4)CFCA
122.區(qū)塊鏈 企業(yè)鏈?zhǔn)瞧髽I(yè)科技新一代的聯(lián)盟鏈的核心引擎,擁有集高安全性,高性能,及高可用性等特點(diǎn)于一身,非常適用于具有聯(lián)盟性質(zhì)的商業(yè)機(jī)構(gòu)之間業(yè)務(wù)之場(chǎng)景,也適合金融級(jí)高頻交易、對(duì)安全性要求高的場(chǎng)景。
123.中間件
(1)消息中心:RocketMQ,一款分布式、隊(duì)列模型的消息中間件;
(2)緩存中心:Redis,一個(gè)高性能的key-value數(shù)據(jù)庫(kù);
(3)調(diào)度中心:XXL-JOB是一個(gè)輕量級(jí)分布式任務(wù)調(diào)度平臺(tái);
(4)分布式事務(wù):bscf-retry,企業(yè)自研基于補(bǔ)償機(jī)制的分布式事務(wù)解決方案;
(5)遠(yuǎn)程調(diào)用:使用SpringCloud微服務(wù)套件支持分布式遠(yuǎn)程調(diào)用;
(6)服務(wù)發(fā)現(xiàn):Eureka是Netflix開發(fā)的服務(wù)發(fā)現(xiàn)框架;
124.基礎(chǔ)運(yùn)維層:
1)應(yīng)用運(yùn)維
(1)應(yīng)用服務(wù)器:基于阿里云ECS提供穩(wěn)定高可用服務(wù);
(2)數(shù)據(jù)庫(kù):基于阿里云RDS的數(shù)據(jù)庫(kù)服務(wù);
(3)OSS:基于阿里云的分布式文件系統(tǒng);
(4)SFTP服務(wù)器:自建SFT服務(wù)器,用于與外部系統(tǒng)進(jìn)行文件交互;
(5)代碼庫(kù)管理:基于gitlab的私有代碼版本管理工具;
(6)發(fā)布平臺(tái):基于jenkins的服務(wù)自動(dòng)發(fā)布平臺(tái);
(7)配置中心:基于apollo的可視化配置中心;
2)運(yùn)維
一站式部署區(qū)塊鏈系統(tǒng)。
安鏈云BaaS平臺(tái)以企業(yè)科技自主研發(fā)的企業(yè)鏈為基礎(chǔ),提供了可視化、一站式的區(qū)塊鏈云服務(wù)。安鏈云BaaS平臺(tái)支持用戶快速、定制化部署區(qū)塊鏈系統(tǒng),提供充足的計(jì)算資源、開發(fā)工具、部署工具和監(jiān)控工具。安鏈云BaaS平臺(tái)通過高性能的資源池和靈活的定價(jià)模式,保障用戶的業(yè)務(wù)規(guī)模的彈性可伸縮,通過共享或獨(dú)享服務(wù)資源,提供用戶間業(yè)務(wù)的安全隔離,為用戶提供一站式的生產(chǎn)力工具集,為區(qū)塊鏈+行業(yè)生態(tài)提供科技賦能。
126.
Third,chain,ops,user 這4個(gè)項(xiàng)目的裝配方式是byName: default-autowire=“byName”>
127.AOP 相關(guān)配置
/**
- 統(tǒng)一對(duì)Api層進(jìn)行異常處理和日志記錄
/
@Component
@Configuration
@Aspect
@Order(3) // @Order(i)注解來(lái)標(biāo)識(shí)切面的優(yōu)先級(jí)。i的值越小,優(yōu)先級(jí)越高
public class BizImplProxy {
@Pointcut("execution( io.jiayan.fjy.ops.api.Ops*.*(…))")
public void bizPointcut() {
}
@SuppressWarnings(“rawtypes”)
@Around(“bizPointcut()”)
public Object doArount(ProceedingJoinPoint point) throws Throwable {
// 返回對(duì)象
Object ret = null;
128.starter總結(jié)
com.jiayan.openchain.sdk
openchain-oap-sdk
1.3-SNAPSHOT
spring-boot-autoconfigure
spring-boot-starter-web
boot-starter-actuator
spring-boot-starter-test
spring-cloud-starter-feign
springfox-swagger2
springfox-swagger-ui
junit
protobuf-java
org.springframework.cloud
lombok
jackson-databind
hibernate-validator
maven-compiler-plugin
maven-source-plugin
commons-lang3
spring-boot-maven-plugin
xxl-job-core
spring-boot-starter-aop
spring-boot-starter-jdbc
spring-test
mysql-connector-java
druid
sharding-jdbc-core
jedis
mybatis
mybatis-spring
pagehelper
commons-io
commons-lang
commons-beanutils
guava
httpclient
commons-net
joda-time
jsch
rocketmq-client
spring-cloud-starter-zipkin
itext
itextpdf
xmlworker
flying-saucer-pdf-itext5
itext-asian
feign-form
feign-form-spring
easymock
mockito-all
jackson-databind
jackson-core
jackson-annotations
slf4j-api
commons-fileupload
aliyun-sdk-oss
mail
commons-codec
javase
etl-uaclient
sadk
tech-nsign-sdk-share
hsqldb
commons-dbcp
commons-pool
129.綜合資產(chǎn)系統(tǒng)
130.pom文件 pom(project object model)//從來(lái)沒有想到要了解一下什么是pom
(1)cta-facade
(2)joda-time
(3)junit
(4)slf4j-api
(5)log4j
(6)validation-api
(7)hibernate-validator validator(驗(yàn)證控件)
(8)spring-test
(9)spring-webmvc 這個(gè)jar 文件包含Spring MVC 框架相關(guān)的所有類。包括框架的Servlets,Web MVC框架,控制器和視圖支持。當(dāng)然,如果你的應(yīng)用使用了獨(dú)立的MVC 框架,則無(wú)需這個(gè)JAR 文件里的任何類。
外部依賴spring-web, (spring-support,Tiles,iText,POI)。
(10)spring-core
(11)spring-jdbc 這個(gè)jar 文件包含對(duì)Spring 對(duì)JDBC 數(shù)據(jù)訪問進(jìn)行封裝的所有類。
外部依賴spring-beans,spring-dao。
(12)spring-aspects 提供對(duì)AspectJ的支持,以便可以方便的將面向方面的功能集成進(jìn)IDE中,比如Eclipse AJDT。
(13)spring-context-support
(14)spring-oxm Spring 對(duì)Object/XMl的映射支持,可以讓Java與XML之間來(lái)回切換
(15)spring-security-web
(16)spring-batch-infrastructure
(17)aspectjweaver
(18)spring-data-redis
(19)jedis
(20)mybatis-spring
(21)mybatis
(22)druid
(23)oracle
(24)httpclient
(25)httpclient-cache
(26)httpmime
(27)commons-pool2
(28)commons-lang3
(29)commons-lang
(30)commons-io
(31)poi
(32)poi-ooxml
(33)poi-ooxml-schemas
(34)dom4j
(35)commons-fileupload
(36)commons-beanutils
(37)ant
(38)dubbo
(39)zookeeper
(40)zkclient
(41)jstl
(42)servlet-api
(43)validation-api
(44)hibernate-validator
(45)bcprov-jdk14
(46)jackson-databind
(47)jackson-core
(48)fastjson
(49)json-lib
(50)juh
(51)ridl
(52)unoil
(53)jacob
(54)jodconverter
(55)jodconverter-cli
(56)xstream
(57)activiti-engine
(58)activiti-spring
(59)activiti-bpmn-model
(60)activiti-bpmn-converter
(61)activiti-process-validation
(62)mongo-java-driver
(63)java-uuid-generator
(64)guava
(65)javassist
131.總共有7個(gè)模塊
(1)aim-web,
配置文件:activity–工作流
jetty
<-- jedis 配置 -->
<-- -->
<-- redis template definition p表示對(duì)該bean里面的屬性進(jìn)行注入,格式為p:屬性名=注入的對(duì)象 效果與在bean里面使用標(biāo)簽一樣 -->
<-- 序列化方式 建議key/hashKey采用StringRedisSerializer。 -->
mybatis_config.xml 分頁(yè)攔截器配置
Redis redis_host=127.0.0.1 redis_port=6379 redis_password=123456 redis_maxIdle=100 redis_maxActive=300 redis_maxWait=1000 redis_testOnBorrow=true redis_timeout=10000
applicationContext.xml 終于知道applicationContext是什么了,慢慢的會(huì)對(duì)spring越來(lái)越理解
<-- 引入屬性文件 -->
<context:property-placeholder location=“classpath:config.properties,classpath:log4j.properties,classpath:redis/redis.properties” />
<-- 自動(dòng)掃描(自動(dòng)注入),不掃描帶有@Controller注解的類。因?yàn)檫@些類已經(jīng)隨容器啟動(dòng)時(shí),在servlet-context中掃描過一遍了 -->
<context:component-scan base-package=“com.gaoqianjf.aim”>
<context:exclude-filter type=“annotation” expression=“org.springframework.stereotype.Controller”/>
</context:component-scan>
<-- 配置數(shù)據(jù)源 -->
<-- 初始化連接大小 -->
<-- 連接池最大使用連接數(shù)量 -->
<-- 連接池最小空閑 -->
<-- 獲取連接最大等待時(shí)間 -->
<-- -->
<-- 配置間隔多久才進(jìn)行一次檢測(cè),檢測(cè)需要關(guān)閉的空閑連接,單位是毫秒 -->
<-- 配置一個(gè)連接在池中最小生存的時(shí)間,單位是毫秒 -->
<-- 打開removeAbandoned功能 -->
<-- 1800秒,也就是30分鐘 -->
<-- 關(guān)閉abanded連接時(shí)輸出錯(cuò)誤日志 -->
<-- 監(jiān)控?cái)?shù)據(jù)庫(kù) -->
<-- -->
<-- myBatis文件 -->
<-- 自動(dòng)掃描entity目錄, 省掉Configuration.xml里的手工配置。這里不支持多個(gè)路徑,只能用**來(lái)統(tǒng)一處理 -->
<-- 配置事務(wù)管理器 start -->
<-- 使用tx標(biāo)簽方式配置事務(wù) -->
<tx:advice id=“transactionAdvice” transaction-manager=“transactionManager”>
tx:attributes
<tx:method name=“add*” propagation=“REQUIRED” />
<tx:method name=“append*” propagation=“REQUIRED” />
<tx:method name=“insert*” propagation=“REQUIRED” />
<tx:method name=“save*” propagation=“REQUIRED” />
<tx:method name=“update*” propagation=“REQUIRED” />
<tx:method name=“modify*” propagation=“REQUIRED” />
<tx:method name=“edit*” propagation=“REQUIRED” />
<tx:method name=“delete*” propagation=“REQUIRED” />
<tx:method name=“remove*” propagation=“REQUIRED” />
<tx:method name=“repair” propagation=“REQUIRED” />
<tx:method name=“delAndRepair” propagation=“REQUIRED” />
<tx:method name=“claim*” propagation=“REQUIRED” />
</tx:attributes>
</tx:advice>
<–加入proxy-target-class=“true” 即可,默認(rèn)是false;–>
<-- expression=“execution( com.dao…(…))” 其中第一個(gè)代表返回值,第二代表dao下子包,第三個(gè)代表方法名,“(…)”代表方法參數(shù)。 -->
<aop:config proxy-target-class=“true”>
<aop:pointcut id=“transactionPointcut” expression=“execution(* com.gaoqianjf.aim.service…Impl.(…))” />
<aop:advisor pointcut-ref=“transactionPointcut” advice-ref=“transactionAdvice” />
</aop:config>
<-- 配置事務(wù)管理器 end -->
<-- 配置druid監(jiān)控spring jdbc -->
aop:config
<aop:advisor advice-ref=“druid-stat-interceptor” pointcut-ref=“druid-stat-pointcut” />
</aop:config>
aop:aspectj-autoproxy/
<-- spring上傳文件設(shè)置 -->
config.properties
driverClassName=oracle.jdbc.driver.OracleDriver
validationQuery=SELECT 1 FROM DUAL
jdbc_url=jdbc:oracle:thin:@172.18.100.50:1521:morass
jdbc_username=fas_0531
jdbc_password=123456
reinvest_amt=500
#mongodb
mongodb_ip=172.18.100.63
mongodb_port=27017
mongodb_db=testdb
mongodb_user=mdbtest
mongodb_pwd=123456
#activiti
#init activiti data
create.activiti.users=true
create.activiti.models=true
fastdfsUrl=http://172.18.100.63:8888/ FastDFS是一個(gè)開源的輕量級(jí)分布式文件系統(tǒng)
fastpool.properties
connect_timeout = 2
network_timeout = 30
charset = UTF-8
http.tracker_http_port = 8888
http.anti_steal_token = no
http.secret_key = FastDFS1234567890
tracker_server = 172.18.100.63:22122
log4j.properties
#log4j.rootLogger = [ level ] , appenderName, appenderName, …
log4j.rootLogger = ALL, console,allR
#branch logger
log4j.logger.InfoLogger = INFO,infoR
log4j.logger.ErrorLogger = ERROR,errorR
org.apache.commons = DEBUG
log4j.logger.org.springframework=ERROR
#mybatis logger config
log4j.logger.com.ibatis=ERROR
log4j.logger.org.apache.ibatis.jdbc.ScriptRunner=ERROR
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
#zookeeper off ping output
log4j.logger.org.apache.zookeeper=OFF
#dubbo off heartbeat output
log4j.logger.com.alibaba.dubbo.remoting.exchange.support.header=OFF
#console
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n
#infoR
log4j.appender.infoR = org.apache.log4j.RollingFileAppender
log4j.appender.infoR.File =logs/info/infoLog.txt
log4j.appender.infoR.MaxFileSize = 50MB
log4j.appender.infoR.MaxBackupIndex = 1000
log4j.appender.infoR.layout = org.apache.log4j.PatternLayout
log4j.appender.infoR.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] - %m%n
#errorR
log4j.appender.errorR = org.apache.log4j.RollingFileAppender
log4j.appender.errorR.File =logs/error/errorLog.txt
log4j.appender.errorR.MaxFileSize = 50MB
log4j.appender.errorR.MaxBackupIndex = 1000
log4j.appender.errorR.layout = org.apache.log4j.PatternLayout
log4j.appender.errorR.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] - %m%n
#allR
log4j.appender.allR = org.apache.log4j.RollingFileAppender
log4j.appender.allR.File =logs/all/allLog.txt
log4j.appender.allR.MaxFileSize = 500MB
log4j.appender.allR.MaxBackupIndex = 1000
log4j.appender.allR.layout = org.apache.log4j.PatternLayout
log4j.appender.allR.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] - %m%n
spring-activiti.xml
<-- 創(chuàng)建一個(gè)流程引擎的配置對(duì)象 -->
<-- 設(shè)置數(shù)據(jù)庫(kù)schema的更新方式 -->
<-- 是否啟動(dòng)jobExecutor -->
<-- -->
</bean><-- 創(chuàng)建一個(gè)流程引擎bean --><bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean"><property name="processEngineConfiguration" ref="processEngineConfiguration" /></bean><-- 創(chuàng)建activiti提供的各種服務(wù) --><-- 工作流倉(cāng)儲(chǔ)服務(wù) --><bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService" /><-- 工作流運(yùn)行服務(wù) --><bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService" /><-- 工作流任務(wù)服務(wù)--><bean id="taskService" factory-bean="processEngine" factory-method="getTaskService" /><-- 工作流歷史數(shù)據(jù)服務(wù)--><bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService" /><-- 工作流管理服務(wù)--><bean id="managementService" factory-bean="processEngine" factory-method="getManagementService" /><-- 工作流唯一服務(wù) --><bean id="IdentityService" factory-bean="processEngine" factory-method="getIdentityService" /> spring-task.xml <--自動(dòng)申請(qǐng) 定時(shí)任務(wù) --> <--自動(dòng)報(bào)盤Cta定時(shí)任務(wù) --> <--賬戶狀態(tài)同步推送定時(shí)任務(wù),在自動(dòng)報(bào)盤完成之后進(jìn)行 --><–更新逾期狀態(tài)任務(wù)定時(shí)任務(wù)
task:scheduled-tasks
<task:scheduled ref=“overdueStatusTask” method=“updateOverdueStatus” cron=“0 0 1 * * ?”/>
</task:scheduled-tasks>–>
<–逾期自動(dòng)報(bào)盤
task:scheduled-tasks
<task:scheduled ref=“overdueRepayTask” method=“overdueRepay” cron=“0 30 11,17,21 * * ?”/>
</task:scheduled-tasks>–>
<–計(jì)算逾期罰息定時(shí)任務(wù)
task:scheduled-tasks
<task:scheduled ref=“overduePenaltyTask” method=“calculatePenalty” cron=“0 0 2 * * ?”/>
</task:scheduled-tasks>–>
<-1.對(duì)于信用貸款,若超時(shí)(5天)未處理則直接歸檔。每天23點(diǎn)執(zhí)行一次
task:scheduled-tasks
<task:scheduled ref=“workflowTask” method=“cancelActivity” cron=“0 0 23 * * ?”/>
</task:scheduled-tasks>
1.待簽約客戶超過15個(gè)自然日未簽約處理,視為自動(dòng)拒貸。每天23點(diǎn)執(zhí)行一次
task:scheduled-tasks
<task:scheduled ref=“refuseLoanTask” method=“automaticRefuseLoan” cron=“0 0 23 * * ?”/>
</task:scheduled-tasks>
tpp-consumer.xml
<dubbo:application name=“tpp-client” />
<–消費(fèi)方應(yīng)用名,用于計(jì)算依賴關(guān)系,不是匹配條件,不要與提供方一樣 -->
<–zookeeper注冊(cè)中心
<dubbo:registry protocol=“zookeeper” address=“127.0.0.1:2181” />
<-- 生成遠(yuǎn)程服務(wù)代理,可以和本地bean一樣使用demoService
<dubbo:reference check=“false” connections=“1” id=“ctaAccountService” interface=“com.gaoqian.cta.facade.service.CtaAccountService” version=“1.0.0” />
<dubbo:reference check=“false” connections=“1” id=“channelService” interface=“com.gaoqian.channel.facade.service.ChannelService” version=“1.0.0” />
<dubbo:reference check=“false” connections=“1” id=“ctaTradeService” interface=“com.gaoqian.cta.facade.service.CtaTradeService” version=“1.0.0” />
<dubbo:reference check=“false” connections=“1” id=“ctaLLPayRealnameService” interface=“com.gaoqian.cta.facade.service.CtaLianLianAccountService” version=“1.0.0” />
src結(jié)構(gòu)
–controller
AccountBindCardController
selectAccBind 開戶綁卡信息查詢
selectAccBindCardPageInfo 開戶綁卡頁(yè)面自動(dòng)帶出信息查詢
selectBankCardOneInfo 銀行卡聯(lián)動(dòng)查詢,根據(jù)銀行卡id ,跟銀行卡號(hào) 查詢對(duì)應(yīng)銀行卡信息
selectAccFirmBindCardPageInfo 點(diǎn)擊企業(yè)開戶,彈出頁(yè)面,查詢頁(yè)面需要數(shù)據(jù),包括法人信息,銀行卡信息
addAcctFirmBindingCard 進(jìn)行企業(yè)開戶操作
addAcctOperation 進(jìn)行個(gè)人開戶操作
openLLPayAountRN 連連支付-實(shí)名認(rèn)證、支付認(rèn)證
問題點(diǎn):這個(gè)應(yīng)該寫在工具類.隨機(jī)生成數(shù)字字符串
public String incrementValue(){
if (counter.get() > 999999) {
counter.set(1);
}
CorporateCustomerController
initCorporateCust 初始化企業(yè)基本信息的數(shù)據(jù)字典
initCorporateUser 初始化企業(yè)人員信息的數(shù)據(jù)字典
selectReportList 通用報(bào)表查詢
exportExcel 通用報(bào)表導(dǎo)出
addCorporateCust 新增企業(yè)客戶
addCorporateUser 新增實(shí)際控制人、法人、股東、實(shí)際控制人配偶信息表
getCorporateCust 查詢企業(yè)客戶基本信息;查詢企業(yè)用戶:包括實(shí)際控制人和其他人員
updateCorporateCust 更新企業(yè)客戶
updateCorporateUser 更新實(shí)際控制人、法人、股東、實(shí)際控制人配偶信息表
getCompanyList 查詢展示所有企業(yè)的名字用以添加關(guān)聯(lián)企業(yè)信息表
addRelationCompanyCust 保存關(guān)聯(lián)企業(yè)
saveCorporateFile 企業(yè)附件上傳保存
selectCorporateFile 查詢企業(yè)的所有附件
selectCorportalAllUser 查詢企業(yè)所有人員信息,包括(法人,實(shí)際控制人,股東及配偶)
selectCorportalOneUser
查詢企業(yè)的單個(gè)人員信息,如查詢單個(gè)實(shí)際控制人,或者單個(gè)法人信息
UpdateCorportalOneUserFile 修改企業(yè)人員的附件,針對(duì)每個(gè)人。由于字段都在企業(yè)人員表中,所以直接更新就行了
PersonalCustomerController
initBasicInfo 初始化客戶基本信息頁(yè)面的數(shù)據(jù)字典
initContact 初始化相關(guān)聯(lián)系人頁(yè)面的數(shù)據(jù)字典
initBankCard 初始化銀行卡頁(yè)面的數(shù)據(jù)字典
initProfession 初始化職業(yè)信息頁(yè)面的數(shù)據(jù)字典
initCustomPersonalType 初始化頁(yè)面字段的數(shù)據(jù)字典(主要用于查看和修改客戶信息)
addPersonalCustomer 新增個(gè)人客戶基本信息
addContact 新增相關(guān)聯(lián)系人信息
addBankCard 新增銀行卡信息
addProfession 新增職業(yè)信息
delPersonalCustomer 刪除客戶信息
NotifyController
tradeBorrowData
SLTradeBorrowData 善林放款更新綜合資產(chǎn)信息(還款計(jì)劃表、投資列表、還款日期、還款狀態(tài))
ApplyUploadDataController
loanFinancing 借款融資申請(qǐng)
uploadData 融資申請(qǐng)信息
selectApplyRepayInfo 還款計(jì)劃表信息查詢
uploadTradLoanData 債券信息 excel文件解析上傳
selectApplyLoanInfo 融資申請(qǐng)信息查詢,單條信息查詢
selectLoanInfo 融資申請(qǐng)信息-----查看頁(yè)面
updateLoanInfo 融資申請(qǐng)信息------修改查看頁(yè)面
updateApplyLoanInfo 融資申請(qǐng) 信息修改保存
selectTradLoanInfo 查詢債券信息
selectApplyLoanAll 查詢?nèi)谫Y申請(qǐng)信息 分頁(yè)多條
selectLoanFile 融資申請(qǐng)信息—附件查詢
initApplyLoan 初始化融資申請(qǐng)頁(yè)面 下拉框信息
checkSubAccountLoan 點(diǎn)擊申請(qǐng)進(jìn)件,判斷客戶是否開戶綁卡
checkSubAccountQuery 選擇子賬戶功能,頁(yè)面聯(lián)動(dòng)信息查詢
BlackListController
List 黑名單列表頁(yè)
listQuery 黑名單列表查詢
blackListDetail 黑名單詳情
addList 新增黑名單
arraignBlackList 提審黑名單
auditBlackList 審核黑名單
cancelBlackList 取消黑名單
delBlackList 刪除黑名單
getBlackListExport 導(dǎo)出黑名單
ChangeManagerController
selectCustomInfo 客戶信息查詢(修改客戶經(jīng)理)
updateCustomerManager 修改客戶經(jīng)理信息
selectCustomManager 根據(jù)用戶名查詢客戶經(jīng)理
CustomerController 客戶信息錄入
organUser 企業(yè)客戶信息錄入
addBankCardToFrim 企業(yè)客戶添加銀行卡信息,保存銀行卡表,保存企業(yè)表
selectBankCardToFrim
HouseController
addHouseAssets 房產(chǎn)信息錄入,主要包括資產(chǎn)表,房產(chǎn)基礎(chǔ)表信息
addHouseLoan 房產(chǎn)貸款信息錄入
updateHouseLoan 房產(chǎn)貸款信息修改
updateHouseAssets 房產(chǎn)信息修改,資產(chǎn)表,房產(chǎn)基礎(chǔ)信息表
selectHouseAssets 房產(chǎn)基礎(chǔ)信息查詢,包括資產(chǎn)信息,房產(chǎn)信息
updateHouseAssetsPage 房產(chǎn)基礎(chǔ)信息查詢,包括資產(chǎn)信息,房產(chǎn)信息
selectHouseLoan 房產(chǎn)貸款信息查詢
selectHouseDictData 房產(chǎn)信息數(shù)據(jù)字典 數(shù)據(jù)接口
MoveFileController
addHouseAssets 房產(chǎn)信息錄入,主要包括資產(chǎn)表,房產(chǎn)基礎(chǔ)表信息
uploadFileForMove 上傳文件 這個(gè)功能寫在這里不符合單一職責(zé)原則
ContractManageController
contractListSearch 查詢合同
toContractCreditLoan 查看信用貸款的合同
toContractCreditLoan 查看信用貸款的合同
processTaskListSearch 流程任務(wù)查詢,包括(待處理002、申請(qǐng)中003、待簽約004、已簽約005)
toProcessTaskCreditLoan 查看信用貸款的合同
ContractPreviewController
investorListData 投資人列表分頁(yè)數(shù)據(jù)查詢
investorDataPreview 投資人列表打印數(shù)據(jù)查詢
selectBorrowContract 打印合同 數(shù)據(jù)查詢組裝接口
CreditLoanController
initCreditData 貸款申請(qǐng)菜單
selectCustomInfo
addData 信用貸款申請(qǐng)?zhí)砑訑?shù)據(jù)
updateCreditApplySubAcct 修改抵押貸款訂單中的客戶子賬號(hào)
Check 信用貸款申請(qǐng)查看頁(yè)面 方法名寫的太簡(jiǎn)單了
Modify 信用貸款申請(qǐng)修改頁(yè)面
selectContractBasicInfo 合同基本信息查看
modifyData 信用貸款申請(qǐng)修改數(shù)據(jù)
generatorContract 信用貸款合同生成
activationContract
activationContract調(diào)用cta接口,貸款訂單生效
selectCreditLoanContacterPage 拉取電話信息調(diào)查人員列表
selectCreditLoanCATIPage 拉取電話信息調(diào)查記錄
selectBankCardSalaryPage 拉取銀行卡工資流水記錄
selectBankCardDebtPage 拉取銀行卡負(fù)債記錄
sumBankCardDebt 計(jì)算銀行卡負(fù)債總值
addBankCardDebt 新增銀行卡負(fù)債記錄
initCreditLoanApprData 初始化審核意見的數(shù)據(jù)字典
addCreditLoanApprOpinion 保存審核信息
上傳電調(diào)附件 addCreditLoanCATIAtts
checkMatchPhone 內(nèi)匹客戶手機(jī)號(hào)碼
initCreditLoanRateScoreData 初始化費(fèi)率評(píng)分的數(shù)據(jù)字典
saveCreditLoanRateScore 保存/計(jì)算費(fèi)率評(píng)分
modifyContractIds 合同查詢添加附件
RepayLoanController
Normal 正常還款
Prepayment 提前還款
Overdue 逾期還款
offerQuery 報(bào)盤明細(xì)查詢
lateOfferQuery 逾期報(bào)盤明細(xì)查詢
Reportgeneralquery 報(bào)表通用查詢
selectAccBind 正常還款分頁(yè)數(shù)據(jù)查詢
applyNormalRepay 手工申請(qǐng)報(bào)盤
removeApplyRepay 撤銷申請(qǐng)
updateReport 修改手動(dòng)報(bào)盤信息
hangAmountSettle 掛賬結(jié)清
overdueRepayData 逾期還款分頁(yè)數(shù)據(jù)查詢
overdueReport 逾期手工申請(qǐng)報(bào)盤
earlyRepayData 提前還款分頁(yè)數(shù)據(jù)查詢
reportDetailData 報(bào)盤明細(xì) 分頁(yè)查詢
overdueDetailData 逾期報(bào)盤明細(xì)查詢
applyReport 正常還款申請(qǐng)報(bào)盤
AutomobileMortgageController
MortgageLoanController
selectApplyLoanAll 查詢?nèi)谫Y申請(qǐng)信息 分頁(yè)多條
toCheckMortgageApply 跳轉(zhuǎn)至查看頁(yè)面
toModifyMortgageApply 跳轉(zhuǎn)至修改頁(yè)面
initMortgageApply 初始化抵押貸款訂單的數(shù)據(jù)字典
addMortgageApply 新增抵押貸款訂單
updateMortgageApply修改抵押貸款訂單
queryMortgageApply 查詢抵押貸款訂單
updateMortgageApplySubAcct 修改抵押貸款訂單中的客戶子賬號(hào)
generatorContract 抵押貸款合同生成
getRepayPlanInfo 計(jì)算還款計(jì)劃表
–RepayPlanInfo
private Long id;
private BigDecimal loanAmount;//放款金額
private Integer loanTerm;//借款期限
private BigDecimal yearRate;//年化利率
private BigDecimal monthRate;//月利率
private BigDecimal totalRate;//總費(fèi)率
private String repayType;//還款方式
private BigDecimal totalRepayAmount;//還款總額
private BigDecimal totalAmount;//總費(fèi)用
private BigDecimal riskAmount;//風(fēng)險(xiǎn)金
private BigDecimal totalServiceAmount;//總服務(wù)費(fèi)
private BigDecimal signAmount;//簽約金額
private BigDecimal warranty;//質(zhì)保金
private BigDecimal monthRepayAmount;//月還款額
private BigDecimal repayInterest;//還款中利息
private BigDecimal repayPrincipal;//還款中本金
private BigDecimal residualPrincipal;//剩余本金
private BigDecimal residualPrincipalInterest;//剩余本息
private Integer period;//當(dāng)前期數(shù)
private BigDecimal serviceFee;//服務(wù)費(fèi)
private BigDecimal backFee;//退費(fèi)
private BigDecimal overdueLiquidatedDamages;//逾期違約金
private BigDecimal advanceLiquidatedDamages;//提前結(jié)清違約金
private BigDecimal advanceLiquidatedRepayAmount;//提前結(jié)清還款總額
1.定義list集合裝載還款計(jì)劃表(長(zhǎng)度為還款期數(shù))
List repayPlanList = new ArrayList
//定義還款計(jì)劃對(duì)象,add到repayPlanList集合中
RepayPlanInfo repayInfo = null;
//上一期還款計(jì)劃詳情
RepayPlanInfo repayByLast = null;
//獲取傳入?yún)?shù)
if(repayPlanInfo=null){
loanAmount = repayPlanInfo.getLoanAmount();
loanTerm = new BigDecimal(repayPlanInfo.getLoanTerm());
yearRate = repayPlanInfo.getYearRate().divide(new BigDecimal(100));
monthRate = yearRate.divide(new BigDecimal(12),16,BigDecimal.ROUND_HALF_UP);
totalRate = repayPlanInfo.getTotalRate().divide(new BigDecimal(100));
repayType = repayPlanInfo.getRepayType();
}
//計(jì)算還款總額(還款總額=月還款額*借款期限)
BigDecimal totalRepayAmount = monthRepayAmount.multiply(loanTerm).setScale(2,BigDecimal.ROUND_HALF_UP);
log.info(“還款總額={}”,totalRepayAmount);
//計(jì)算簽約金額(簽約金額=月還款額*{(1+月利率)借款期限-1}/{月利率*(1+月利率)借款期限})
BigDecimal signAmount = monthRepayAmount.multiply(oneBigdecimal.add(monthRate).pow(repayPlanInfo.getLoanTerm()).subtract(oneBigdecimal))
.divide(monthRate.multiply(
(oneBigdecimal.add(monthRate)).pow(repayPlanInfo.getLoanTerm()))
, 2, BigDecimal.ROUND_HALF_UP);
log.info(“簽約金額={}”,signAmount);
//計(jì)算質(zhì)保金(質(zhì)保金:簽約金額*質(zhì)保金比例)
warranty = signAmount.multiply(new BigDecimal(0.1)).setScale(2, BigDecimal.ROUND_HALF_UP);
log.info(“質(zhì)保金={}”,warranty);
//計(jì)算總費(fèi)用(總費(fèi)用=簽約金額-放款金額)
BigDecimal totalAmount = signAmount.subtract(loanAmount);
log.info(“總費(fèi)用={}”,totalAmount);
//計(jì)算風(fēng)險(xiǎn)金(風(fēng)險(xiǎn)金:簽約金額的4%)
BigDecimal riskAmount = signAmount.multiply(new BigDecimal(0.04)).setScale(2,BigDecimal.ROUND_HALF_UP);
log.info(“風(fēng)險(xiǎn)金={}”,riskAmount);
//計(jì)算總服務(wù)費(fèi)(總服務(wù)費(fèi)=總費(fèi)用-風(fēng)險(xiǎn)金 (包括乙方和丙方服務(wù)費(fèi)))??
//總服務(wù)費(fèi)=總費(fèi)用2.5
//計(jì)算總服務(wù)費(fèi)(總服務(wù)費(fèi)=總費(fèi)用-質(zhì)保金 (包括乙方和丙方服務(wù)費(fèi)))??
//BigDecimal totalServiceAmount = totalAmount.subtract(riskAmount);
//BigDecimal totalServiceAmount = totalAmount;
BigDecimal totalServiceAmount = totalAmount.subtract(warranty);
log.info(“總服務(wù)費(fèi)={}”,totalServiceAmount);
/**
* 根據(jù)還款期數(shù)遍歷計(jì)算還款計(jì)劃表內(nèi)容
/
for(int i=1;i<=loanTerm.intValue();i++){
log.info(“遍歷計(jì)算還款計(jì)劃表,下標(biāo)i=”+i+“-----------------------------------”);
repayInfo = new RepayPlanInfo();
repayInfo.setPeriod(i);//當(dāng)前期數(shù)
repayInfo.setMonthRepayAmount(monthRepayAmount);//月還款額
repayInfo.setTotalRepayAmount(totalRepayAmount);
repayInfo.setSignAmount(signAmount);
repayInfo.setTotalAmount(totalAmount);
repayInfo.setRiskAmount(riskAmount);
repayInfo.setTotalServiceAmount(totalServiceAmount);
//計(jì)算當(dāng)期月還款中利息的部分(當(dāng)期月還款中利息的部分=上一期剩余本金月利率)
if(i==1){
lastResidualPrincipal = signAmount;//第一個(gè)月上個(gè)月剩余本金=簽約金額
repayInterest = signAmount.multiply(monthRate).setScale(2,BigDecimal.ROUND_HALF_UP);
log.info(“第{}期還款利息={}”,i,repayInterest);
}else{
//獲取上一期還款記錄
repayByLast = repayPlanList.get(i-2);
log.info(“獲取第{}期還款記錄={}”,i-1,repayByLast);
lastResidualPrincipal = repayByLast.getResidualPrincipal();//上個(gè)月剩余本金
repayInterest = repayByLast.getResidualPrincipal().multiply(monthRate).setScale(2,BigDecimal.ROUND_HALF_UP);
log.info(“獲取第{}期還款利息={}”,i,repayInterest);
}
repayInfo.setRepayInterest(repayInterest);
}
} catch (Exception e) {
e.printStackTrace();
log.error(“還款計(jì)劃利息計(jì)算異常,原因=”+e.getMessage());
}
CreditReportController
selectCreditLoanContacterPage 拉取當(dāng)前用戶提交的征信報(bào)告列表
uploadCreditReportsOfBOC 中國(guó)銀行征信上傳
LoanReportController
actualRemindPrincipalExport
applyLoan
signingLoan
signedLoan
creditedLoan
applyLoanExport
signingLoanExport
signedLoanExport
creditedLoanExport
ApplyApprovalLoan
selectVehicleTypeAndBrand
AttachmentController 系統(tǒng)附件
saveFile 附件上傳
selectFile 多個(gè)附件查詢,
delUpLoadFile 上傳附件刪除
previewAttachment 單個(gè)附件預(yù)覽
dowLoadZipFile 附件打包下載
downloadAnnex 單個(gè)附件下載
downloadFilesByName
findFilesByName
BaseController
writeJson 將對(duì)象轉(zhuǎn)換成JSON字符串,并響應(yīng)回前臺(tái)
Write 將普通字符串?dāng)?shù)據(jù)響應(yīng)回前臺(tái)
initBinder 視圖數(shù)據(jù)綁定模型前將字符串類型時(shí)間轉(zhuǎn)型為日期格式
DepartmentController
addOrgan 添加部門
updateDepart 修改部門信息
delDepart 刪除部門信息
getDepatInfo 查詢所有部門信息
getDepartTree 展示當(dāng)前用戶的部門信息
getSysDepartTree 展示系統(tǒng)所有的部門信息
getSonTree 向下獲取子樹
getFatherTree 獲取父節(jié)點(diǎn)的信息
getRole 點(diǎn)擊節(jié)點(diǎn)的時(shí)候顯示當(dāng)前節(jié)點(diǎn)的部門,角色,用戶
getDepartUser 用戶信息展示
DictionaryController 字典數(shù)據(jù)
getDictByType
getChildDictByType 根據(jù)父id取出對(duì)應(yīng)的字段列表
getChildDictByTypeAndKey 根據(jù)父id and dataKey取出對(duì)應(yīng)的字段列表
IndexController 首頁(yè)信息加載
goIndex 首頁(yè)dashboard的一些簡(jiǎn)要信息
LoginController
Login
loginOutUser
updatePwd
MenuController
addMenu 添加菜單
updateMenu 修改菜單信息
delMenu 刪除菜單信息
getMenuInfo 查詢菜單信息
getMenuInfo 權(quán)限配置
getMenuTrees 獲取菜單樹
selectProcessInfo 流程配置信息查詢
addProcessInfo 流程配置信息新增
updateProcessInfo 流程配置信息修改
saveFile 流程信息添加 附件上傳
delUpLoadFile 流程配置上傳附件刪除
selectUpLoadFile 流程配置上傳附件查詢
RoleController
Addrole 添加角色
updateRole 修改角色信息
delRole 刪除角色信息
getRoleInfo 查詢角色信息
getRoleInfo 展示角色信息
getRoleUserInfo 展示角色關(guān)聯(lián)用戶信息
getProcessRoleInfo 流程角色查詢
updateProcessRoleInfo 流程角色信息修改
selectProcessDepartUserInfo 流程角色分配樹,顯示所有部門信息,并且顯示所有部門下的人員信息
selectProcessUserRoleInfo 流程角色下已經(jīng)關(guān)聯(lián)的用戶查詢
TSysDataController
selectDataTypeAll 數(shù)據(jù)字典,數(shù)據(jù)類型表查詢,需要查詢?nèi)繑?shù)據(jù)顯示
selectDataTypeAllPage 數(shù)據(jù)字典,數(shù)據(jù)類型表查詢,需要查詢?nèi)繑?shù)據(jù)顯示
selectDataAll 數(shù)據(jù)字典 數(shù)據(jù)表查詢,根據(jù)類型Id
addDataTypeAll
updateDataTypeAll
addDataAll
updateDataAll
UpLoad
uploadFile
UserController
addUser 添加用戶
updateUser 修改用戶信息
delUser 刪除用戶信息
getRoleUser 查詢用戶信息
getAllUser 查詢所有的用戶信息
VehicleController
selectAssetsByPage 資產(chǎn)信息列表前臺(tái)分頁(yè)查詢
addAssets 資產(chǎn)信息表新增客戶數(shù)據(jù)
addVehicle 車輛基本信息表新增車輛信息
addAssessment 車輛評(píng)估表新增評(píng)估數(shù)據(jù)
addVehicleConfig 車輛配置表新增配置數(shù)據(jù)
updateAssets 修改資產(chǎn)信息表客戶數(shù)據(jù)
updateVehicle 修改車輛基本信息表數(shù)據(jù)
updateVehicleConfig 修改車輛配置表數(shù)據(jù)
updateAssessment 修改車輛評(píng)估表數(shù)據(jù)
selectAssessment 查詢資產(chǎn)信息表,車輛基本信息表數(shù)據(jù)
updateAssessmentPage 查詢資產(chǎn)信息表,車輛基本信息表數(shù)據(jù)
IntopiecesController
addIntopieces 業(yè)務(wù)進(jìn)件、保存進(jìn)件信息
loadIntopiecesList 獲取進(jìn)件列表
loadApplyInfo 異步加載申請(qǐng)信息
getvalidatroIntopieces 查詢當(dāng)前企業(yè)是否有未完成的流程:已完成的流程包括正常結(jié)束和歸檔的流程。證件編號(hào)申請(qǐng)?jiān)谔幚碇?br /> insertIntopiecesApply 申請(qǐng)啟動(dòng)流程
toApproveFactoring 辦理保理業(yè)務(wù)的審批
toApproveLoanApply 辦理融資申請(qǐng)的審批
toApproveMortLoan 辦理抵押貸款的審批
toApproveCreditLoan 辦理信用貸款的審批
delIntopieces 刪除個(gè)人信用貨款申請(qǐng)信息
WorkflowController
loadByProcessInstance 讀取資源,通過流程ID
traceProcess 輸出跟蹤流程信息
loadClaimApplyList 任務(wù)認(rèn)領(lǐng)列表(待簽收列表)
claimTask 簽收任務(wù)
loadAllotApplyList 任務(wù)分配列表(待簽收列表)
allotTask 簽收任務(wù)(分配任務(wù))
selectByRoleName 根據(jù)崗位名稱配置審批人員下拉列表
loadRunningList ajax請(qǐng)求已處理流程任務(wù)
loadPendingApplyList 請(qǐng)求待處理流程任務(wù)列表
completeFactoring 保理業(yè)務(wù) 審批流程
postponeConfirm 客戶經(jīng)理 延期 落實(shí)條件
completeLoanApply 融資申請(qǐng) 審批流程
completeMortLoan 抵押貸款 審批流程
completeCreditLoan 信用貸款 審批流
–excel
–vo
(2)aim-service,
(3)aim-dao,
(4)aim-model,
(5)aim-core,
SessionFilter
(6)aim-task
WorkflowTask
cancelActivity
RefuseLoanTask
automaticRefuseLoan 風(fēng)控經(jīng)理審批通過,在待簽約環(huán)節(jié),客戶系統(tǒng)中保留15個(gè)自然日進(jìn)行簽約,15個(gè)自然日內(nèi)未簽約的客戶,系統(tǒng)做超時(shí)自動(dòng)拒貸處理。
OverdueRepayTask
updateOverdueStatus 更新逾期狀態(tài)
overdueRepay 逾期自動(dòng)報(bào)盤
calculatePenalty 計(jì)算罰息定時(shí)任務(wù)
NormalRepayTask
automaticReport 自動(dòng)申請(qǐng)報(bào)盤
automaticReportCTA 定時(shí)任務(wù)自動(dòng)發(fā)起報(bào)盤扣款請(qǐng)求對(duì)接CTA
AcctStatusTask
acctStatusSync 賬戶狀態(tài)同步推送定時(shí)任務(wù)
spring-task.xml 定期任務(wù)的執(zhí)行在這里調(diào)用
<–自動(dòng)申請(qǐng) 定時(shí)任務(wù)
task:scheduled-tasks
<task:scheduled ref=“normalTask” method=“automaticReport” cron=“0 0 4 * * ?”/>
</task:scheduled-tasks>-
<–自動(dòng)報(bào)盤Cta定時(shí)任務(wù)
task:scheduled-tasks
<task:scheduled ref=“payReprotTask” method=“automaticReportCTA” cron=“0 30 10,16,20 * * ?”/>
</task:scheduled-tasks>-
<–賬戶狀態(tài)同步推送定時(shí)任務(wù),在自動(dòng)報(bào)盤完成之后進(jìn)行
task:scheduled-tasks
<task:scheduled ref=“acctStatusSyncTask” method=“acctStatusSync” cron=“0 30 12,18,22 * * ?”/>
</task:scheduled-tasks>-
<–更新逾期狀態(tài)任務(wù)定時(shí)任務(wù)
task:scheduled-tasks
<task:scheduled ref=“overdueStatusTask” method=“updateOverdueStatus” cron=“0 0 1 * * ?”/>
</task:scheduled-tasks>
<–逾期自動(dòng)報(bào)盤
task:scheduled-tasks
<task:scheduled ref=“overdueRepayTask” method=“overdueRepay” cron=“0 30 11,17,21 * * ?”/>
</task:scheduled-tasks>
<–計(jì)算逾期罰息定時(shí)任務(wù)
task:scheduled-tasks
<task:scheduled ref=“overduePenaltyTask” method=“calculatePenalty” cron=“0 0 2 * * ?”/>
</task:scheduled-tasks>
<-- 1.對(duì)于信用貸款,若超時(shí)(5天)未處理則直接歸檔。每天23點(diǎn)執(zhí)行一次
task:scheduled-tasks
<task:scheduled ref=“workflowTask” method=“cancelActivity” cron=“0 0 23 * * ?”/>
</task:scheduled-tasks>
1.待簽約客戶超過15個(gè)自然日未簽約處理,視為自動(dòng)拒貸。每天23點(diǎn)執(zhí)行一次
task:scheduled-tasks
<task:scheduled ref=“refuseLoanTask” method=“automaticRefuseLoan” cron=“0 0 23 * * ?”/>
</task:scheduled-tasks>
(7)aim-api
CTA系統(tǒng) 有使用到rabbitMq,aim使用了MongoDB
總結(jié)
以上是生活随笔為你收集整理的Java微服务系统项目技术栈总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 广州数控车床M代码指令讲解
- 下一篇: 丰田凯美瑞android系统,丰田第八代