set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
-- 存储过程 函数开始
ALTER procedure [dbo].[sp_generate_billing_eod] (
@biller varchar(10), 输入
@EODDate varchar(10), 输入
@result char(200) OUT 输出
) as 存储过程开始
declare @job varchar(20) 定义变量
declare @billingID char(20)
declare @sumpremium decimal(18,2)
declare @cnt int
declare @lastsettledate datetime
declare @effectiveDate datetime
declare @expireDate datetime
declare @effectiveHour int
declare @expireHour int
declare @effectiveDateTemp varchar(20)
declare @expireDateTemp varchar(20)
declare @contractID char(10)
declare @masterPolnum char(10)
declare @nextsettledate datetime
declare @payupperiod int
declare @valid_group_policys int
declare @settleUnit char(2)
set @result = 'EOD failed.' 赋值
set @job = 'EOD BILLING';
--EOD已运行,则不再运行, 查询并赋值
select @cnt = count(1) from t_eod_log where eodtime = @EODDate and jobname = @job;
if @cnt > 0 判断
begin
set @result = @EODDate + ' EOD has runned.'
return
end
set xact_abort on
--事物开始
begin transaction
--记录日志: 开始时间
insert into t_eod_log (eodtime, jobname, starttime, operator) values (@EODDate, @job, getdate(), @biller);
--待处理的团单, 定义一个Cursor for 后面的是为这个Corsor赋值
declare CURSOR_TG_POLICY cursor for
select t.contractid, t.polnum, c.lastsettledate
from t_tg_policy t, t_contract c
where t.contractid = c.contractid
and t.flag in ('A', 'S')
and datediff(day, c.nextsettledate, @EODDate) >= 0
and c.contracttype = 'EBS';
--循环处理每一授权机构 打开一个Cursor
open CURSOR_TG_POLICY
--获取Cursor中的数据到定义的变量中,获取状态会保存在@@FETCH_STATUS中
fetch next from CURSOR_TG_POLICY into @contractID, @masterPolnum, @lastsettledate
--循环开始, do{}while 循环
while @@FETCH_STATUS = 0
begin
--有效分单数大于等于团单要求人数方可结账
select @cnt = count(1)
from t_policy t
where t.status in ('08', '09', '10', '43')
and gtamasterpolnum = @masterPolnum;
--取出团单最小要求人数,缺省为5
select @valid_group_policys = value
from t_sys_parameter
where lower(name) = lower('SizeOfMemberforBatchBilling');
if @valid_group_policys is null
set @valid_group_policys = 5;
if @cnt >= @valid_group_policys
begin
--计算billingID:billType + yyyymmdd + 5位当日顺序号
select @cnt = max(cast(substring(billingID,11,5) as int)) + 1
from t_billing
where billingdate = @EODDate;
if @cnt is NULL
set @cnt = 1
set @billingID = 'EB' + replace(@EODDate, '-','') + substring(ltrim(100000 + @cnt), 2, 5)
--计算保单数和保费
SELECT @cnt = count(1), @sumpremium = sum(t.premium)
FROM t_policy t
where not exists (select 1 from t_billing_policy p where p.polnum = t.polnum)
and t.status = '08'
and t.gtamasterpolnum = @masterPolnum;
--出账单后催款缓冲期
select @payupperiod = payupperiod
from t_billingtime;
--生成账单
--账单开始日为上一结算日 + 1
--如果上一结算日为null,则为合约客户生效日
if (@lastsettledate is null) or (@lastsettledate = '')
select @lastsettledate = effectivedate
from t_contract
where contractid = @contractID;
else
set @lastsettledate = dateadd(day, 1, @lastsettledate)
--可结算分单数量为0不生成账单
if (@cnt <> 0)
begin
insert into t_Billing(billingID, billingDate, status, contractID, masterpolnum, policycount, sumPremium, payupdate, billingfrom, billingto, biller)
values (@billingID, @EODDate, '10', @contractID, @masterPolnum, @cnt, @sumPremium, dateadd(day, @payupperiod, @EODDate), @lastsettledate, @EODDate, @biller);
--记录已生成账单的分单号码
insert into t_billing_policy (billingID, polnum)
select @billingID, p.polnum
from t_policy p
where not exists (select 1 from t_billing_policy b where p.polnum = b.polnum)
and p.status = '08' --已审核
and p.gtamasterpolnum = @masterPolnum;
end;
--更新最后结账日期
update t_contract
set lastsettledate = @EODDate, lastmodifier = @biller
where contractID = @contractID;
--更新最后结账日期,标记老团单为Batch过,不再使用
update t_tg_policy
set lastsettledate = @EODDate,
flag = 'B',
lastupduser = @biller,
lastupddate = getdate()
where polnum = @masterPolnum;
--计算团单生效日期、满期日期
select @effectiveDate = min(effectivedate),
@expireDate = max(dateadd(day, period, effectivedate))
from t_policy
where status in ('08', '09', '10', '43')
and gtamasterpolnum = @masterPolnum;
-- add day2 添加修改HOUR字段(主单小时字段) 20130122 nsnp398 start
set @effectiveDateTemp=substring(convert(varchar(20), @effectiveDate, 120),12,8);
if(@effectiveDateTemp is null or @effectiveDateTemp='' or @effectiveDateTemp='23:59:59')
set @effectiveHour='24';
else
set @effectiveHour=datepart(hh, @effectiveDate);
set @expireDateTemp=substring(convert(varchar(20), @expireDate, 120),12,8);
if(@expireDateTemp is null or @expireDateTemp='' or @expireDateTemp='23:59:59' or (datediff(ss ,'23:00:00',@expireDateTemp)>0 and datediff(ss ,'23:59:59',@expireDateTemp)<=0))
set @expireHour='24'
else
set @expireHour=datepart(hh, @expireDate);
--add 添加修改HOUR字段(主单小时字段 ) day2
--生效日期为空时,更新团单生效日期;
--满期日期为空时,更新团单满期日期
update t_tg_policy
set effectivedate = convert(varchar(10), @effectiveDate, 120),
expiredate = convert(varchar(10), @expireDate, 120),
period = datediff(day, @effectiveDate, @expireDate),
lastupduser = @biller,
-- add day2 添加修改HOUR字段(主单小时字段) 20130122 nsnp398 start
effectiveHour=@effectiveHour,
expireHour=@expireHour,
-- add day2 添加修改HOUR字段(主单小时字段) 20130122 nsnp398 end
lastupddate = getdate()
where (expiredate is null or effectivedate is null or expiredate ='' or effectivedate ='')
and polnum = @masterPolnum;
--生成新团单
insert into t_tg_policy (polnum,contractID,company,city,corpName,flag,status,period,effectivedate, expiredate,effectiveHour,expireHour
,serviceAgent,sscCode,linkman,telephone,zip,address,email,fax,bankCode,bankName,bankAccount
,memberConstitute,memberCount,discountRate,allowaddmember, signDate, createDate,createUser,lastUpdDate,lastUpdUser)
select (select 'TG' + cast((max(cast(substring(polnum,3,8) as bigint)) + 1) as char(8))
from t_tg_policy
where company = (select company from t_contract where contractid = @contractID))
, t.contractID, t.company, t.city, t.corpName, 'A','00', 0, '', '', 24, 24
, t.serviceagent, a.ssccode, t.linkman, t.telephone, t.zip, t.address, t.email, t.fax, t.bankcode, t.bankname, t.bankaccount, 0, 0
, t.discountrate, 1, dateadd(day, 1, @EODDate), getdate(), @biller, getdate(), @biller
from t_contract t, t_agent a
where t.serviceagent = a.code
and t.company = a.company
and t.contractid = @contractID;
end
--更新下一次结算日
--结算周期单位为天,则为下一结算日 + 结算周期
select @effectivedate = effectivedate,
@settleUnit = settleunit,
@nextsettledate = case settleunit
when '天' then dateadd(day, settleperiod, @EODDate)
when '月' then dateadd(day, -1, dateadd(month, settleperiod + datediff(month, dateadd(day, -1, effectivedate), nextsettledate), effectivedate))
end
from t_contract
where contractid = @contractID;
update t_contract
set nextsettledate = @nextsettledate, lastmodifier = @biller
from t_contract
where contractID = @contractID;
--处理下一个授权机构,再次从Cursor里面获取一个数据到定义的变量中 获取状态会保存在@@FETCH_STATUS中
fetch next from CURSOR_TG_POLICY into @contractID, @masterPolnum, @lastsettledate
end
--回收Cursor空间
close CURSOR_TG_POLICY
deallocate CURSOR_TG_POLICY
--记录日志 - 任务结束
update t_eod_log set endtime = getdate() where seqno = (select max(seqno) from t_eod_log where jobname = @job and eodtime = @EODDate);
set @result = 'EOD of ' + @EODDate + ' success.'
--提交事物
commit transaction