主要业务逻辑:

一共通过获取4种文件后,对文件相关数据进行处理,之后关联相关已有数据库进行监控视图的填充.

一共含有中证/中债两类文件类型, 每种类型对应全价/特殊两种区分.

流程图:

4种文件类型枚举及入库表:

文件类型code 对应写入数据库

market_cs_txt_valuation (从txt文件第20行开始读取入库数据) market_cs_valuation 中证全价

market_cs_txt_specified (从txt文件第13行开始读取入库数据) market_cs_specified 中证特殊

market_cb_dbf_valuation (第一行是标头) market_cb_dbf_valuation 中债全价

market_cb_dbf_specified (第一行是标头) market_cb_dbf_specified 中债特殊

market_topic_records 用来记录文件到没到,记录到达日期,以及批次号

(前置step查询文件数据到达与否时需要关联查询到是该表数据)

record_id file_date file_type batch_code create_time update_time topic_time

market_monitor_common_config(已经改为了不设置其他值只设定偏离度阈值时便为公共阈值)

config_id holding_deviation assessment_deviation create_time delete_flag version

market_exception_deviation

deviation_id

market_results

对比结果表,记录某种估值偏离计算今日是否达成,记录相关jobId,stepResults等

偏离度计算需要用到的总共相关表:

特殊估值监控获取逻辑:

偏离度&首日出现对比并对比结果入库的刷新机制(monitor)

提醒邮件发送机制:

*return null 时 processor将不会将null的数据传入writer进行update

当第二份当日文件重复到达后,进行相应处理

情况分多种

[ ] 当第二份文件数据与第一份文件数据一致时,可以不根据bondCode,bondMarket来进行更新

[ ] 当第二份文件数据与第一份文件数据有重叠部分但也有少有多时,需要先将数据根据bondCode,bondMarket来进行更新,

而还需要将少的数据进行数值额外清理,将多的数据进行额外插入数值

[X] 确定直接按照第二份文件

发送每条对比结果 module:core

调用faAutoIndexFeignClient发送对比结果

每次跑批查询数据根据查询关联列表,关联持仓债券市场与债券

文档:

[X] 持仓债券首次出现在特殊估值行情文件中,哪个属于持仓债券 第三方数据

[X] 两种偏离度的计算

1) 中证&中债行情偏离度监控:获取所持仓债券监控日的中证行情、中债行情。

计算中证和中债两个行情的偏离度(包括正常全价和特殊估值价),若偏离度超过所设阈值(如10%),做出提示。

偏离度计算公式:|(中证行情-中债行情)/中债行情|

注:以上公式中的中证行情包括中证全价和中证特殊估值,中债全价包括中债全价和中债特殊估值(下同)。

中证和中债的特殊估值行情会同时出现吗?

2) 估值价格偏离监控:获取所持仓债券监控日的中证行情、中债行情以及估值全价。

计算估值全价与第三方价格的偏离度(包括特殊估值价格),若偏离度超过所设阈值(如1%),做出提示;

偏离度计算公式=|(估值全价-中证行情(或中债行情))/中证行情(或中债行情)|

注:考虑到估值价格保留位数的处理,因此通过设置阈值来监控价格的准确性。

[X] 监控日是哪些天

[X] 估值全价计算 (估值表,债券市值,应收债券利息) 第三方数据

[ ] 估值中 债券代码是复数的都有哪些

[X] 业务需求1监控特殊行情文件是对比哪个字段实际的 maybe

[X] 计算偏离度 外层绝对值

文档变更:

:一个债券在中证行情中出现则不会在中证特殊估值行情中出现,中债行情同理。

ZQTZ_CB

持仓证券视图

market_hoding_view

通过查询视图参数不同 secDate (到天的时间)

根据不同的secCode,查看该持仓债券所在交易市场

可以使用到的字段值:

SYMBOL(无中文的证券代码),secCode(带中文SH,SZ,CY,HK的证券代码),

secName(证券名称),mktCode(证券市场XSHG上海,XCFE(银行间),XSHE(深圳),XHKG(香港)),

fundCode(基金代码),fundName(基金名称),fundType(基金类型),secDate(数据时间)

特殊估值&持仓债券

1.根据持仓证券的联查,判定特殊估值属于哪个证券交易市场

持仓债券表视图: market_hoding_view

select * from market_hoding_view where SYMBOL in (110059)

select v.SYMBOL as bondCode,secName as bondName,secDate as marketTime,中证特殊估值价,中债特殊估值价,fundCode as productCode,

fundName as productName,fundType as productType

Specified 特殊估值的取值:

[X] 或更改: marketSpecialMonitorServiceImpl: 201 & 207

其他接口:

1.估值全价 估值表 (赢时胜)

2.工作日

【中债全价】

文件:债券估值yyyymmdd,一般18点到达,取文件“zqdm(证券代码)、kxd(可信度)、 rzgjqj(日终估价全价)、ltcszqdm(流通场所债券代码)。

银行间债券代码:取“zqdm”

交易所债券(含上交所、深交所)代码:取“ltcszqdm”

若债券只有一条估值价格,则直接取其“rzgjqj”

若债券有两条估值价格,取kxd 为“推荐”的“rzgjqj”

该行情文件存放地址:H:\fund519008\yyyymmdd

zhon

在视图中,SYMBOL=bondCode

4种文件,3个monitor(specified,cscb,value monitor)

,3对数据对比 (cs->cb , value->cs , value->cb)

通过task将偏离度计算并写入对应monitor

关系关联表

偏离度计算入库流程:

估值全价计算流程:

对偏离度set表的取值及common(公共值),针对值,以及对比不对比(估值价格偏离监控)

spring batch 比较偏离度以及入库monitor

1.配置相关springbatchconfig,oracle,mybatisplus

2.关联4种基础文件,关联持仓债券,如果为cscb对比偏离度,先获取中证的数据条目,则将获取对应的该条目对应到的中债数据,

通过持仓债券冗余字段填充了monitor,首先进行了cscbMonitor的保存。

3.cscbMonitor保存后,再根据获取到的相关数据(持仓债券view),获取到对应的估值全价表关联数据,获取到估值全价,再返回跟中证或

中债数据进行计算,得出估值全价中证偏离度,估值全价中债偏离度,并将关联估值全价前到数据按照是否超过阈值,插入valueMonitor。

其中valueMonitor中包含value-cs(估值与中证),value-cb(估值与中债)。

springbatch flow  ​

springbatch flow ​

SpringBatch 不同reader,processor,writer配置不同的单个内置static class @Configuration区分

对应每种monitor的writer

job的配置

配置batchStep流程 将batchJobs指示图中每个不同级别(>,>>,>>>)分为不同步骤

step 6 个

刷新结果

batchStep及对应的前置后置step关系

对应step:

特殊估值:(特殊文件)

special:

判定csSp文件数据今日是否存在(topic_records)

[csSpSpecialStep],

判定cbSp文件数据今日是否存在(topic_records)

[cbSpSpecialStep]

中证中债:(2类/4个文件都用得到,对比一种必须用到两个文件数据)

initMonitor (将持仓债券数据初始化进cscb-monitor本日)

cscb:

判定csVa & cbVa文件数据今日是否存在(topic_records)

[csVaCsCbStep],

判定csSp & cbSp文件数据今日是否存在(topic_records)

[csSpCsCbStep]

估值全价计算:

initMonitor (将持仓债券数据初始化进value-monitor本日)

value:

判定csVa文件数据今日是否存在(topic_records)

[csVaValueStep],

判定csSp文件数据今日是否存在(topic_records)

[csSpValueStep],

判定cbVa文件数据今日是否存在(topic_records)

[cbVaValueStep],

判定cbSp文件数据今日是否存在(topic_records)

[cbSpValueStep]

job开始时,根据monitor类型,来获取isInitMonitor单独的flow,在单独的flow中,执行完判定isInitMonitor后再执行下面的step.从混乱的并行中回到前需判定的flow中

乱序并行初始化视图到常规判定初始化视图

各个step只包括读转写

比如

csva文件发起的step可以转到cscb-monitor也可以转到value-cs到value-monitor

则将该csva-begin-job做flow,并行,并行第一个step就应该是判断csva入库与否到tasklet step

具体到csva-cscb-step时只要判定cbva文件tasklet step即可

而value-monitor无需再判定

所以在生成flow时,如果不需要再判定文件入库,需要改为可以执行在tasklet step返回finished

springbatch

 ​

springbatch可读多文件写list,需要转换器改为单个实体->转到多个实体 maybe

 ​

springbatch优势

chunk分批进行处理,在异常断点处继续

beforeJob(可以判定是否这个job所需文件是否都具备)

afterJob(对比结果)

记录job结果的同时发送比对 超过阈值 或 首日出现 数据

● 问题: 可能update时间会跟beginJob,monitorJob有冲突,可能同时

● 问题: write count获取时 并不能获取完全是这个job进行更新的

● 解决: 根据step 名称获取这个step id 之后是否还有相同的step, 如果有,则统一获取回来 将 write count加总 进行相关monitor表的查询

● step步骤数组,判定monitor类型的step而不是initstep等,获取后将step对应monitortype进行查询

发送邮箱提醒,区分文件到达的jobBegin方式以及单个刷新monitor两种类型

jobExecutionId -> jobInstanceId(batchJobInstance) 查询jobName是否是beginJob或是refreshJob