# ETL详细设计 ## 待沟通 - 目前上游无法提供增量数据,所以每次批处理必须全量,效率低 - 受益人只有三要素证件号码、证件类型、姓名,上游客户号为null - 客户等级是否有效的判断规则(有效标志IS_DELETE、失效日期END_DATE全为null,生效日期是否有作用),客户ID(CUSTOMER_ID)是否与核心客户号一致 - 数据字典中不同表之间存在大量的重复字段,且从测试环境来看,这些表存在差异,如保单数量:HEALTH_INSURANCE_LISTING << POLICY_INFORMATION < INSURANCEINFO,但没有文档说明,无法保证所取字段的正确性。 - 需提供结案日期 ## 个人信息(Individual) 1. 从保单主表(POLICY_INFORMATION)中获取投保人的上游客户号和五要素,得到`$投保人列表$` code SELECT CUSTOMERNO,NAME,sex,BIRTHDAY,IDTYPE,IDNO,min(CVALIDATE) FROM POLICY_INFORMATION GROUP BY CUSTOMERNO,NAME,sex,BIRTHDAY,IDTYPE,IDNO; 2. 从个险承保清单自助分析表(POLICY_INFORMATION)中获取被保人的上游客户号和五要素,得到`$被保人列表$` code SELECT INSUREDNO,INSUREDNAME,INSUREDSEX,INSUREDBIRTHDAY,INSUREDIDTYPE,INSUREDIDNO,min(CVALIDATE) FROM POLICY_INFORMATION GROUP BY INSUREDNO,INSUREDNAME,INSUREDSEX,INSUREDBIRTHDAY,INSUREDIDTYPE,INSUREDIDNO; 3. ~~从个险承保清单自助分析(HEALTH_INSURANCE_LISTING)中获取受益人的上游客户号和三要素,得到`$受益人列表$`,实际数据上游客户全为null,同时五要素不齐,故暂时不考虑~~ code SELECT BENEFICIARY_CUSTOMERNO,BENEFICIARY_NAME,BENEFICIARY_IDTYPE,BENEFICIARY_IDNO FROM HEALTH_INSURANCE_LISTING GROUP BY BENEFICIARY_CUSTOMERNO,BENEFICIARY_NAME,BENEFICIARY_IDTYPE,BENEFICIARY_IDNO; 4. 将`$投保人列表$`,`$被保人列表$` 合并去重,得到`$投被保人列表$`,并按保单生效日期(CVALIDATE)从早到晚排序(客户号生成规则之一) 5. 遍历`$投被保人列表$` 6. **标识及证件信息**:根据五要素生成CPID,并生成代理主键IndID同时将CPID以及列表中其他字段分别插入个人信息表(Individual)。注意:要根据证件类型,将证件号码插入不同的字段。(如:证件类型为0,则证件号码插入身份证字段) 7. **todo 等级信息**:根据上游客户号,从客户等级表(T_CUSTOMER_CLASS)获取客户等级、贡献度分、家庭加分、续期加分、保单加分、总分值。 code select CLASS_VALUE,CONTRIBUTION_VALUE,AWARDED3,AWARDED2,AWARDED1,TOTAL_VALUE from T_CUSTOMER_CLASS where CUSTOMER_ID = 上游客户号 8. **籍贯、职业**:根据上游客户号,从个险承保清单自助分析(HEALTH_INSURANCE_LISTING)获取投保人籍贯,投保人职业代码,投保人职业名称。注意,此表投保人和被保人都有职业代码名称,取最近的一条记录 code select APPNTHOMEADDRESS,APPNTOCCUPATIONCODE,APPNTOCCUPATIONNAME from HEALTH_INSURANCE_LISTING where APPNTNO = 上游客户号 order by POLAPPLYDATE desc ## 保单(InsuranceArrangement) 1. 从新契约签单明细清单(INSURANCEINFO)表中获取相关字段插入到InsuranceArrangement表,由于INSURANCEINFO表中是以保单号唯一的,所以直接插入。语法见下,字段映射详见模型文档 code INSERT INTO InsuranceArrangement(PolicyNo,PANo) SELECT contno,prtno FROM INSURANCEINFO 1. 用保单信息表(POLICY_INFORMATION)去更新InsuranceArrangement,由于POLICY_INFORMATION不是以保单号唯一的,所以先要去重。由于星环inceptor不支持如下在update中使用group by的语法,所以可以对POLICY_INFORMATION按保单号去重后存入临时表`POLICY_INFORMATION_tmp` code insert into POLICY_INFORMATION_tmp(contno,CVALIDATE,ENDDATE) SELECT contno,max(CVALIDATE),max(ENDDATE) ROM POLICY_INFORMATION GROUP BY contno 3. 更新临时表`POLICY_INFORMATION_tmp`中投保人(ApplicantID),主被保险人(InsuredID)为individual表的个体ID(IndID),可根据POLICY_INFORMATION.CUSTOMERNO关联individual上游客户号(SCustID),得到IndID,支持update,临时表设置为ORC事务表 code UPDATE POLICY_INFORMATION_tmp SET ApplicantID = (SELECT ApplicantID FROM individual WHERE (POLICY_INFORMATION_tmp.CUSTOMERNO = individual.SCustID)) WHERE 1=1; 4. 最后用临时表更新InsuranceArrangement(code2),为了支持update,InsuranceArrangement表设置为ORC事务表。语法见下,字段映射详见模型文档 code2 UPDATE InsuranceArrangement SET (PINDate,PMDate) = (SELECT CVALIDATE,ENDDATE FROM POLICY_INFORMATION_tmp WHERE (POLICY_INFORMATION_tmp.contno = InsuranceArrangement.PolicyNo)) WHERE 1=1; ## 理赔(InsuranceClaimThread) 1. 首先将个单理赔表(INSURANCE_CLAIM)按保单和赔案号去重并存入临时表`INSURANCE_CLAIM_tmp` code insert into INSURANCE_CLAIM_tmp(ontno,clmno,RISKDATE,INSUREDNO,RPTDATE,LLOCCURREASON,RGTDATE,ACCIDENTDETAIL,LLCLAIMSTATE) SELECT contno,clmno,max(RISKDATE),max(INSUREDNO),max(RPTDATE),max(LLOCCURREASON),max(RGTDATE),max(ACCIDENTDETAIL),max(LLCLAIMSTATE) FROM INSURANCE_CLAIM GROUP BY contno,clmno 2. 更新`INSURANCE_CLAIM_tmp`中出险人为individual表的个体ID(IndID) 3. 将`INSURANCE_CLAIM_tmp`相应字段直接插入到InsuranceClaimThread表中,字段映射详见模型文档。 ## 接触(Communication) 1. ## 事件(PartyTimeLine) 1. 目前主要有以下事件,一个事件一条记录,包括开始时间和结束时间 - **投保**:参与方为投保人,Scenario='0001',SDate=InsuranceArrangement.PADate,EndDate=InsuranceArrangement.PISDate - **保全**:todo 等待上游提供数据字典 - **报案**:参与方为报案人,Scenario='0003',SDate=InsuranceClaimThread.CNDate,EndDate= todo 等待上游提供结案日期字段 - **投诉**: - **咨询**: