主要业务逻辑:
一共通过获取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 :https://blog.csdn.net/wuzhiwei549/article/details/85405443
springbatch flow https://blog.csdn.net/shaoyangdd/article/details/100862924
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
https://blog.csdn.net/m0_37895553/article/details/105008083
springbatch可读多文件写list,需要转换器改为单个实体->转到多个实体 maybe
https://blog.csdn.net/lyf_ldh/article/details/98471353
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