1、Utlity.pc 公用函数说明1. ctrl_con2. get_infilename3. ctrl_month4. ctrl_table5. InitRate6. InitGsm7. TariffTimeSpan8. InitTimeSpan9. isoArea10.disGsm11. get_rate12. char get_free13.char dis_holiday14. void record_error 15. int ValidPhoneNumber 1) ctrl_con():得到相应业务的业务种类编号,原始数据输入路径和总帐数据输出文件.相关表: detail_condi
2、tion;用到变量: Pprocess_no(GV);影响变量: Pinput_path(GV), Poutput_path(GV), Pbusi_type(GV);功能: 得到一项业务( 根据 Pprocess_no 来确定)的原始数据文件输入路径, 和总帐数据文件输出路径,以及 业务种类; SELECT: NVL(RUN_FLAG,0),NVL(BUSI_TYPE,1) / 到 Pbusi_type;NVL(INPUT_PATH,./) / 到 Pinput_path;NVL(OUTPUT_PATH,./) / 到 Poutput_path;WHERE: PROCESS_NO = Ppro
3、cess_no; UPDATE: RUN_FLAG = 1;WHERE: PROCESS_NO = Pprocess_no;2) get_infilename(char *recfile):从指定路径下得到原始数据文件.相关表: 无;用到变量: recfile(arg) , Pinput_path(GV), Poutput_path(GV), Pbusi_type(GV) , fcxbureau(GV);影响变量: recfile(arg);功能: 使用文件管道技术 find path name “文件名通配符 ” print 循环得到 Pinput_path 下的所有文件; fp_pipe=
4、popen(管道,“r”); fgets(recfile,128,fp_pipe);3) int ctrl_mon(char * filename1):得到本次记帐月月份.相关表: month_control;用到变量: filename1(arg), Pprocess_no;影响变量: Pcur_mon(GV);功能: 从 filename1 中分离出包含的时间信息到 Pcur_date;select: MONTH / 到 Pcur_mon 中;where: PROCESS_NO = Pprocess_no;Pcur_date between START_TIME and END_TIME;
5、备注: 为了实现通用性和易维护性,程序根据大量的配置表中的环境变量而运行, 本函数中,通过配置表 month_control 中得到当前记帐月,从而确定处理的原始数据 insert 至哪个详帐表中-业务名称_%02d(02d 为月份);4) ctrl_table(filename2):得到本次记帐要处理的详帐表名.相关表: no_head;用到变量: filename2(arg),Pbusi_type(GV);影响变量: Pdetail_table(GV),Pbill_table(GV);Lno_head(GV);功能: 从 filename2 中分离出”局向”;select: NVL(DET
6、AIL_TABLE,No table name) / 到 Pdetail_table;NVL(BILL_TABLE,No table name) / 到 Pbill_table;WHERE: BUSI_TYPE=ltrim(rtrim(:Pbusi_type)BUREAU_CODE_C4=:Bureau_id_c4;Lno_head = filename25-filename11;备注: 取到的表名和 Pcur_mon 结合得到本次记帐要处理的详帐表名 ;5) int InitRate():初始化费率结构数组,将费率表中符合条件的费率记录读入内存.根据不同业务( 进程号不同)读取不同表中的费率
7、相关表: toll_tariff, basic_tariff,latn_call_tariff;使用变量: Pprocess_no(GV);影响变量: rateLEN_RATE_NUM(GV)(stru);功能: 根据进程号判断 :1,46 : toll_tariffSELECT: TARIFF_ID, / 到 rate.tariff_idCALLED_AREA_CODE, / 到 ratenum.rate_idTO_CHAR(NVL(EFF_DATE, TO_DATE(19960101,YYYYMMDD),YYYYMMDD), / 到 ratenum.effect_sdateTO_CHAR(
8、NVL(EXP_DATE,TO_DATE(20891231,YYYYMMDD),YYYYMMDD), / 到 ratenum.effect_edateNVL(TARIFF_TYPE,11), / 到 ratenum.tariff_typeNVL(RATE,0), / 到 ratenum.rateNVL(FIT_OBJECT,y) / 到 ratenum.fit_objectORDER BY: CALLED_AREA_CODE, EFF_DATE5,6,7,8,9,10,11: basic_tariffSELECT: TARIFF_ID,TO_CHAR(AREA_ID),SERV_TYPE_ID
9、,BILLING_TYPE_ID,TO_CHAR(NVL(EFF_DATE,TO_DATE(19960101,YYYYMMDD),YYYYMMDD),TO_CHAR(NVL(EXP_DATE,TO_DATE(20891231,YYYYMMDD),YYYYMMDD),TARIFF_TYPE,RATEORDER BY: AREA_ID,SERV_TYPE_ID,BILLING_TYPE_ID,TARIFF_TYPE,EFF_DATE;备注: 此处的 rate.rate_id = area_id(4 位) + serv_type_id(4 位) + billing_type_id(4 位) + ta
10、riff_type(4 位); 3,4: latn_call_tariffSELECT: TARIFF_ID,TO_CHAR(SERV_TYPE_ID),TO_CHAR(CALLING_AREA_ID),TO_CHAR(CALLED_AREA_ID),TO_CHAR(NVL(EFF_DATE,TO_DATE(19960101,YYYYMMDD),YYYYMMDD),TO_CHAR(NVL(EXP_DATE,TO_DATE(20891231,YYYYMMDD),YYYYMMDD),TARIFF_TYPE,NVL(RATE,0)ORDER BY SERV_TYPE_ID,CALLING_AREA_
11、ID,CALLED_AREA_ID,TARIFF_TYPE,EFF_DATE备注: 此处的 rate.rate_id =serv_type_id(4 位) + calling_area_id(4 位) +called_area_id(4 位) + tariff_type(4 位); 依托关系: 在 isoArea()和 get_free()前调用 .相关结构变量: bl_rate ratetypedef struct long tariff_id;char rate_idLEN_TEL_AREA;char effect_sdateLEN_DATETIME;char effect_edateLE
12、N_DATETIME;char tariff_typeLEN_TARIFF_TYPE;long rate;char fit_object; bl_rate;6) int InitGsm()初始化 gsmLEN_GSM_NUM(GV).相关表: gsm_area影响变量: gsmLEN_GSM_NUM(GV)功能: 初始化 gsmLEN_GSM_NUM;相关结构变量: gsmtypedef struct char gsm_headLEN_GSM_HEAD;char areaLEN_TEL_AREA; bl_gsm_area;7) int InitTariffTimeSpan()初始化费率优惠时间
13、段数据.相关表: tariff_time_span影响变量: TariffTimeSpanLEN_TARIFFTIMESPAN_NUM(GV)功能: 初始化 TariffTimeSpanLEN_TARIFFTIMESPAN_NUMSELECT: TIME_SPAN_ID, FIT_OBJECT, RATEORDER BY: FIT_OBJECT, TIME_SPAN_ID;TariffTimeSpan.time_span_id = time_span_id(4 位) + 000 + fit_object(1 位);相关结构变量: TariffTimeSpantypedef struct cha
14、r time_span_id8;char fit_object;int rate; S_TariffTimeSpan;8) int InitTariffTimeSpan_public()初始化公用电话费率优惠时间段数据.相关表: tariff_time_span_public影响变量: TariffTimeSpan_public(GV)功能: SELECT: TIME_SPAN_ID,FIT_OBJECT,RATEORDER BY: FIT_OBJECT,TIME_SPAN_ID;TariffTimeSpan_publicnum.time_span_id =time_span_id(4 位)
15、+ 000 + fit_object(1 位);相关结构变量: TariffTimeSpantypedef struct char time_span_id8;char fit_object;int rate; S_TariffTimeSpan;9) int InitTimeSpan()相关表: time_span;影响变量: TimeSpan(GV);功能:SELECT: TIME_SPAN_ID,BEGIN_TIME,END_TIME,SPAN_TIME_FLAG,NVL(FIT_OBJECT ,0),NVL(DISCOUNT,1)WHERE: STATE=B00 ;ORDER BY FI
16、T_OBJECT,DISCOUNT;10) int InitAcctItemType()根据进程号(Pprocess_no)得到相应业务控制信息.相关表: acct_item_type_ctrl;影响变量: AcctItemType(GV);功能:SELECT: PROCESS_NO,BUSINESS_ID,ACCT_ITEM_TYPE_ID,PARTNER_ID,TICKET_METER_TYPE,TARIFF_TYPE WHERE: PROCESS_NO = Pprocess_no ORDER BY: TARIFF_TYPE;相关结构:typedef struct long Process
17、No;long BusinessId;long AcctItemTypeId;long PartnerId;char TicketMeterType3;char TariffType3; S_AcctItemType;11) int InitAreaId()得到某一号码段的 营业区编号(Area_id), 计费类别(billing_type_id), 服务类型(serv_type_id), 用户电话号码(acc_nbr)相关表: serv,exchange使用变量:Lno_head ;影响变量: NbrAreaId操作:SELECT: b.area_id,a.billing_type_id,a
18、.serv_type_id,a.acc_nbr FROM :serv a,exchange b WHERE:acc_nbr BETWEEN Lnohead+0000 AND Lno_head+9999,a.exchange_id=b.exchange_id a.state IN (F0A,F0J,F0K,F0L,F0C) ORDER BY a.acc_nbr相关结构: typedef struct int ServTypeId;int BillingTypeId;int area_id;char AccNbrLEN_TEL_NO; S_AreaId;12) binSearch()输入参数: c
19、onst char AccNbr16 (要查找的电话号码), int high (公用电话号码数组元素个数)相关参数: OutAccArray公用电话判断函数,判断一个号码是否为公用电话;在公用号码数组中搜索 AccNbr, 找到了则返回该号码在数组中的位置, 没找到则返回-1;13) get_rate()通过区号得到相应的费率,tariff_type 和 tariff_id;使用变量: rate (gv)影响变量: b_flag(tariff_type),r_rate(费率),Ltariff_id;通过折半查找法找出区号相对应的费率;如果没有找到,则:rate=default_rate;b_
20、flag=default_tariff_type;Ltariff_id=default_id;其中各种 default 变量根据处理业务的不同从不同的费率表中获得;14) get_rate_value()取得相应时间段的优费费率;使用变量:match_string (用来匹配的字符串) ;TariffTimeSpan.(gv)时段费率数组(by InitTariffTimeSpan();影响变量:rate使用 match_string 和 TariffTimeSpan.time_span_id 相比较,得到费率;15) get_rate_value_public()同 get_rate_val
21、ue, 但使用 TariffTimeSpanPublic.16) get_toll_tariff()获取长途费率;输入参数:start_time(起始时间);使用变量:TimeSpan.(gv), fit_object(gv)影响参数:rate, time_span_flag(确定此项业务的时间临界点是向前计费还是向后计费)if (该话单的 fit_object=timespan.fit_object) and(时间段起始时间start_time时间段中止时间)获取该时间段的 time_span_flag,和 time_span_id;使用 time_span_id 和 fit_object
22、组成 matching_string 格式: ”%04d000%c”call get_rate_value()得到费率;17) get_free()得到长途话单的费率和费用;输入参数:start_time (起始时间),real_timlen(通话时长);使用变量:fit_object(gv);影响参数:rate( 费率),cash_timlen( 费用), count(计费次数);此函数在处理长途话单中使用,对长途的三种情况 IP,无优惠长途,有优惠长途 进行了不同的处理(1)如果 fit_object in (4,A,C,D,E,F,G,H ) 为 IP 长途:count=(real_ti
23、mlen+59)/60;rate=get_toll_tariff(.);cash_timlen=countrate;(2)如果 fit_object = 3 为无时段优惠的国际长途及港澳台长途:count=(real_timlen+5)/6;rate=get_toll_tariff(.);cash_timlen=countrate; (3)如果 fit_object 不为以上情况,则为有优惠的国际国内长途:其中 fit_object 为 1:国内长途;2:14 个地区国际长途;5:港澳台地区长途;8: 暂无;count=(real_timlen+5)/6;采用按每一秒钟的时间求费率的方法确定费
24、率: 将 start_time 转化为 struct tm 结构( 由于 struct tm 中年份表示为 2 位,所以要 tm.tm_year=tm.tm_year-1900),cash_timlen 初值为 0; 将 tm 转化为 14 位时间字符串; call get_toll_tariff(.)得到前一费率和计费方向 1(由于第一次取费率是从start_time 这个时刻取的,所以该费率实际上表示前一秒的费率); timlen-; tm.tm_sec+=6 再 mktime( 根据 5 取出的时间 再 call get_toll_tariff(.)得到当前秒的当前费率和计费方向 2; 如果(前一费率 !=当前费率) 以及 (计费方向 1=2),表示该话单已跨了时段,同时该时段是按前一秒计费,cash_timlen+=前费率;否则表示该话单未跨时段,或者说该话单已跨时段,但是按当前秒计费,cash+=当前费率; 循环到,当(time=0)时结束; 循环结束后如果(timlen%6!=0),则再做一次,处理不足 6 秒补足 6 秒的部分;rate 为最后时段的费率;